mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-06 11:51:45 +08:00
Add stmmac for 6.4.0
This commit is contained in:
@@ -24,97 +24,192 @@ include $(top_srcdir)/Makefile.kbuild
|
||||
EXTRA_DIST = \
|
||||
chain_mode-6.1-ethercat.c \
|
||||
chain_mode-6.1-orig.c \
|
||||
chain_mode-6.4-ethercat.c \
|
||||
chain_mode-6.4-orig.c \
|
||||
common-6.1-ethercat.h \
|
||||
common-6.1-orig.h \
|
||||
common-6.4-ethercat.h \
|
||||
common-6.4-orig.h \
|
||||
descs-6.1-ethercat.h \
|
||||
descs-6.1-orig.h \
|
||||
descs-6.4-ethercat.h \
|
||||
descs-6.4-orig.h \
|
||||
descs_com-6.1-ethercat.h \
|
||||
descs_com-6.1-orig.h \
|
||||
descs_com-6.4-ethercat.h \
|
||||
descs_com-6.4-orig.h \
|
||||
dwmac1000-6.1-ethercat.h \
|
||||
dwmac1000-6.1-orig.h \
|
||||
dwmac1000-6.4-ethercat.h \
|
||||
dwmac1000-6.4-orig.h \
|
||||
dwmac1000_core-6.1-ethercat.c \
|
||||
dwmac1000_core-6.1-orig.c \
|
||||
dwmac1000_core-6.4-ethercat.c \
|
||||
dwmac1000_core-6.4-orig.c \
|
||||
dwmac1000_dma-6.1-ethercat.c \
|
||||
dwmac1000_dma-6.1-orig.c \
|
||||
dwmac1000_dma-6.4-ethercat.c \
|
||||
dwmac1000_dma-6.4-orig.c \
|
||||
dwmac100-6.1-ethercat.h \
|
||||
dwmac100-6.1-orig.h \
|
||||
dwmac100-6.4-ethercat.h \
|
||||
dwmac100-6.4-orig.h \
|
||||
dwmac100_core-6.1-ethercat.c \
|
||||
dwmac100_core-6.1-orig.c \
|
||||
dwmac100_core-6.4-ethercat.c \
|
||||
dwmac100_core-6.4-orig.c \
|
||||
dwmac100_dma-6.1-ethercat.c \
|
||||
dwmac100_dma-6.1-orig.c \
|
||||
dwmac100_dma-6.4-ethercat.c \
|
||||
dwmac100_dma-6.4-orig.c \
|
||||
dwmac4-6.1-ethercat.h \
|
||||
dwmac4-6.1-orig.h \
|
||||
dwmac4-6.4-ethercat.h \
|
||||
dwmac4-6.4-orig.h \
|
||||
dwmac4_core-6.1-ethercat.c \
|
||||
dwmac4_core-6.1-orig.c \
|
||||
dwmac4_core-6.4-ethercat.c \
|
||||
dwmac4_core-6.4-orig.c \
|
||||
dwmac4_descs-6.1-ethercat.c \
|
||||
dwmac4_descs-6.1-ethercat.h \
|
||||
dwmac4_descs-6.1-orig.c \
|
||||
dwmac4_descs-6.1-orig.h \
|
||||
dwmac4_descs-6.4-ethercat.c \
|
||||
dwmac4_descs-6.4-ethercat.h \
|
||||
dwmac4_descs-6.4-orig.c \
|
||||
dwmac4_descs-6.4-orig.h \
|
||||
dwmac4_dma-6.1-ethercat.c \
|
||||
dwmac4_dma-6.1-ethercat.h \
|
||||
dwmac4_dma-6.1-orig.c \
|
||||
dwmac4_dma-6.1-orig.h \
|
||||
dwmac4_dma-6.4-ethercat.c \
|
||||
dwmac4_dma-6.4-ethercat.h \
|
||||
dwmac4_dma-6.4-orig.c \
|
||||
dwmac4_dma-6.4-orig.h \
|
||||
dwmac4_lib-6.1-ethercat.c \
|
||||
dwmac4_lib-6.1-orig.c \
|
||||
dwmac4_lib-6.4-ethercat.c \
|
||||
dwmac4_lib-6.4-orig.c \
|
||||
dwmac5-6.1-ethercat.c \
|
||||
dwmac5-6.1-ethercat.h \
|
||||
dwmac5-6.1-orig.c \
|
||||
dwmac5-6.1-orig.h \
|
||||
dwmac5-6.4-ethercat.c \
|
||||
dwmac5-6.4-ethercat.h \
|
||||
dwmac5-6.4-orig.c \
|
||||
dwmac5-6.4-orig.h \
|
||||
dwmac_dma-6.1-ethercat.h \
|
||||
dwmac_dma-6.1-orig.h \
|
||||
dwmac_dma-6.4-ethercat.h \
|
||||
dwmac_dma-6.4-orig.h \
|
||||
dwmac-intel-6.1-ethercat.c \
|
||||
dwmac-intel-6.1-ethercat.h \
|
||||
dwmac-intel-6.1-orig.c \
|
||||
dwmac-intel-6.1-orig.h \
|
||||
dwmac-intel-6.4-ethercat.c \
|
||||
dwmac-intel-6.4-ethercat.h \
|
||||
dwmac-intel-6.4-orig.c \
|
||||
dwmac-intel-6.4-orig.h \
|
||||
dwmac_lib-6.1-ethercat.c \
|
||||
dwmac_lib-6.1-orig.c \
|
||||
dwmac_lib-6.4-ethercat.c \
|
||||
dwmac_lib-6.4-orig.c \
|
||||
dwxgmac2-6.1-ethercat.h \
|
||||
dwxgmac2-6.1-orig.h \
|
||||
dwxgmac2-6.4-ethercat.h \
|
||||
dwxgmac2-6.4-orig.h \
|
||||
dwxgmac2_core-6.1-ethercat.c \
|
||||
dwxgmac2_core-6.1-orig.c \
|
||||
dwxgmac2_core-6.4-ethercat.c \
|
||||
dwxgmac2_core-6.4-orig.c \
|
||||
dwxgmac2_descs-6.1-ethercat.c \
|
||||
dwxgmac2_descs-6.1-orig.c \
|
||||
dwxgmac2_descs-6.4-ethercat.c \
|
||||
dwxgmac2_descs-6.4-orig.c \
|
||||
dwxgmac2_dma-6.1-ethercat.c \
|
||||
dwxgmac2_dma-6.1-orig.c \
|
||||
dwxgmac2_dma-6.4-ethercat.c \
|
||||
dwxgmac2_dma-6.4-orig.c \
|
||||
dwxlgmac2-6.1-ethercat.h \
|
||||
dwxlgmac2-6.1-orig.h \
|
||||
dwxlgmac2-6.4-ethercat.h \
|
||||
dwxlgmac2-6.4-orig.h \
|
||||
enh_desc-6.1-ethercat.c \
|
||||
enh_desc-6.1-orig.c \
|
||||
enh_desc-6.4-ethercat.c \
|
||||
enh_desc-6.4-orig.c \
|
||||
hwif-6.1-ethercat.c \
|
||||
hwif-6.1-ethercat.h \
|
||||
hwif-6.1-orig.c \
|
||||
hwif-6.1-orig.h \
|
||||
hwif-6.4-ethercat.c \
|
||||
hwif-6.4-ethercat.h \
|
||||
hwif-6.4-orig.c \
|
||||
hwif-6.4-orig.h \
|
||||
mmc-6.1-ethercat.h \
|
||||
mmc-6.1-orig.h \
|
||||
mmc-6.4-ethercat.h \
|
||||
mmc-6.4-orig.h \
|
||||
mmc_core-6.1-ethercat.c \
|
||||
mmc_core-6.1-orig.c \
|
||||
mmc_core-6.4-ethercat.c \
|
||||
mmc_core-6.4-orig.c \
|
||||
norm_desc-6.1-ethercat.c \
|
||||
norm_desc-6.1-orig.c \
|
||||
norm_desc-6.4-ethercat.c \
|
||||
norm_desc-6.4-orig.c \
|
||||
ring_mode-6.1-ethercat.c \
|
||||
ring_mode-6.1-orig.c \
|
||||
ring_mode-6.4-ethercat.c \
|
||||
ring_mode-6.4-orig.c \
|
||||
stmmac-6.1-ethercat.h \
|
||||
stmmac-6.1-orig.h \
|
||||
stmmac-6.4-ethercat.h \
|
||||
stmmac-6.4-orig.h \
|
||||
stmmac_ethtool-6.1-ethercat.c \
|
||||
stmmac_ethtool-6.1-orig.c \
|
||||
stmmac_ethtool-6.4-ethercat.c \
|
||||
stmmac_ethtool-6.4-orig.c \
|
||||
stmmac_hwtstamp-6.1-ethercat.c \
|
||||
stmmac_hwtstamp-6.1-orig.c \
|
||||
stmmac_hwtstamp-6.4-ethercat.c \
|
||||
stmmac_hwtstamp-6.4-orig.c \
|
||||
stmmac_main-6.1-ethercat.c \
|
||||
stmmac_main-6.1-orig.c \
|
||||
stmmac_main-6.4-ethercat.c \
|
||||
stmmac_main-6.4-orig.c \
|
||||
stmmac_mdio-6.1-ethercat.c \
|
||||
stmmac_mdio-6.1-orig.c \
|
||||
stmmac_mdio-6.4-ethercat.c \
|
||||
stmmac_mdio-6.4-orig.c \
|
||||
stmmac_pci-6.1-ethercat.c \
|
||||
stmmac_pci-6.1-orig.c \
|
||||
stmmac_pci-6.4-ethercat.c \
|
||||
stmmac_pci-6.4-orig.c \
|
||||
stmmac_pcs-6.1-ethercat.h \
|
||||
stmmac_pcs-6.1-orig.h \
|
||||
stmmac_pcs-6.4-ethercat.h \
|
||||
stmmac_pcs-6.4-orig.h \
|
||||
stmmac_ptp-6.1-ethercat.c \
|
||||
stmmac_ptp-6.1-ethercat.h \
|
||||
stmmac_ptp-6.1-orig.c \
|
||||
stmmac_ptp-6.1-orig.h \
|
||||
stmmac_ptp-6.4-ethercat.c \
|
||||
stmmac_ptp-6.4-ethercat.h \
|
||||
stmmac_ptp-6.4-orig.c \
|
||||
stmmac_ptp-6.4-orig.h \
|
||||
stmmac_tc-6.1-ethercat.c \
|
||||
stmmac_tc-6.1-orig.c \
|
||||
stmmac_tc-6.4-ethercat.c \
|
||||
stmmac_tc-6.4-orig.c \
|
||||
stmmac_xdp-6.1-ethercat.c \
|
||||
stmmac_xdp-6.1-ethercat.h \
|
||||
stmmac_xdp-6.1-orig.c \
|
||||
stmmac_xdp-6.1-orig.h
|
||||
stmmac_xdp-6.1-orig.h \
|
||||
stmmac_xdp-6.4-ethercat.c \
|
||||
stmmac_xdp-6.4-ethercat.h \
|
||||
stmmac_xdp-6.4-orig.c \
|
||||
stmmac_xdp-6.4-orig.h \
|
||||
update.sh
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
166
devices/stmmac/chain_mode-6.4-ethercat.c
Normal file
166
devices/stmmac/chain_mode-6.4-ethercat.c
Normal file
@@ -0,0 +1,166 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
Specialised functions for managing Chained mode
|
||||
|
||||
Copyright(C) 2011 STMicroelectronics Ltd
|
||||
|
||||
It defines all the functions used to handle the normal/enhanced
|
||||
descriptors in case of the DMA is configured to work in chained or
|
||||
in ring mode.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include "stmmac-6.4-ethercat.h"
|
||||
|
||||
static int jumbo_frm(struct stmmac_tx_queue *tx_q, struct sk_buff *skb,
|
||||
int csum)
|
||||
{
|
||||
unsigned int nopaged_len = skb_headlen(skb);
|
||||
struct stmmac_priv *priv = tx_q->priv_data;
|
||||
unsigned int entry = tx_q->cur_tx;
|
||||
unsigned int bmax, des2;
|
||||
unsigned int i = 1, len;
|
||||
struct dma_desc *desc;
|
||||
|
||||
desc = tx_q->dma_tx + entry;
|
||||
|
||||
if (priv->plat->enh_desc)
|
||||
bmax = BUF_SIZE_8KiB;
|
||||
else
|
||||
bmax = BUF_SIZE_2KiB;
|
||||
|
||||
len = nopaged_len - bmax;
|
||||
|
||||
des2 = dma_map_single(priv->device, skb->data,
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = bmax;
|
||||
/* do not close the descriptor and do not set own bit */
|
||||
stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, STMMAC_CHAIN_MODE,
|
||||
0, false, skb->len);
|
||||
|
||||
while (len != 0) {
|
||||
tx_q->tx_skbuff[entry] = NULL;
|
||||
entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size);
|
||||
desc = tx_q->dma_tx + entry;
|
||||
|
||||
if (len > bmax) {
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i),
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = bmax;
|
||||
stmmac_prepare_tx_desc(priv, desc, 0, bmax, csum,
|
||||
STMMAC_CHAIN_MODE, 1, false, skb->len);
|
||||
len -= bmax;
|
||||
i++;
|
||||
} else {
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i), len,
|
||||
DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = len;
|
||||
/* last descriptor can be set now */
|
||||
stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
|
||||
STMMAC_CHAIN_MODE, 1, true, skb->len);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
tx_q->cur_tx = entry;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
static unsigned int is_jumbo_frm(int len, int enh_desc)
|
||||
{
|
||||
unsigned int ret = 0;
|
||||
|
||||
if ((enh_desc && (len > BUF_SIZE_8KiB)) ||
|
||||
(!enh_desc && (len > BUF_SIZE_2KiB))) {
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void init_dma_chain(void *des, dma_addr_t phy_addr,
|
||||
unsigned int size, unsigned int extend_desc)
|
||||
{
|
||||
/*
|
||||
* In chained mode the des3 points to the next element in the ring.
|
||||
* The latest element has to point to the head.
|
||||
*/
|
||||
int i;
|
||||
dma_addr_t dma_phy = phy_addr;
|
||||
|
||||
if (extend_desc) {
|
||||
struct dma_extended_desc *p = (struct dma_extended_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_extended_desc);
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
|
||||
} else {
|
||||
struct dma_desc *p = (struct dma_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_desc);
|
||||
p->des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void refill_desc3(struct stmmac_rx_queue *rx_q, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_priv *priv = rx_q->priv_data;
|
||||
|
||||
if (priv->hwts_rx_en && !priv->extend_desc)
|
||||
/* NOTE: Device will overwrite des3 with timestamp value if
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = cpu_to_le32((unsigned int)(rx_q->dma_rx_phy +
|
||||
(((rx_q->dirty_rx) + 1) %
|
||||
priv->dma_conf.dma_rx_size) *
|
||||
sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
static void clean_desc3(struct stmmac_tx_queue *tx_q, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_priv *priv = tx_q->priv_data;
|
||||
unsigned int entry = tx_q->dirty_tx;
|
||||
|
||||
if (tx_q->tx_skbuff_dma[entry].last_segment && !priv->extend_desc &&
|
||||
priv->hwts_tx_en)
|
||||
/* NOTE: Device will overwrite des3 with timestamp value if
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = cpu_to_le32((unsigned int)((tx_q->dma_tx_phy +
|
||||
((tx_q->dirty_tx + 1) %
|
||||
priv->dma_conf.dma_tx_size))
|
||||
* sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
const struct stmmac_mode_ops chain_mode_ops = {
|
||||
.init = init_dma_chain,
|
||||
.is_jumbo_frm = is_jumbo_frm,
|
||||
.jumbo_frm = jumbo_frm,
|
||||
.refill_desc3 = refill_desc3,
|
||||
.clean_desc3 = clean_desc3,
|
||||
};
|
||||
166
devices/stmmac/chain_mode-6.4-orig.c
Normal file
166
devices/stmmac/chain_mode-6.4-orig.c
Normal file
@@ -0,0 +1,166 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
Specialised functions for managing Chained mode
|
||||
|
||||
Copyright(C) 2011 STMicroelectronics Ltd
|
||||
|
||||
It defines all the functions used to handle the normal/enhanced
|
||||
descriptors in case of the DMA is configured to work in chained or
|
||||
in ring mode.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include "stmmac.h"
|
||||
|
||||
static int jumbo_frm(struct stmmac_tx_queue *tx_q, struct sk_buff *skb,
|
||||
int csum)
|
||||
{
|
||||
unsigned int nopaged_len = skb_headlen(skb);
|
||||
struct stmmac_priv *priv = tx_q->priv_data;
|
||||
unsigned int entry = tx_q->cur_tx;
|
||||
unsigned int bmax, des2;
|
||||
unsigned int i = 1, len;
|
||||
struct dma_desc *desc;
|
||||
|
||||
desc = tx_q->dma_tx + entry;
|
||||
|
||||
if (priv->plat->enh_desc)
|
||||
bmax = BUF_SIZE_8KiB;
|
||||
else
|
||||
bmax = BUF_SIZE_2KiB;
|
||||
|
||||
len = nopaged_len - bmax;
|
||||
|
||||
des2 = dma_map_single(priv->device, skb->data,
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = bmax;
|
||||
/* do not close the descriptor and do not set own bit */
|
||||
stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, STMMAC_CHAIN_MODE,
|
||||
0, false, skb->len);
|
||||
|
||||
while (len != 0) {
|
||||
tx_q->tx_skbuff[entry] = NULL;
|
||||
entry = STMMAC_GET_ENTRY(entry, priv->dma_conf.dma_tx_size);
|
||||
desc = tx_q->dma_tx + entry;
|
||||
|
||||
if (len > bmax) {
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i),
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = bmax;
|
||||
stmmac_prepare_tx_desc(priv, desc, 0, bmax, csum,
|
||||
STMMAC_CHAIN_MODE, 1, false, skb->len);
|
||||
len -= bmax;
|
||||
i++;
|
||||
} else {
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i), len,
|
||||
DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
tx_q->tx_skbuff_dma[entry].buf = des2;
|
||||
tx_q->tx_skbuff_dma[entry].len = len;
|
||||
/* last descriptor can be set now */
|
||||
stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
|
||||
STMMAC_CHAIN_MODE, 1, true, skb->len);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
tx_q->cur_tx = entry;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
static unsigned int is_jumbo_frm(int len, int enh_desc)
|
||||
{
|
||||
unsigned int ret = 0;
|
||||
|
||||
if ((enh_desc && (len > BUF_SIZE_8KiB)) ||
|
||||
(!enh_desc && (len > BUF_SIZE_2KiB))) {
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void init_dma_chain(void *des, dma_addr_t phy_addr,
|
||||
unsigned int size, unsigned int extend_desc)
|
||||
{
|
||||
/*
|
||||
* In chained mode the des3 points to the next element in the ring.
|
||||
* The latest element has to point to the head.
|
||||
*/
|
||||
int i;
|
||||
dma_addr_t dma_phy = phy_addr;
|
||||
|
||||
if (extend_desc) {
|
||||
struct dma_extended_desc *p = (struct dma_extended_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_extended_desc);
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
|
||||
} else {
|
||||
struct dma_desc *p = (struct dma_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_desc);
|
||||
p->des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void refill_desc3(struct stmmac_rx_queue *rx_q, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_priv *priv = rx_q->priv_data;
|
||||
|
||||
if (priv->hwts_rx_en && !priv->extend_desc)
|
||||
/* NOTE: Device will overwrite des3 with timestamp value if
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = cpu_to_le32((unsigned int)(rx_q->dma_rx_phy +
|
||||
(((rx_q->dirty_rx) + 1) %
|
||||
priv->dma_conf.dma_rx_size) *
|
||||
sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
static void clean_desc3(struct stmmac_tx_queue *tx_q, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_priv *priv = tx_q->priv_data;
|
||||
unsigned int entry = tx_q->dirty_tx;
|
||||
|
||||
if (tx_q->tx_skbuff_dma[entry].last_segment && !priv->extend_desc &&
|
||||
priv->hwts_tx_en)
|
||||
/* NOTE: Device will overwrite des3 with timestamp value if
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = cpu_to_le32((unsigned int)((tx_q->dma_tx_phy +
|
||||
((tx_q->dirty_tx + 1) %
|
||||
priv->dma_conf.dma_tx_size))
|
||||
* sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
const struct stmmac_mode_ops chain_mode_ops = {
|
||||
.init = init_dma_chain,
|
||||
.is_jumbo_frm = is_jumbo_frm,
|
||||
.jumbo_frm = jumbo_frm,
|
||||
.refill_desc3 = refill_desc3,
|
||||
.clean_desc3 = clean_desc3,
|
||||
};
|
||||
567
devices/stmmac/common-6.4-ethercat.h
Normal file
567
devices/stmmac/common-6.4-ethercat.h
Normal file
File diff suppressed because it is too large
Load Diff
568
devices/stmmac/common-6.4-orig.h
Normal file
568
devices/stmmac/common-6.4-orig.h
Normal file
File diff suppressed because it is too large
Load Diff
186
devices/stmmac/descs-6.4-ethercat.h
Normal file
186
devices/stmmac/descs-6.4-ethercat.h
Normal file
@@ -0,0 +1,186 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Header File to describe the DMA descriptors and related definitions.
|
||||
This is for DWMAC100 and 1000 cores.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DESCS_H__
|
||||
#define __DESCS_H__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* Normal receive descriptor defines */
|
||||
|
||||
/* RDES0 */
|
||||
#define RDES0_PAYLOAD_CSUM_ERR BIT(0)
|
||||
#define RDES0_CRC_ERROR BIT(1)
|
||||
#define RDES0_DRIBBLING BIT(2)
|
||||
#define RDES0_MII_ERROR BIT(3)
|
||||
#define RDES0_RECEIVE_WATCHDOG BIT(4)
|
||||
#define RDES0_FRAME_TYPE BIT(5)
|
||||
#define RDES0_COLLISION BIT(6)
|
||||
#define RDES0_IPC_CSUM_ERROR BIT(7)
|
||||
#define RDES0_LAST_DESCRIPTOR BIT(8)
|
||||
#define RDES0_FIRST_DESCRIPTOR BIT(9)
|
||||
#define RDES0_VLAN_TAG BIT(10)
|
||||
#define RDES0_OVERFLOW_ERROR BIT(11)
|
||||
#define RDES0_LENGTH_ERROR BIT(12)
|
||||
#define RDES0_SA_FILTER_FAIL BIT(13)
|
||||
#define RDES0_DESCRIPTOR_ERROR BIT(14)
|
||||
#define RDES0_ERROR_SUMMARY BIT(15)
|
||||
#define RDES0_FRAME_LEN_MASK GENMASK(29, 16)
|
||||
#define RDES0_FRAME_LEN_SHIFT 16
|
||||
#define RDES0_DA_FILTER_FAIL BIT(30)
|
||||
#define RDES0_OWN BIT(31)
|
||||
/* RDES1 */
|
||||
#define RDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
|
||||
#define RDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
|
||||
#define RDES1_BUFFER2_SIZE_SHIFT 11
|
||||
#define RDES1_SECOND_ADDRESS_CHAINED BIT(24)
|
||||
#define RDES1_END_RING BIT(25)
|
||||
#define RDES1_DISABLE_IC BIT(31)
|
||||
|
||||
/* Enhanced receive descriptor defines */
|
||||
|
||||
/* RDES0 (similar to normal RDES) */
|
||||
#define ERDES0_RX_MAC_ADDR BIT(0)
|
||||
|
||||
/* RDES1: completely differ from normal desc definitions */
|
||||
#define ERDES1_BUFFER1_SIZE_MASK GENMASK(12, 0)
|
||||
#define ERDES1_SECOND_ADDRESS_CHAINED BIT(14)
|
||||
#define ERDES1_END_RING BIT(15)
|
||||
#define ERDES1_BUFFER2_SIZE_MASK GENMASK(28, 16)
|
||||
#define ERDES1_BUFFER2_SIZE_SHIFT 16
|
||||
#define ERDES1_DISABLE_IC BIT(31)
|
||||
|
||||
/* Normal transmit descriptor defines */
|
||||
/* TDES0 */
|
||||
#define TDES0_DEFERRED BIT(0)
|
||||
#define TDES0_UNDERFLOW_ERROR BIT(1)
|
||||
#define TDES0_EXCESSIVE_DEFERRAL BIT(2)
|
||||
#define TDES0_COLLISION_COUNT_MASK GENMASK(6, 3)
|
||||
#define TDES0_VLAN_FRAME BIT(7)
|
||||
#define TDES0_EXCESSIVE_COLLISIONS BIT(8)
|
||||
#define TDES0_LATE_COLLISION BIT(9)
|
||||
#define TDES0_NO_CARRIER BIT(10)
|
||||
#define TDES0_LOSS_CARRIER BIT(11)
|
||||
#define TDES0_PAYLOAD_ERROR BIT(12)
|
||||
#define TDES0_FRAME_FLUSHED BIT(13)
|
||||
#define TDES0_JABBER_TIMEOUT BIT(14)
|
||||
#define TDES0_ERROR_SUMMARY BIT(15)
|
||||
#define TDES0_IP_HEADER_ERROR BIT(16)
|
||||
#define TDES0_TIME_STAMP_STATUS BIT(17)
|
||||
#define TDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define TDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
|
||||
#define TDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
|
||||
#define TDES1_BUFFER2_SIZE_SHIFT 11
|
||||
#define TDES1_TIME_STAMP_ENABLE BIT(22)
|
||||
#define TDES1_DISABLE_PADDING BIT(23)
|
||||
#define TDES1_SECOND_ADDRESS_CHAINED BIT(24)
|
||||
#define TDES1_END_RING BIT(25)
|
||||
#define TDES1_CRC_DISABLE BIT(26)
|
||||
#define TDES1_CHECKSUM_INSERTION_MASK GENMASK(28, 27)
|
||||
#define TDES1_CHECKSUM_INSERTION_SHIFT 27
|
||||
#define TDES1_FIRST_SEGMENT BIT(29)
|
||||
#define TDES1_LAST_SEGMENT BIT(30)
|
||||
#define TDES1_INTERRUPT BIT(31)
|
||||
|
||||
/* Enhanced transmit descriptor defines */
|
||||
/* TDES0 */
|
||||
#define ETDES0_DEFERRED BIT(0)
|
||||
#define ETDES0_UNDERFLOW_ERROR BIT(1)
|
||||
#define ETDES0_EXCESSIVE_DEFERRAL BIT(2)
|
||||
#define ETDES0_COLLISION_COUNT_MASK GENMASK(6, 3)
|
||||
#define ETDES0_VLAN_FRAME BIT(7)
|
||||
#define ETDES0_EXCESSIVE_COLLISIONS BIT(8)
|
||||
#define ETDES0_LATE_COLLISION BIT(9)
|
||||
#define ETDES0_NO_CARRIER BIT(10)
|
||||
#define ETDES0_LOSS_CARRIER BIT(11)
|
||||
#define ETDES0_PAYLOAD_ERROR BIT(12)
|
||||
#define ETDES0_FRAME_FLUSHED BIT(13)
|
||||
#define ETDES0_JABBER_TIMEOUT BIT(14)
|
||||
#define ETDES0_ERROR_SUMMARY BIT(15)
|
||||
#define ETDES0_IP_HEADER_ERROR BIT(16)
|
||||
#define ETDES0_TIME_STAMP_STATUS BIT(17)
|
||||
#define ETDES0_SECOND_ADDRESS_CHAINED BIT(20)
|
||||
#define ETDES0_END_RING BIT(21)
|
||||
#define ETDES0_CHECKSUM_INSERTION_MASK GENMASK(23, 22)
|
||||
#define ETDES0_CHECKSUM_INSERTION_SHIFT 22
|
||||
#define ETDES0_TIME_STAMP_ENABLE BIT(25)
|
||||
#define ETDES0_DISABLE_PADDING BIT(26)
|
||||
#define ETDES0_CRC_DISABLE BIT(27)
|
||||
#define ETDES0_FIRST_SEGMENT BIT(28)
|
||||
#define ETDES0_LAST_SEGMENT BIT(29)
|
||||
#define ETDES0_INTERRUPT BIT(30)
|
||||
#define ETDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define ETDES1_BUFFER1_SIZE_MASK GENMASK(12, 0)
|
||||
#define ETDES1_BUFFER2_SIZE_MASK GENMASK(28, 16)
|
||||
#define ETDES1_BUFFER2_SIZE_SHIFT 16
|
||||
|
||||
/* Extended Receive descriptor definitions */
|
||||
#define ERDES4_IP_PAYLOAD_TYPE_MASK GENMASK(6, 2)
|
||||
#define ERDES4_IP_HDR_ERR BIT(3)
|
||||
#define ERDES4_IP_PAYLOAD_ERR BIT(4)
|
||||
#define ERDES4_IP_CSUM_BYPASSED BIT(5)
|
||||
#define ERDES4_IPV4_PKT_RCVD BIT(6)
|
||||
#define ERDES4_IPV6_PKT_RCVD BIT(7)
|
||||
#define ERDES4_MSG_TYPE_MASK GENMASK(11, 8)
|
||||
#define ERDES4_PTP_FRAME_TYPE BIT(12)
|
||||
#define ERDES4_PTP_VER BIT(13)
|
||||
#define ERDES4_TIMESTAMP_DROPPED BIT(14)
|
||||
#define ERDES4_AV_PKT_RCVD BIT(16)
|
||||
#define ERDES4_AV_TAGGED_PKT_RCVD BIT(17)
|
||||
#define ERDES4_VLAN_TAG_PRI_VAL_MASK GENMASK(20, 18)
|
||||
#define ERDES4_L3_FILTER_MATCH BIT(24)
|
||||
#define ERDES4_L4_FILTER_MATCH BIT(25)
|
||||
#define ERDES4_L3_L4_FILT_NO_MATCH_MASK GENMASK(27, 26)
|
||||
|
||||
/* Extended RDES4 message type definitions */
|
||||
#define RDES_EXT_NO_PTP 0x0
|
||||
#define RDES_EXT_SYNC 0x1
|
||||
#define RDES_EXT_FOLLOW_UP 0x2
|
||||
#define RDES_EXT_DELAY_REQ 0x3
|
||||
#define RDES_EXT_DELAY_RESP 0x4
|
||||
#define RDES_EXT_PDELAY_REQ 0x5
|
||||
#define RDES_EXT_PDELAY_RESP 0x6
|
||||
#define RDES_EXT_PDELAY_FOLLOW_UP 0x7
|
||||
#define RDES_PTP_ANNOUNCE 0x8
|
||||
#define RDES_PTP_MANAGEMENT 0x9
|
||||
#define RDES_PTP_SIGNALING 0xa
|
||||
#define RDES_PTP_PKT_RESERVED_TYPE 0xf
|
||||
|
||||
/* Basic descriptor structure for normal and alternate descriptors */
|
||||
struct dma_desc {
|
||||
__le32 des0;
|
||||
__le32 des1;
|
||||
__le32 des2;
|
||||
__le32 des3;
|
||||
};
|
||||
|
||||
/* Extended descriptor structure (e.g. >= databook 3.50a) */
|
||||
struct dma_extended_desc {
|
||||
struct dma_desc basic; /* Basic descriptors */
|
||||
__le32 des4; /* Extended Status */
|
||||
__le32 des5; /* Reserved */
|
||||
__le32 des6; /* Tx/Rx Timestamp Low */
|
||||
__le32 des7; /* Tx/Rx Timestamp High */
|
||||
};
|
||||
|
||||
/* Enhanced descriptor for TBS */
|
||||
struct dma_edesc {
|
||||
__le32 des4;
|
||||
__le32 des5;
|
||||
__le32 des6;
|
||||
__le32 des7;
|
||||
struct dma_desc basic;
|
||||
};
|
||||
|
||||
/* Transmit checksum insertion control */
|
||||
#define TX_CIC_FULL 3 /* Include IP header and pseudoheader */
|
||||
|
||||
#endif /* __DESCS_H__ */
|
||||
186
devices/stmmac/descs-6.4-orig.h
Normal file
186
devices/stmmac/descs-6.4-orig.h
Normal file
@@ -0,0 +1,186 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Header File to describe the DMA descriptors and related definitions.
|
||||
This is for DWMAC100 and 1000 cores.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DESCS_H__
|
||||
#define __DESCS_H__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* Normal receive descriptor defines */
|
||||
|
||||
/* RDES0 */
|
||||
#define RDES0_PAYLOAD_CSUM_ERR BIT(0)
|
||||
#define RDES0_CRC_ERROR BIT(1)
|
||||
#define RDES0_DRIBBLING BIT(2)
|
||||
#define RDES0_MII_ERROR BIT(3)
|
||||
#define RDES0_RECEIVE_WATCHDOG BIT(4)
|
||||
#define RDES0_FRAME_TYPE BIT(5)
|
||||
#define RDES0_COLLISION BIT(6)
|
||||
#define RDES0_IPC_CSUM_ERROR BIT(7)
|
||||
#define RDES0_LAST_DESCRIPTOR BIT(8)
|
||||
#define RDES0_FIRST_DESCRIPTOR BIT(9)
|
||||
#define RDES0_VLAN_TAG BIT(10)
|
||||
#define RDES0_OVERFLOW_ERROR BIT(11)
|
||||
#define RDES0_LENGTH_ERROR BIT(12)
|
||||
#define RDES0_SA_FILTER_FAIL BIT(13)
|
||||
#define RDES0_DESCRIPTOR_ERROR BIT(14)
|
||||
#define RDES0_ERROR_SUMMARY BIT(15)
|
||||
#define RDES0_FRAME_LEN_MASK GENMASK(29, 16)
|
||||
#define RDES0_FRAME_LEN_SHIFT 16
|
||||
#define RDES0_DA_FILTER_FAIL BIT(30)
|
||||
#define RDES0_OWN BIT(31)
|
||||
/* RDES1 */
|
||||
#define RDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
|
||||
#define RDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
|
||||
#define RDES1_BUFFER2_SIZE_SHIFT 11
|
||||
#define RDES1_SECOND_ADDRESS_CHAINED BIT(24)
|
||||
#define RDES1_END_RING BIT(25)
|
||||
#define RDES1_DISABLE_IC BIT(31)
|
||||
|
||||
/* Enhanced receive descriptor defines */
|
||||
|
||||
/* RDES0 (similar to normal RDES) */
|
||||
#define ERDES0_RX_MAC_ADDR BIT(0)
|
||||
|
||||
/* RDES1: completely differ from normal desc definitions */
|
||||
#define ERDES1_BUFFER1_SIZE_MASK GENMASK(12, 0)
|
||||
#define ERDES1_SECOND_ADDRESS_CHAINED BIT(14)
|
||||
#define ERDES1_END_RING BIT(15)
|
||||
#define ERDES1_BUFFER2_SIZE_MASK GENMASK(28, 16)
|
||||
#define ERDES1_BUFFER2_SIZE_SHIFT 16
|
||||
#define ERDES1_DISABLE_IC BIT(31)
|
||||
|
||||
/* Normal transmit descriptor defines */
|
||||
/* TDES0 */
|
||||
#define TDES0_DEFERRED BIT(0)
|
||||
#define TDES0_UNDERFLOW_ERROR BIT(1)
|
||||
#define TDES0_EXCESSIVE_DEFERRAL BIT(2)
|
||||
#define TDES0_COLLISION_COUNT_MASK GENMASK(6, 3)
|
||||
#define TDES0_VLAN_FRAME BIT(7)
|
||||
#define TDES0_EXCESSIVE_COLLISIONS BIT(8)
|
||||
#define TDES0_LATE_COLLISION BIT(9)
|
||||
#define TDES0_NO_CARRIER BIT(10)
|
||||
#define TDES0_LOSS_CARRIER BIT(11)
|
||||
#define TDES0_PAYLOAD_ERROR BIT(12)
|
||||
#define TDES0_FRAME_FLUSHED BIT(13)
|
||||
#define TDES0_JABBER_TIMEOUT BIT(14)
|
||||
#define TDES0_ERROR_SUMMARY BIT(15)
|
||||
#define TDES0_IP_HEADER_ERROR BIT(16)
|
||||
#define TDES0_TIME_STAMP_STATUS BIT(17)
|
||||
#define TDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define TDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
|
||||
#define TDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
|
||||
#define TDES1_BUFFER2_SIZE_SHIFT 11
|
||||
#define TDES1_TIME_STAMP_ENABLE BIT(22)
|
||||
#define TDES1_DISABLE_PADDING BIT(23)
|
||||
#define TDES1_SECOND_ADDRESS_CHAINED BIT(24)
|
||||
#define TDES1_END_RING BIT(25)
|
||||
#define TDES1_CRC_DISABLE BIT(26)
|
||||
#define TDES1_CHECKSUM_INSERTION_MASK GENMASK(28, 27)
|
||||
#define TDES1_CHECKSUM_INSERTION_SHIFT 27
|
||||
#define TDES1_FIRST_SEGMENT BIT(29)
|
||||
#define TDES1_LAST_SEGMENT BIT(30)
|
||||
#define TDES1_INTERRUPT BIT(31)
|
||||
|
||||
/* Enhanced transmit descriptor defines */
|
||||
/* TDES0 */
|
||||
#define ETDES0_DEFERRED BIT(0)
|
||||
#define ETDES0_UNDERFLOW_ERROR BIT(1)
|
||||
#define ETDES0_EXCESSIVE_DEFERRAL BIT(2)
|
||||
#define ETDES0_COLLISION_COUNT_MASK GENMASK(6, 3)
|
||||
#define ETDES0_VLAN_FRAME BIT(7)
|
||||
#define ETDES0_EXCESSIVE_COLLISIONS BIT(8)
|
||||
#define ETDES0_LATE_COLLISION BIT(9)
|
||||
#define ETDES0_NO_CARRIER BIT(10)
|
||||
#define ETDES0_LOSS_CARRIER BIT(11)
|
||||
#define ETDES0_PAYLOAD_ERROR BIT(12)
|
||||
#define ETDES0_FRAME_FLUSHED BIT(13)
|
||||
#define ETDES0_JABBER_TIMEOUT BIT(14)
|
||||
#define ETDES0_ERROR_SUMMARY BIT(15)
|
||||
#define ETDES0_IP_HEADER_ERROR BIT(16)
|
||||
#define ETDES0_TIME_STAMP_STATUS BIT(17)
|
||||
#define ETDES0_SECOND_ADDRESS_CHAINED BIT(20)
|
||||
#define ETDES0_END_RING BIT(21)
|
||||
#define ETDES0_CHECKSUM_INSERTION_MASK GENMASK(23, 22)
|
||||
#define ETDES0_CHECKSUM_INSERTION_SHIFT 22
|
||||
#define ETDES0_TIME_STAMP_ENABLE BIT(25)
|
||||
#define ETDES0_DISABLE_PADDING BIT(26)
|
||||
#define ETDES0_CRC_DISABLE BIT(27)
|
||||
#define ETDES0_FIRST_SEGMENT BIT(28)
|
||||
#define ETDES0_LAST_SEGMENT BIT(29)
|
||||
#define ETDES0_INTERRUPT BIT(30)
|
||||
#define ETDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define ETDES1_BUFFER1_SIZE_MASK GENMASK(12, 0)
|
||||
#define ETDES1_BUFFER2_SIZE_MASK GENMASK(28, 16)
|
||||
#define ETDES1_BUFFER2_SIZE_SHIFT 16
|
||||
|
||||
/* Extended Receive descriptor definitions */
|
||||
#define ERDES4_IP_PAYLOAD_TYPE_MASK GENMASK(6, 2)
|
||||
#define ERDES4_IP_HDR_ERR BIT(3)
|
||||
#define ERDES4_IP_PAYLOAD_ERR BIT(4)
|
||||
#define ERDES4_IP_CSUM_BYPASSED BIT(5)
|
||||
#define ERDES4_IPV4_PKT_RCVD BIT(6)
|
||||
#define ERDES4_IPV6_PKT_RCVD BIT(7)
|
||||
#define ERDES4_MSG_TYPE_MASK GENMASK(11, 8)
|
||||
#define ERDES4_PTP_FRAME_TYPE BIT(12)
|
||||
#define ERDES4_PTP_VER BIT(13)
|
||||
#define ERDES4_TIMESTAMP_DROPPED BIT(14)
|
||||
#define ERDES4_AV_PKT_RCVD BIT(16)
|
||||
#define ERDES4_AV_TAGGED_PKT_RCVD BIT(17)
|
||||
#define ERDES4_VLAN_TAG_PRI_VAL_MASK GENMASK(20, 18)
|
||||
#define ERDES4_L3_FILTER_MATCH BIT(24)
|
||||
#define ERDES4_L4_FILTER_MATCH BIT(25)
|
||||
#define ERDES4_L3_L4_FILT_NO_MATCH_MASK GENMASK(27, 26)
|
||||
|
||||
/* Extended RDES4 message type definitions */
|
||||
#define RDES_EXT_NO_PTP 0x0
|
||||
#define RDES_EXT_SYNC 0x1
|
||||
#define RDES_EXT_FOLLOW_UP 0x2
|
||||
#define RDES_EXT_DELAY_REQ 0x3
|
||||
#define RDES_EXT_DELAY_RESP 0x4
|
||||
#define RDES_EXT_PDELAY_REQ 0x5
|
||||
#define RDES_EXT_PDELAY_RESP 0x6
|
||||
#define RDES_EXT_PDELAY_FOLLOW_UP 0x7
|
||||
#define RDES_PTP_ANNOUNCE 0x8
|
||||
#define RDES_PTP_MANAGEMENT 0x9
|
||||
#define RDES_PTP_SIGNALING 0xa
|
||||
#define RDES_PTP_PKT_RESERVED_TYPE 0xf
|
||||
|
||||
/* Basic descriptor structure for normal and alternate descriptors */
|
||||
struct dma_desc {
|
||||
__le32 des0;
|
||||
__le32 des1;
|
||||
__le32 des2;
|
||||
__le32 des3;
|
||||
};
|
||||
|
||||
/* Extended descriptor structure (e.g. >= databook 3.50a) */
|
||||
struct dma_extended_desc {
|
||||
struct dma_desc basic; /* Basic descriptors */
|
||||
__le32 des4; /* Extended Status */
|
||||
__le32 des5; /* Reserved */
|
||||
__le32 des6; /* Tx/Rx Timestamp Low */
|
||||
__le32 des7; /* Tx/Rx Timestamp High */
|
||||
};
|
||||
|
||||
/* Enhanced descriptor for TBS */
|
||||
struct dma_edesc {
|
||||
__le32 des4;
|
||||
__le32 des5;
|
||||
__le32 des6;
|
||||
__le32 des7;
|
||||
struct dma_desc basic;
|
||||
};
|
||||
|
||||
/* Transmit checksum insertion control */
|
||||
#define TX_CIC_FULL 3 /* Include IP header and pseudoheader */
|
||||
|
||||
#endif /* __DESCS_H__ */
|
||||
121
devices/stmmac/descs_com-6.4-ethercat.h
Normal file
121
devices/stmmac/descs_com-6.4-ethercat.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Header File to describe Normal/enhanced descriptor functions used for RING
|
||||
and CHAINED modes.
|
||||
|
||||
Copyright(C) 2011 STMicroelectronics Ltd
|
||||
|
||||
It defines all the functions used to handle the normal/enhanced
|
||||
descriptors in case of the DMA is configured to work in chained or
|
||||
in ring mode.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DESC_COM_H__
|
||||
#define __DESC_COM_H__
|
||||
|
||||
/* Specific functions used for Ring mode */
|
||||
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end,
|
||||
int bfsize)
|
||||
{
|
||||
if (bfsize == BUF_SIZE_16KiB)
|
||||
p->des1 |= cpu_to_le32((BUF_SIZE_8KiB
|
||||
<< ERDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ERDES1_BUFFER2_SIZE_MASK);
|
||||
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(ERDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des0 |= cpu_to_le32(ETDES0_END_RING);
|
||||
else
|
||||
p->des0 &= cpu_to_le32(~ETDES0_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
{
|
||||
if (unlikely(len > BUF_SIZE_4KiB)) {
|
||||
p->des1 |= cpu_to_le32((((len - BUF_SIZE_4KiB)
|
||||
<< ETDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ETDES1_BUFFER2_SIZE_MASK) | (BUF_SIZE_4KiB
|
||||
& ETDES1_BUFFER1_SIZE_MASK));
|
||||
} else
|
||||
p->des1 |= cpu_to_le32((len & ETDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize)
|
||||
{
|
||||
if (bfsize >= BUF_SIZE_2KiB) {
|
||||
int bfsize2;
|
||||
|
||||
bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1);
|
||||
p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT)
|
||||
& RDES1_BUFFER2_SIZE_MASK);
|
||||
}
|
||||
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(RDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void ndesc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(TDES1_END_RING);
|
||||
else
|
||||
p->des1 &= cpu_to_le32(~TDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
{
|
||||
if (unlikely(len > BUF_SIZE_2KiB)) {
|
||||
unsigned int buffer1 = (BUF_SIZE_2KiB - 1)
|
||||
& TDES1_BUFFER1_SIZE_MASK;
|
||||
p->des1 |= cpu_to_le32((((len - buffer1)
|
||||
<< TDES1_BUFFER2_SIZE_SHIFT)
|
||||
& TDES1_BUFFER2_SIZE_MASK) | buffer1);
|
||||
} else
|
||||
p->des1 |= cpu_to_le32((len & TDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Specific functions used for Chain mode */
|
||||
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(ERDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= cpu_to_le32(ETDES0_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(len & ETDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_chain(struct dma_desc *p, int end)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(RDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void ndesc_tx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(TDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(len & TDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
#endif /* __DESC_COM_H__ */
|
||||
121
devices/stmmac/descs_com-6.4-orig.h
Normal file
121
devices/stmmac/descs_com-6.4-orig.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Header File to describe Normal/enhanced descriptor functions used for RING
|
||||
and CHAINED modes.
|
||||
|
||||
Copyright(C) 2011 STMicroelectronics Ltd
|
||||
|
||||
It defines all the functions used to handle the normal/enhanced
|
||||
descriptors in case of the DMA is configured to work in chained or
|
||||
in ring mode.
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DESC_COM_H__
|
||||
#define __DESC_COM_H__
|
||||
|
||||
/* Specific functions used for Ring mode */
|
||||
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end,
|
||||
int bfsize)
|
||||
{
|
||||
if (bfsize == BUF_SIZE_16KiB)
|
||||
p->des1 |= cpu_to_le32((BUF_SIZE_8KiB
|
||||
<< ERDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ERDES1_BUFFER2_SIZE_MASK);
|
||||
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(ERDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des0 |= cpu_to_le32(ETDES0_END_RING);
|
||||
else
|
||||
p->des0 &= cpu_to_le32(~ETDES0_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
{
|
||||
if (unlikely(len > BUF_SIZE_4KiB)) {
|
||||
p->des1 |= cpu_to_le32((((len - BUF_SIZE_4KiB)
|
||||
<< ETDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ETDES1_BUFFER2_SIZE_MASK) | (BUF_SIZE_4KiB
|
||||
& ETDES1_BUFFER1_SIZE_MASK));
|
||||
} else
|
||||
p->des1 |= cpu_to_le32((len & ETDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize)
|
||||
{
|
||||
if (bfsize >= BUF_SIZE_2KiB) {
|
||||
int bfsize2;
|
||||
|
||||
bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1);
|
||||
p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT)
|
||||
& RDES1_BUFFER2_SIZE_MASK);
|
||||
}
|
||||
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(RDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void ndesc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des1 |= cpu_to_le32(TDES1_END_RING);
|
||||
else
|
||||
p->des1 &= cpu_to_le32(~TDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
{
|
||||
if (unlikely(len > BUF_SIZE_2KiB)) {
|
||||
unsigned int buffer1 = (BUF_SIZE_2KiB - 1)
|
||||
& TDES1_BUFFER1_SIZE_MASK;
|
||||
p->des1 |= cpu_to_le32((((len - buffer1)
|
||||
<< TDES1_BUFFER2_SIZE_SHIFT)
|
||||
& TDES1_BUFFER2_SIZE_MASK) | buffer1);
|
||||
} else
|
||||
p->des1 |= cpu_to_le32((len & TDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Specific functions used for Chain mode */
|
||||
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(ERDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= cpu_to_le32(ETDES0_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(len & ETDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_chain(struct dma_desc *p, int end)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(RDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void ndesc_tx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(TDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= cpu_to_le32(len & TDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
#endif /* __DESC_COM_H__ */
|
||||
1262
devices/stmmac/dwmac-intel-6.4-ethercat.c
Normal file
1262
devices/stmmac/dwmac-intel-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
53
devices/stmmac/dwmac-intel-6.4-ethercat.h
Normal file
53
devices/stmmac/dwmac-intel-6.4-ethercat.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (c) 2020, Intel Corporation
|
||||
* DWMAC Intel header file
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC_INTEL_H__
|
||||
#define __DWMAC_INTEL_H__
|
||||
|
||||
#define POLL_DELAY_US 8
|
||||
|
||||
/* SERDES Register */
|
||||
#define SERDES_GCR 0x0 /* Global Conguration */
|
||||
#define SERDES_GSR0 0x5 /* Global Status Reg0 */
|
||||
#define SERDES_GCR0 0xb /* Global Configuration Reg0 */
|
||||
|
||||
/* SERDES defines */
|
||||
#define SERDES_PLL_CLK BIT(0) /* PLL clk valid signal */
|
||||
#define SERDES_PHY_RX_CLK BIT(1) /* PSE SGMII PHY rx clk */
|
||||
#define SERDES_RST BIT(2) /* Serdes Reset */
|
||||
#define SERDES_PWR_ST_MASK GENMASK(6, 4) /* Serdes Power state*/
|
||||
#define SERDES_RATE_MASK GENMASK(9, 8)
|
||||
#define SERDES_PCLK_MASK GENMASK(14, 12) /* PCLK rate to PHY */
|
||||
#define SERDES_LINK_MODE_MASK GENMASK(2, 1)
|
||||
#define SERDES_LINK_MODE_SHIFT 1
|
||||
#define SERDES_PWR_ST_SHIFT 4
|
||||
#define SERDES_PWR_ST_P0 0x0
|
||||
#define SERDES_PWR_ST_P3 0x3
|
||||
#define SERDES_LINK_MODE_2G5 0x3
|
||||
#define SERSED_LINK_MODE_1G 0x2
|
||||
#define SERDES_PCLK_37p5MHZ 0x0
|
||||
#define SERDES_PCLK_70MHZ 0x1
|
||||
#define SERDES_RATE_PCIE_GEN1 0x0
|
||||
#define SERDES_RATE_PCIE_GEN2 0x1
|
||||
#define SERDES_RATE_PCIE_SHIFT 8
|
||||
#define SERDES_PCLK_SHIFT 12
|
||||
|
||||
#define INTEL_MGBE_ADHOC_ADDR 0x15
|
||||
#define INTEL_MGBE_XPCS_ADDR 0x16
|
||||
|
||||
/* Cross-timestamping defines */
|
||||
#define ART_CPUID_LEAF 0x15
|
||||
#define EHL_PSE_ART_MHZ 19200000
|
||||
|
||||
/* Selection for PTP Clock Freq belongs to PSE & PCH GbE */
|
||||
#define PSE_PTP_CLK_FREQ_MASK (GMAC_GPO0 | GMAC_GPO3)
|
||||
#define PSE_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
|
||||
#define PSE_PTP_CLK_FREQ_200MHZ (GMAC_GPO0 | GMAC_GPO3)
|
||||
#define PSE_PTP_CLK_FREQ_256MHZ (0)
|
||||
#define PCH_PTP_CLK_FREQ_MASK (GMAC_GPO0)
|
||||
#define PCH_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
|
||||
#define PCH_PTP_CLK_FREQ_200MHZ (0)
|
||||
|
||||
#endif /* __DWMAC_INTEL_H__ */
|
||||
1241
devices/stmmac/dwmac-intel-6.4-orig.c
Normal file
1241
devices/stmmac/dwmac-intel-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
53
devices/stmmac/dwmac-intel-6.4-orig.h
Normal file
53
devices/stmmac/dwmac-intel-6.4-orig.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (c) 2020, Intel Corporation
|
||||
* DWMAC Intel header file
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC_INTEL_H__
|
||||
#define __DWMAC_INTEL_H__
|
||||
|
||||
#define POLL_DELAY_US 8
|
||||
|
||||
/* SERDES Register */
|
||||
#define SERDES_GCR 0x0 /* Global Conguration */
|
||||
#define SERDES_GSR0 0x5 /* Global Status Reg0 */
|
||||
#define SERDES_GCR0 0xb /* Global Configuration Reg0 */
|
||||
|
||||
/* SERDES defines */
|
||||
#define SERDES_PLL_CLK BIT(0) /* PLL clk valid signal */
|
||||
#define SERDES_PHY_RX_CLK BIT(1) /* PSE SGMII PHY rx clk */
|
||||
#define SERDES_RST BIT(2) /* Serdes Reset */
|
||||
#define SERDES_PWR_ST_MASK GENMASK(6, 4) /* Serdes Power state*/
|
||||
#define SERDES_RATE_MASK GENMASK(9, 8)
|
||||
#define SERDES_PCLK_MASK GENMASK(14, 12) /* PCLK rate to PHY */
|
||||
#define SERDES_LINK_MODE_MASK GENMASK(2, 1)
|
||||
#define SERDES_LINK_MODE_SHIFT 1
|
||||
#define SERDES_PWR_ST_SHIFT 4
|
||||
#define SERDES_PWR_ST_P0 0x0
|
||||
#define SERDES_PWR_ST_P3 0x3
|
||||
#define SERDES_LINK_MODE_2G5 0x3
|
||||
#define SERSED_LINK_MODE_1G 0x2
|
||||
#define SERDES_PCLK_37p5MHZ 0x0
|
||||
#define SERDES_PCLK_70MHZ 0x1
|
||||
#define SERDES_RATE_PCIE_GEN1 0x0
|
||||
#define SERDES_RATE_PCIE_GEN2 0x1
|
||||
#define SERDES_RATE_PCIE_SHIFT 8
|
||||
#define SERDES_PCLK_SHIFT 12
|
||||
|
||||
#define INTEL_MGBE_ADHOC_ADDR 0x15
|
||||
#define INTEL_MGBE_XPCS_ADDR 0x16
|
||||
|
||||
/* Cross-timestamping defines */
|
||||
#define ART_CPUID_LEAF 0x15
|
||||
#define EHL_PSE_ART_MHZ 19200000
|
||||
|
||||
/* Selection for PTP Clock Freq belongs to PSE & PCH GbE */
|
||||
#define PSE_PTP_CLK_FREQ_MASK (GMAC_GPO0 | GMAC_GPO3)
|
||||
#define PSE_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
|
||||
#define PSE_PTP_CLK_FREQ_200MHZ (GMAC_GPO0 | GMAC_GPO3)
|
||||
#define PSE_PTP_CLK_FREQ_256MHZ (0)
|
||||
#define PCH_PTP_CLK_FREQ_MASK (GMAC_GPO0)
|
||||
#define PCH_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
|
||||
#define PCH_PTP_CLK_FREQ_200MHZ (0)
|
||||
|
||||
#endif /* __DWMAC_INTEL_H__ */
|
||||
111
devices/stmmac/dwmac100-6.4-ethercat.h
Normal file
111
devices/stmmac/dwmac100-6.4-ethercat.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
MAC 10/100 Header File
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DWMAC100_H__
|
||||
#define __DWMAC100_H__
|
||||
|
||||
#include <linux/phy.h>
|
||||
#include "common-6.4-ethercat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* MAC BLOCK defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
/* MAC CSR offset */
|
||||
#define MAC_CONTROL 0x00000000 /* MAC Control */
|
||||
#define MAC_ADDR_HIGH 0x00000004 /* MAC Address High */
|
||||
#define MAC_ADDR_LOW 0x00000008 /* MAC Address Low */
|
||||
#define MAC_HASH_HIGH 0x0000000c /* Multicast Hash Table High */
|
||||
#define MAC_HASH_LOW 0x00000010 /* Multicast Hash Table Low */
|
||||
#define MAC_MII_ADDR 0x00000014 /* MII Address */
|
||||
#define MAC_MII_DATA 0x00000018 /* MII Data */
|
||||
#define MAC_FLOW_CTRL 0x0000001c /* Flow Control */
|
||||
#define MAC_VLAN1 0x00000020 /* VLAN1 Tag */
|
||||
#define MAC_VLAN2 0x00000024 /* VLAN2 Tag */
|
||||
|
||||
/* MAC CTRL defines */
|
||||
#define MAC_CONTROL_RA 0x80000000 /* Receive All Mode */
|
||||
#define MAC_CONTROL_BLE 0x40000000 /* Endian Mode */
|
||||
#define MAC_CONTROL_HBD 0x10000000 /* Heartbeat Disable */
|
||||
#define MAC_CONTROL_PS 0x08000000 /* Port Select */
|
||||
#define MAC_CONTROL_DRO 0x00800000 /* Disable Receive Own */
|
||||
#define MAC_CONTROL_EXT_LOOPBACK 0x00400000 /* Reserved (ext loopback?) */
|
||||
#define MAC_CONTROL_OM 0x00200000 /* Loopback Operating Mode */
|
||||
#define MAC_CONTROL_F 0x00100000 /* Full Duplex Mode */
|
||||
#define MAC_CONTROL_PM 0x00080000 /* Pass All Multicast */
|
||||
#define MAC_CONTROL_PR 0x00040000 /* Promiscuous Mode */
|
||||
#define MAC_CONTROL_IF 0x00020000 /* Inverse Filtering */
|
||||
#define MAC_CONTROL_PB 0x00010000 /* Pass Bad Frames */
|
||||
#define MAC_CONTROL_HO 0x00008000 /* Hash Only Filtering Mode */
|
||||
#define MAC_CONTROL_HP 0x00002000 /* Hash/Perfect Filtering Mode */
|
||||
#define MAC_CONTROL_LCC 0x00001000 /* Late Collision Control */
|
||||
#define MAC_CONTROL_DBF 0x00000800 /* Disable Broadcast Frames */
|
||||
#define MAC_CONTROL_DRTY 0x00000400 /* Disable Retry */
|
||||
#define MAC_CONTROL_ASTP 0x00000100 /* Automatic Pad Stripping */
|
||||
#define MAC_CONTROL_BOLMT_10 0x00000000 /* Back Off Limit 10 */
|
||||
#define MAC_CONTROL_BOLMT_8 0x00000040 /* Back Off Limit 8 */
|
||||
#define MAC_CONTROL_BOLMT_4 0x00000080 /* Back Off Limit 4 */
|
||||
#define MAC_CONTROL_BOLMT_1 0x000000c0 /* Back Off Limit 1 */
|
||||
#define MAC_CONTROL_DC 0x00000020 /* Deferral Check */
|
||||
#define MAC_CONTROL_TE 0x00000008 /* Transmitter Enable */
|
||||
#define MAC_CONTROL_RE 0x00000004 /* Receiver Enable */
|
||||
|
||||
#define MAC_CORE_INIT (MAC_CONTROL_HBD)
|
||||
|
||||
/* MAC FLOW CTRL defines */
|
||||
#define MAC_FLOW_CTRL_PT_MASK 0xffff0000 /* Pause Time Mask */
|
||||
#define MAC_FLOW_CTRL_PT_SHIFT 16
|
||||
#define MAC_FLOW_CTRL_PASS 0x00000004 /* Pass Control Frames */
|
||||
#define MAC_FLOW_CTRL_ENABLE 0x00000002 /* Flow Control Enable */
|
||||
#define MAC_FLOW_CTRL_PAUSE 0x00000001 /* Flow Control Busy ... */
|
||||
|
||||
/* MII ADDR defines */
|
||||
#define MAC_MII_ADDR_WRITE 0x00000002 /* MII Write */
|
||||
#define MAC_MII_ADDR_BUSY 0x00000001 /* MII Busy */
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* DMA BLOCK defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_MODE_DBO 0x00100000 /* Descriptor Byte Ordering */
|
||||
#define DMA_BUS_MODE_BLE 0x00000080 /* Big Endian/Little Endian */
|
||||
#define DMA_BUS_MODE_PBL_MASK 0x00003f00 /* Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 8
|
||||
#define DMA_BUS_MODE_DSL_MASK 0x0000007c /* Descriptor Skip Length */
|
||||
#define DMA_BUS_MODE_DSL_SHIFT 2 /* (in DWORDS) */
|
||||
#define DMA_BUS_MODE_BAR_BUS 0x00000002 /* Bar-Bus Arbitration */
|
||||
#define DMA_BUS_MODE_DEFAULT 0x00000000
|
||||
|
||||
/* DMA Control register defines */
|
||||
#define DMA_CONTROL_SF 0x00200000 /* Store And Forward */
|
||||
|
||||
/* Transmit Threshold Control */
|
||||
enum ttc_control {
|
||||
DMA_CONTROL_TTC_DEFAULT = 0x00000000, /* Threshold is 32 DWORDS */
|
||||
DMA_CONTROL_TTC_64 = 0x00004000, /* Threshold is 64 DWORDS */
|
||||
DMA_CONTROL_TTC_128 = 0x00008000, /* Threshold is 128 DWORDS */
|
||||
DMA_CONTROL_TTC_256 = 0x0000c000, /* Threshold is 256 DWORDS */
|
||||
DMA_CONTROL_TTC_18 = 0x00400000, /* Threshold is 18 DWORDS */
|
||||
DMA_CONTROL_TTC_24 = 0x00404000, /* Threshold is 24 DWORDS */
|
||||
DMA_CONTROL_TTC_32 = 0x00408000, /* Threshold is 32 DWORDS */
|
||||
DMA_CONTROL_TTC_40 = 0x0040c000, /* Threshold is 40 DWORDS */
|
||||
DMA_CONTROL_SE = 0x00000008, /* Stop On Empty */
|
||||
DMA_CONTROL_OSF = 0x00000004, /* Operate On 2nd Frame */
|
||||
};
|
||||
|
||||
/* STMAC110 DMA Missed Frame Counter register defines */
|
||||
#define DMA_MISSED_FRAME_OVE 0x10000000 /* FIFO Overflow Overflow */
|
||||
#define DMA_MISSED_FRAME_OVE_CNTR 0x0ffe0000 /* Overflow Frame Counter */
|
||||
#define DMA_MISSED_FRAME_OVE_M 0x00010000 /* Missed Frame Overflow */
|
||||
#define DMA_MISSED_FRAME_M_CNTR 0x0000ffff /* Missed Frame Couinter */
|
||||
|
||||
extern const struct stmmac_dma_ops dwmac100_dma_ops;
|
||||
|
||||
#endif /* __DWMAC100_H__ */
|
||||
111
devices/stmmac/dwmac100-6.4-orig.h
Normal file
111
devices/stmmac/dwmac100-6.4-orig.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
MAC 10/100 Header File
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DWMAC100_H__
|
||||
#define __DWMAC100_H__
|
||||
|
||||
#include <linux/phy.h>
|
||||
#include "common.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* MAC BLOCK defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
/* MAC CSR offset */
|
||||
#define MAC_CONTROL 0x00000000 /* MAC Control */
|
||||
#define MAC_ADDR_HIGH 0x00000004 /* MAC Address High */
|
||||
#define MAC_ADDR_LOW 0x00000008 /* MAC Address Low */
|
||||
#define MAC_HASH_HIGH 0x0000000c /* Multicast Hash Table High */
|
||||
#define MAC_HASH_LOW 0x00000010 /* Multicast Hash Table Low */
|
||||
#define MAC_MII_ADDR 0x00000014 /* MII Address */
|
||||
#define MAC_MII_DATA 0x00000018 /* MII Data */
|
||||
#define MAC_FLOW_CTRL 0x0000001c /* Flow Control */
|
||||
#define MAC_VLAN1 0x00000020 /* VLAN1 Tag */
|
||||
#define MAC_VLAN2 0x00000024 /* VLAN2 Tag */
|
||||
|
||||
/* MAC CTRL defines */
|
||||
#define MAC_CONTROL_RA 0x80000000 /* Receive All Mode */
|
||||
#define MAC_CONTROL_BLE 0x40000000 /* Endian Mode */
|
||||
#define MAC_CONTROL_HBD 0x10000000 /* Heartbeat Disable */
|
||||
#define MAC_CONTROL_PS 0x08000000 /* Port Select */
|
||||
#define MAC_CONTROL_DRO 0x00800000 /* Disable Receive Own */
|
||||
#define MAC_CONTROL_EXT_LOOPBACK 0x00400000 /* Reserved (ext loopback?) */
|
||||
#define MAC_CONTROL_OM 0x00200000 /* Loopback Operating Mode */
|
||||
#define MAC_CONTROL_F 0x00100000 /* Full Duplex Mode */
|
||||
#define MAC_CONTROL_PM 0x00080000 /* Pass All Multicast */
|
||||
#define MAC_CONTROL_PR 0x00040000 /* Promiscuous Mode */
|
||||
#define MAC_CONTROL_IF 0x00020000 /* Inverse Filtering */
|
||||
#define MAC_CONTROL_PB 0x00010000 /* Pass Bad Frames */
|
||||
#define MAC_CONTROL_HO 0x00008000 /* Hash Only Filtering Mode */
|
||||
#define MAC_CONTROL_HP 0x00002000 /* Hash/Perfect Filtering Mode */
|
||||
#define MAC_CONTROL_LCC 0x00001000 /* Late Collision Control */
|
||||
#define MAC_CONTROL_DBF 0x00000800 /* Disable Broadcast Frames */
|
||||
#define MAC_CONTROL_DRTY 0x00000400 /* Disable Retry */
|
||||
#define MAC_CONTROL_ASTP 0x00000100 /* Automatic Pad Stripping */
|
||||
#define MAC_CONTROL_BOLMT_10 0x00000000 /* Back Off Limit 10 */
|
||||
#define MAC_CONTROL_BOLMT_8 0x00000040 /* Back Off Limit 8 */
|
||||
#define MAC_CONTROL_BOLMT_4 0x00000080 /* Back Off Limit 4 */
|
||||
#define MAC_CONTROL_BOLMT_1 0x000000c0 /* Back Off Limit 1 */
|
||||
#define MAC_CONTROL_DC 0x00000020 /* Deferral Check */
|
||||
#define MAC_CONTROL_TE 0x00000008 /* Transmitter Enable */
|
||||
#define MAC_CONTROL_RE 0x00000004 /* Receiver Enable */
|
||||
|
||||
#define MAC_CORE_INIT (MAC_CONTROL_HBD)
|
||||
|
||||
/* MAC FLOW CTRL defines */
|
||||
#define MAC_FLOW_CTRL_PT_MASK 0xffff0000 /* Pause Time Mask */
|
||||
#define MAC_FLOW_CTRL_PT_SHIFT 16
|
||||
#define MAC_FLOW_CTRL_PASS 0x00000004 /* Pass Control Frames */
|
||||
#define MAC_FLOW_CTRL_ENABLE 0x00000002 /* Flow Control Enable */
|
||||
#define MAC_FLOW_CTRL_PAUSE 0x00000001 /* Flow Control Busy ... */
|
||||
|
||||
/* MII ADDR defines */
|
||||
#define MAC_MII_ADDR_WRITE 0x00000002 /* MII Write */
|
||||
#define MAC_MII_ADDR_BUSY 0x00000001 /* MII Busy */
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* DMA BLOCK defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_MODE_DBO 0x00100000 /* Descriptor Byte Ordering */
|
||||
#define DMA_BUS_MODE_BLE 0x00000080 /* Big Endian/Little Endian */
|
||||
#define DMA_BUS_MODE_PBL_MASK 0x00003f00 /* Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 8
|
||||
#define DMA_BUS_MODE_DSL_MASK 0x0000007c /* Descriptor Skip Length */
|
||||
#define DMA_BUS_MODE_DSL_SHIFT 2 /* (in DWORDS) */
|
||||
#define DMA_BUS_MODE_BAR_BUS 0x00000002 /* Bar-Bus Arbitration */
|
||||
#define DMA_BUS_MODE_DEFAULT 0x00000000
|
||||
|
||||
/* DMA Control register defines */
|
||||
#define DMA_CONTROL_SF 0x00200000 /* Store And Forward */
|
||||
|
||||
/* Transmit Threshold Control */
|
||||
enum ttc_control {
|
||||
DMA_CONTROL_TTC_DEFAULT = 0x00000000, /* Threshold is 32 DWORDS */
|
||||
DMA_CONTROL_TTC_64 = 0x00004000, /* Threshold is 64 DWORDS */
|
||||
DMA_CONTROL_TTC_128 = 0x00008000, /* Threshold is 128 DWORDS */
|
||||
DMA_CONTROL_TTC_256 = 0x0000c000, /* Threshold is 256 DWORDS */
|
||||
DMA_CONTROL_TTC_18 = 0x00400000, /* Threshold is 18 DWORDS */
|
||||
DMA_CONTROL_TTC_24 = 0x00404000, /* Threshold is 24 DWORDS */
|
||||
DMA_CONTROL_TTC_32 = 0x00408000, /* Threshold is 32 DWORDS */
|
||||
DMA_CONTROL_TTC_40 = 0x0040c000, /* Threshold is 40 DWORDS */
|
||||
DMA_CONTROL_SE = 0x00000008, /* Stop On Empty */
|
||||
DMA_CONTROL_OSF = 0x00000004, /* Operate On 2nd Frame */
|
||||
};
|
||||
|
||||
/* STMAC110 DMA Missed Frame Counter register defines */
|
||||
#define DMA_MISSED_FRAME_OVE 0x10000000 /* FIFO Overflow Overflow */
|
||||
#define DMA_MISSED_FRAME_OVE_CNTR 0x0ffe0000 /* Overflow Frame Counter */
|
||||
#define DMA_MISSED_FRAME_OVE_M 0x00010000 /* Missed Frame Overflow */
|
||||
#define DMA_MISSED_FRAME_M_CNTR 0x0000ffff /* Missed Frame Couinter */
|
||||
|
||||
extern const struct stmmac_dma_ops dwmac100_dma_ops;
|
||||
|
||||
#endif /* __DWMAC100_H__ */
|
||||
333
devices/stmmac/dwmac1000-6.4-ethercat.h
Normal file
333
devices/stmmac/dwmac1000-6.4-ethercat.h
Normal file
@@ -0,0 +1,333 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
#ifndef __DWMAC1000_H__
|
||||
#define __DWMAC1000_H__
|
||||
|
||||
#include <linux/phy.h>
|
||||
#include "common-6.4-ethercat.h"
|
||||
|
||||
#define GMAC_CONTROL 0x00000000 /* Configuration */
|
||||
#define GMAC_FRAME_FILTER 0x00000004 /* Frame Filter */
|
||||
#define GMAC_HASH_HIGH 0x00000008 /* Multicast Hash Table High */
|
||||
#define GMAC_HASH_LOW 0x0000000c /* Multicast Hash Table Low */
|
||||
#define GMAC_MII_ADDR 0x00000010 /* MII Address */
|
||||
#define GMAC_MII_DATA 0x00000014 /* MII Data */
|
||||
#define GMAC_FLOW_CTRL 0x00000018 /* Flow Control */
|
||||
#define GMAC_VLAN_TAG 0x0000001c /* VLAN Tag */
|
||||
#define GMAC_DEBUG 0x00000024 /* GMAC debug register */
|
||||
#define GMAC_WAKEUP_FILTER 0x00000028 /* Wake-up Frame Filter */
|
||||
|
||||
#define GMAC_INT_STATUS 0x00000038 /* interrupt status register */
|
||||
#define GMAC_INT_STATUS_PMT BIT(3)
|
||||
#define GMAC_INT_STATUS_MMCIS BIT(4)
|
||||
#define GMAC_INT_STATUS_MMCRIS BIT(5)
|
||||
#define GMAC_INT_STATUS_MMCTIS BIT(6)
|
||||
#define GMAC_INT_STATUS_MMCCSUM BIT(7)
|
||||
#define GMAC_INT_STATUS_TSTAMP BIT(9)
|
||||
#define GMAC_INT_STATUS_LPIIS BIT(10)
|
||||
|
||||
/* interrupt mask register */
|
||||
#define GMAC_INT_MASK 0x0000003c
|
||||
#define GMAC_INT_DISABLE_RGMII BIT(0)
|
||||
#define GMAC_INT_DISABLE_PCSLINK BIT(1)
|
||||
#define GMAC_INT_DISABLE_PCSAN BIT(2)
|
||||
#define GMAC_INT_DISABLE_PMT BIT(3)
|
||||
#define GMAC_INT_DISABLE_TIMESTAMP BIT(9)
|
||||
#define GMAC_INT_DISABLE_PCS (GMAC_INT_DISABLE_RGMII | \
|
||||
GMAC_INT_DISABLE_PCSLINK | \
|
||||
GMAC_INT_DISABLE_PCSAN)
|
||||
#define GMAC_INT_DEFAULT_MASK (GMAC_INT_DISABLE_TIMESTAMP | \
|
||||
GMAC_INT_DISABLE_PCS)
|
||||
|
||||
/* PMT Control and Status */
|
||||
#define GMAC_PMT 0x0000002c
|
||||
enum power_event {
|
||||
pointer_reset = 0x80000000,
|
||||
global_unicast = 0x00000200,
|
||||
wake_up_rx_frame = 0x00000040,
|
||||
magic_frame = 0x00000020,
|
||||
wake_up_frame_en = 0x00000004,
|
||||
magic_pkt_en = 0x00000002,
|
||||
power_down = 0x00000001,
|
||||
};
|
||||
|
||||
/* Energy Efficient Ethernet (EEE)
|
||||
*
|
||||
* LPI status, timer and control register offset
|
||||
*/
|
||||
#define LPI_CTRL_STATUS 0x0030
|
||||
#define LPI_TIMER_CTRL 0x0034
|
||||
|
||||
/* LPI control and status defines */
|
||||
#define LPI_CTRL_STATUS_LPITXA 0x00080000 /* Enable LPI TX Automate */
|
||||
#define LPI_CTRL_STATUS_PLSEN 0x00040000 /* Enable PHY Link Status */
|
||||
#define LPI_CTRL_STATUS_PLS 0x00020000 /* PHY Link Status */
|
||||
#define LPI_CTRL_STATUS_LPIEN 0x00010000 /* LPI Enable */
|
||||
#define LPI_CTRL_STATUS_RLPIST 0x00000200 /* Receive LPI state */
|
||||
#define LPI_CTRL_STATUS_TLPIST 0x00000100 /* Transmit LPI state */
|
||||
#define LPI_CTRL_STATUS_RLPIEX 0x00000008 /* Receive LPI Exit */
|
||||
#define LPI_CTRL_STATUS_RLPIEN 0x00000004 /* Receive LPI Entry */
|
||||
#define LPI_CTRL_STATUS_TLPIEX 0x00000002 /* Transmit LPI Exit */
|
||||
#define LPI_CTRL_STATUS_TLPIEN 0x00000001 /* Transmit LPI Entry */
|
||||
|
||||
/* GMAC HW ADDR regs */
|
||||
#define GMAC_ADDR_HIGH(reg) ((reg > 15) ? 0x00000800 + (reg - 16) * 8 : \
|
||||
0x00000040 + (reg * 8))
|
||||
#define GMAC_ADDR_LOW(reg) ((reg > 15) ? 0x00000804 + (reg - 16) * 8 : \
|
||||
0x00000044 + (reg * 8))
|
||||
#define GMAC_MAX_PERFECT_ADDRESSES 1
|
||||
|
||||
#define GMAC_PCS_BASE 0x000000c0 /* PCS register base */
|
||||
#define GMAC_RGSMIIIS 0x000000d8 /* RGMII/SMII status */
|
||||
|
||||
/* SGMII/RGMII status register */
|
||||
#define GMAC_RGSMIIIS_LNKMODE BIT(0)
|
||||
#define GMAC_RGSMIIIS_SPEED GENMASK(2, 1)
|
||||
#define GMAC_RGSMIIIS_SPEED_SHIFT 1
|
||||
#define GMAC_RGSMIIIS_LNKSTS BIT(3)
|
||||
#define GMAC_RGSMIIIS_JABTO BIT(4)
|
||||
#define GMAC_RGSMIIIS_FALSECARDET BIT(5)
|
||||
#define GMAC_RGSMIIIS_SMIDRXS BIT(16)
|
||||
/* LNKMOD */
|
||||
#define GMAC_RGSMIIIS_LNKMOD_MASK 0x1
|
||||
/* LNKSPEED */
|
||||
#define GMAC_RGSMIIIS_SPEED_125 0x2
|
||||
#define GMAC_RGSMIIIS_SPEED_25 0x1
|
||||
#define GMAC_RGSMIIIS_SPEED_2_5 0x0
|
||||
|
||||
/* GMAC Configuration defines */
|
||||
#define GMAC_CONTROL_2K 0x08000000 /* IEEE 802.3as 2K packets */
|
||||
#define GMAC_CONTROL_TC 0x01000000 /* Transmit Conf. in RGMII/SGMII */
|
||||
#define GMAC_CONTROL_WD 0x00800000 /* Disable Watchdog on receive */
|
||||
#define GMAC_CONTROL_JD 0x00400000 /* Jabber disable */
|
||||
#define GMAC_CONTROL_BE 0x00200000 /* Frame Burst Enable */
|
||||
#define GMAC_CONTROL_JE 0x00100000 /* Jumbo frame */
|
||||
enum inter_frame_gap {
|
||||
GMAC_CONTROL_IFG_88 = 0x00040000,
|
||||
GMAC_CONTROL_IFG_80 = 0x00020000,
|
||||
GMAC_CONTROL_IFG_40 = 0x000e0000,
|
||||
};
|
||||
#define GMAC_CONTROL_DCRS 0x00010000 /* Disable carrier sense */
|
||||
#define GMAC_CONTROL_PS 0x00008000 /* Port Select 0:GMI 1:MII */
|
||||
#define GMAC_CONTROL_FES 0x00004000 /* Speed 0:10 1:100 */
|
||||
#define GMAC_CONTROL_DO 0x00002000 /* Disable Rx Own */
|
||||
#define GMAC_CONTROL_LM 0x00001000 /* Loop-back mode */
|
||||
#define GMAC_CONTROL_DM 0x00000800 /* Duplex Mode */
|
||||
#define GMAC_CONTROL_IPC 0x00000400 /* Checksum Offload */
|
||||
#define GMAC_CONTROL_DR 0x00000200 /* Disable Retry */
|
||||
#define GMAC_CONTROL_LUD 0x00000100 /* Link up/down */
|
||||
#define GMAC_CONTROL_ACS 0x00000080 /* Auto Pad/FCS Stripping */
|
||||
#define GMAC_CONTROL_DC 0x00000010 /* Deferral Check */
|
||||
#define GMAC_CONTROL_TE 0x00000008 /* Transmitter Enable */
|
||||
#define GMAC_CONTROL_RE 0x00000004 /* Receiver Enable */
|
||||
|
||||
#define GMAC_CORE_INIT (GMAC_CONTROL_JD | GMAC_CONTROL_PS | \
|
||||
GMAC_CONTROL_BE | GMAC_CONTROL_DCRS)
|
||||
|
||||
/* GMAC Frame Filter defines */
|
||||
#define GMAC_FRAME_FILTER_PR 0x00000001 /* Promiscuous Mode */
|
||||
#define GMAC_FRAME_FILTER_HUC 0x00000002 /* Hash Unicast */
|
||||
#define GMAC_FRAME_FILTER_HMC 0x00000004 /* Hash Multicast */
|
||||
#define GMAC_FRAME_FILTER_DAIF 0x00000008 /* DA Inverse Filtering */
|
||||
#define GMAC_FRAME_FILTER_PM 0x00000010 /* Pass all multicast */
|
||||
#define GMAC_FRAME_FILTER_DBF 0x00000020 /* Disable Broadcast frames */
|
||||
#define GMAC_FRAME_FILTER_PCF 0x00000080 /* Pass Control frames */
|
||||
#define GMAC_FRAME_FILTER_SAIF 0x00000100 /* Inverse Filtering */
|
||||
#define GMAC_FRAME_FILTER_SAF 0x00000200 /* Source Address Filter */
|
||||
#define GMAC_FRAME_FILTER_HPF 0x00000400 /* Hash or perfect Filter */
|
||||
#define GMAC_FRAME_FILTER_RA 0x80000000 /* Receive all mode */
|
||||
/* GMII ADDR defines */
|
||||
#define GMAC_MII_ADDR_WRITE 0x00000002 /* MII Write */
|
||||
#define GMAC_MII_ADDR_BUSY 0x00000001 /* MII Busy */
|
||||
/* GMAC FLOW CTRL defines */
|
||||
#define GMAC_FLOW_CTRL_PT_MASK 0xffff0000 /* Pause Time Mask */
|
||||
#define GMAC_FLOW_CTRL_PT_SHIFT 16
|
||||
#define GMAC_FLOW_CTRL_UP 0x00000008 /* Unicast pause frame enable */
|
||||
#define GMAC_FLOW_CTRL_RFE 0x00000004 /* Rx Flow Control Enable */
|
||||
#define GMAC_FLOW_CTRL_TFE 0x00000002 /* Tx Flow Control Enable */
|
||||
#define GMAC_FLOW_CTRL_FCB_BPA 0x00000001 /* Flow Control Busy ... */
|
||||
|
||||
/* DEBUG Register defines */
|
||||
/* MTL TxStatus FIFO */
|
||||
#define GMAC_DEBUG_TXSTSFSTS BIT(25) /* MTL TxStatus FIFO Full Status */
|
||||
#define GMAC_DEBUG_TXFSTS BIT(24) /* MTL Tx FIFO Not Empty Status */
|
||||
#define GMAC_DEBUG_TWCSTS BIT(22) /* MTL Tx FIFO Write Controller */
|
||||
/* MTL Tx FIFO Read Controller Status */
|
||||
#define GMAC_DEBUG_TRCSTS_MASK GENMASK(21, 20)
|
||||
#define GMAC_DEBUG_TRCSTS_SHIFT 20
|
||||
#define GMAC_DEBUG_TRCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_TRCSTS_READ 1
|
||||
#define GMAC_DEBUG_TRCSTS_TXW 2
|
||||
#define GMAC_DEBUG_TRCSTS_WRITE 3
|
||||
#define GMAC_DEBUG_TXPAUSED BIT(19) /* MAC Transmitter in PAUSE */
|
||||
/* MAC Transmit Frame Controller Status */
|
||||
#define GMAC_DEBUG_TFCSTS_MASK GENMASK(18, 17)
|
||||
#define GMAC_DEBUG_TFCSTS_SHIFT 17
|
||||
#define GMAC_DEBUG_TFCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_TFCSTS_WAIT 1
|
||||
#define GMAC_DEBUG_TFCSTS_GEN_PAUSE 2
|
||||
#define GMAC_DEBUG_TFCSTS_XFER 3
|
||||
/* MAC GMII or MII Transmit Protocol Engine Status */
|
||||
#define GMAC_DEBUG_TPESTS BIT(16)
|
||||
#define GMAC_DEBUG_RXFSTS_MASK GENMASK(9, 8) /* MTL Rx FIFO Fill-level */
|
||||
#define GMAC_DEBUG_RXFSTS_SHIFT 8
|
||||
#define GMAC_DEBUG_RXFSTS_EMPTY 0
|
||||
#define GMAC_DEBUG_RXFSTS_BT 1
|
||||
#define GMAC_DEBUG_RXFSTS_AT 2
|
||||
#define GMAC_DEBUG_RXFSTS_FULL 3
|
||||
#define GMAC_DEBUG_RRCSTS_MASK GENMASK(6, 5) /* MTL Rx FIFO Read Controller */
|
||||
#define GMAC_DEBUG_RRCSTS_SHIFT 5
|
||||
#define GMAC_DEBUG_RRCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_RRCSTS_RDATA 1
|
||||
#define GMAC_DEBUG_RRCSTS_RSTAT 2
|
||||
#define GMAC_DEBUG_RRCSTS_FLUSH 3
|
||||
#define GMAC_DEBUG_RWCSTS BIT(4) /* MTL Rx FIFO Write Controller Active */
|
||||
/* MAC Receive Frame Controller FIFO Status */
|
||||
#define GMAC_DEBUG_RFCFCSTS_MASK GENMASK(2, 1)
|
||||
#define GMAC_DEBUG_RFCFCSTS_SHIFT 1
|
||||
/* MAC GMII or MII Receive Protocol Engine Status */
|
||||
#define GMAC_DEBUG_RPESTS BIT(0)
|
||||
|
||||
/*--- DMA BLOCK defines ---*/
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_MODE_DA 0x00000002 /* Arbitration scheme */
|
||||
#define DMA_BUS_MODE_DSL_MASK 0x0000007c /* Descriptor Skip Length */
|
||||
#define DMA_BUS_MODE_DSL_SHIFT 2 /* (in DWORDS) */
|
||||
/* Programmable burst length (passed thorugh platform)*/
|
||||
#define DMA_BUS_MODE_PBL_MASK 0x00003f00 /* Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 8
|
||||
#define DMA_BUS_MODE_ATDS 0x00000080 /* Alternate Descriptor Size */
|
||||
|
||||
enum rx_tx_priority_ratio {
|
||||
double_ratio = 0x00004000, /* 2:1 */
|
||||
triple_ratio = 0x00008000, /* 3:1 */
|
||||
quadruple_ratio = 0x0000c000, /* 4:1 */
|
||||
};
|
||||
|
||||
#define DMA_BUS_MODE_FB 0x00010000 /* Fixed burst */
|
||||
#define DMA_BUS_MODE_MB 0x04000000 /* Mixed burst */
|
||||
#define DMA_BUS_MODE_RPBL_MASK 0x007e0000 /* Rx-Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_RPBL_SHIFT 17
|
||||
#define DMA_BUS_MODE_USP 0x00800000
|
||||
#define DMA_BUS_MODE_MAXPBL 0x01000000
|
||||
#define DMA_BUS_MODE_AAL 0x02000000
|
||||
|
||||
/* DMA CRS Control and Status Register Mapping */
|
||||
#define DMA_HOST_TX_DESC 0x00001048 /* Current Host Tx descriptor */
|
||||
#define DMA_HOST_RX_DESC 0x0000104c /* Current Host Rx descriptor */
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_PR_RATIO_MASK 0x0000c000 /* Rx/Tx priority ratio */
|
||||
#define DMA_BUS_PR_RATIO_SHIFT 14
|
||||
#define DMA_BUS_FB 0x00010000 /* Fixed Burst */
|
||||
|
||||
/* DMA operation mode defines (start/stop tx/rx are placed in common header)*/
|
||||
/* Disable Drop TCP/IP csum error */
|
||||
#define DMA_CONTROL_DT 0x04000000
|
||||
#define DMA_CONTROL_RSF 0x02000000 /* Receive Store and Forward */
|
||||
#define DMA_CONTROL_DFF 0x01000000 /* Disaable flushing */
|
||||
/* Threshold for Activating the FC */
|
||||
enum rfa {
|
||||
act_full_minus_1 = 0x00800000,
|
||||
act_full_minus_2 = 0x00800200,
|
||||
act_full_minus_3 = 0x00800400,
|
||||
act_full_minus_4 = 0x00800600,
|
||||
};
|
||||
/* Threshold for Deactivating the FC */
|
||||
enum rfd {
|
||||
deac_full_minus_1 = 0x00400000,
|
||||
deac_full_minus_2 = 0x00400800,
|
||||
deac_full_minus_3 = 0x00401000,
|
||||
deac_full_minus_4 = 0x00401800,
|
||||
};
|
||||
#define DMA_CONTROL_TSF 0x00200000 /* Transmit Store and Forward */
|
||||
|
||||
enum ttc_control {
|
||||
DMA_CONTROL_TTC_64 = 0x00000000,
|
||||
DMA_CONTROL_TTC_128 = 0x00004000,
|
||||
DMA_CONTROL_TTC_192 = 0x00008000,
|
||||
DMA_CONTROL_TTC_256 = 0x0000c000,
|
||||
DMA_CONTROL_TTC_40 = 0x00010000,
|
||||
DMA_CONTROL_TTC_32 = 0x00014000,
|
||||
DMA_CONTROL_TTC_24 = 0x00018000,
|
||||
DMA_CONTROL_TTC_16 = 0x0001c000,
|
||||
};
|
||||
#define DMA_CONTROL_TC_TX_MASK 0xfffe3fff
|
||||
|
||||
#define DMA_CONTROL_EFC 0x00000100
|
||||
#define DMA_CONTROL_FEF 0x00000080
|
||||
#define DMA_CONTROL_FUF 0x00000040
|
||||
|
||||
/* Receive flow control activation field
|
||||
* RFA field in DMA control register, bits 23,10:9
|
||||
*/
|
||||
#define DMA_CONTROL_RFA_MASK 0x00800600
|
||||
|
||||
/* Receive flow control deactivation field
|
||||
* RFD field in DMA control register, bits 22,12:11
|
||||
*/
|
||||
#define DMA_CONTROL_RFD_MASK 0x00401800
|
||||
|
||||
/* RFD and RFA fields are encoded as follows
|
||||
*
|
||||
* Bit Field
|
||||
* 0,00 - Full minus 1KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,01 - Full minus 2KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,10 - Full minus 3KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,11 - Full minus 4KB (only valid when rxfifo > 4KB and EFC enabled)
|
||||
* 1,00 - Full minus 5KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,01 - Full minus 6KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,10 - Full minus 7KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,11 - Reserved
|
||||
*
|
||||
* RFD should always be > RFA for a given FIFO size. RFD == RFA may work,
|
||||
* but packet throughput performance may not be as expected.
|
||||
*
|
||||
* Be sure that bit 3 in GMAC Register 6 is set for Unicast Pause frame
|
||||
* detection (IEEE Specification Requirement, Annex 31B, 31B.1, Pause
|
||||
* Description).
|
||||
*
|
||||
* Be sure that DZPA (bit 7 in Flow Control Register, GMAC Register 6),
|
||||
* is set to 0. This allows pause frames with a quanta of 0 to be sent
|
||||
* as an XOFF message to the link peer.
|
||||
*/
|
||||
|
||||
#define RFA_FULL_MINUS_1K 0x00000000
|
||||
#define RFA_FULL_MINUS_2K 0x00000200
|
||||
#define RFA_FULL_MINUS_3K 0x00000400
|
||||
#define RFA_FULL_MINUS_4K 0x00000600
|
||||
#define RFA_FULL_MINUS_5K 0x00800000
|
||||
#define RFA_FULL_MINUS_6K 0x00800200
|
||||
#define RFA_FULL_MINUS_7K 0x00800400
|
||||
|
||||
#define RFD_FULL_MINUS_1K 0x00000000
|
||||
#define RFD_FULL_MINUS_2K 0x00000800
|
||||
#define RFD_FULL_MINUS_3K 0x00001000
|
||||
#define RFD_FULL_MINUS_4K 0x00001800
|
||||
#define RFD_FULL_MINUS_5K 0x00400000
|
||||
#define RFD_FULL_MINUS_6K 0x00400800
|
||||
#define RFD_FULL_MINUS_7K 0x00401000
|
||||
|
||||
enum rtc_control {
|
||||
DMA_CONTROL_RTC_64 = 0x00000000,
|
||||
DMA_CONTROL_RTC_32 = 0x00000008,
|
||||
DMA_CONTROL_RTC_96 = 0x00000010,
|
||||
DMA_CONTROL_RTC_128 = 0x00000018,
|
||||
};
|
||||
#define DMA_CONTROL_TC_RX_MASK 0xffffffe7
|
||||
|
||||
#define DMA_CONTROL_OSF 0x00000004 /* Operate on second frame */
|
||||
|
||||
/* MMC registers offset */
|
||||
#define GMAC_MMC_CTRL 0x100
|
||||
#define GMAC_MMC_RX_INTR 0x104
|
||||
#define GMAC_MMC_TX_INTR 0x108
|
||||
#define GMAC_MMC_RX_CSUM_OFFLOAD 0x208
|
||||
#define GMAC_EXTHASH_BASE 0x500
|
||||
|
||||
extern const struct stmmac_dma_ops dwmac1000_dma_ops;
|
||||
#endif /* __DWMAC1000_H__ */
|
||||
333
devices/stmmac/dwmac1000-6.4-orig.h
Normal file
333
devices/stmmac/dwmac1000-6.4-orig.h
Normal file
@@ -0,0 +1,333 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
#ifndef __DWMAC1000_H__
|
||||
#define __DWMAC1000_H__
|
||||
|
||||
#include <linux/phy.h>
|
||||
#include "common.h"
|
||||
|
||||
#define GMAC_CONTROL 0x00000000 /* Configuration */
|
||||
#define GMAC_FRAME_FILTER 0x00000004 /* Frame Filter */
|
||||
#define GMAC_HASH_HIGH 0x00000008 /* Multicast Hash Table High */
|
||||
#define GMAC_HASH_LOW 0x0000000c /* Multicast Hash Table Low */
|
||||
#define GMAC_MII_ADDR 0x00000010 /* MII Address */
|
||||
#define GMAC_MII_DATA 0x00000014 /* MII Data */
|
||||
#define GMAC_FLOW_CTRL 0x00000018 /* Flow Control */
|
||||
#define GMAC_VLAN_TAG 0x0000001c /* VLAN Tag */
|
||||
#define GMAC_DEBUG 0x00000024 /* GMAC debug register */
|
||||
#define GMAC_WAKEUP_FILTER 0x00000028 /* Wake-up Frame Filter */
|
||||
|
||||
#define GMAC_INT_STATUS 0x00000038 /* interrupt status register */
|
||||
#define GMAC_INT_STATUS_PMT BIT(3)
|
||||
#define GMAC_INT_STATUS_MMCIS BIT(4)
|
||||
#define GMAC_INT_STATUS_MMCRIS BIT(5)
|
||||
#define GMAC_INT_STATUS_MMCTIS BIT(6)
|
||||
#define GMAC_INT_STATUS_MMCCSUM BIT(7)
|
||||
#define GMAC_INT_STATUS_TSTAMP BIT(9)
|
||||
#define GMAC_INT_STATUS_LPIIS BIT(10)
|
||||
|
||||
/* interrupt mask register */
|
||||
#define GMAC_INT_MASK 0x0000003c
|
||||
#define GMAC_INT_DISABLE_RGMII BIT(0)
|
||||
#define GMAC_INT_DISABLE_PCSLINK BIT(1)
|
||||
#define GMAC_INT_DISABLE_PCSAN BIT(2)
|
||||
#define GMAC_INT_DISABLE_PMT BIT(3)
|
||||
#define GMAC_INT_DISABLE_TIMESTAMP BIT(9)
|
||||
#define GMAC_INT_DISABLE_PCS (GMAC_INT_DISABLE_RGMII | \
|
||||
GMAC_INT_DISABLE_PCSLINK | \
|
||||
GMAC_INT_DISABLE_PCSAN)
|
||||
#define GMAC_INT_DEFAULT_MASK (GMAC_INT_DISABLE_TIMESTAMP | \
|
||||
GMAC_INT_DISABLE_PCS)
|
||||
|
||||
/* PMT Control and Status */
|
||||
#define GMAC_PMT 0x0000002c
|
||||
enum power_event {
|
||||
pointer_reset = 0x80000000,
|
||||
global_unicast = 0x00000200,
|
||||
wake_up_rx_frame = 0x00000040,
|
||||
magic_frame = 0x00000020,
|
||||
wake_up_frame_en = 0x00000004,
|
||||
magic_pkt_en = 0x00000002,
|
||||
power_down = 0x00000001,
|
||||
};
|
||||
|
||||
/* Energy Efficient Ethernet (EEE)
|
||||
*
|
||||
* LPI status, timer and control register offset
|
||||
*/
|
||||
#define LPI_CTRL_STATUS 0x0030
|
||||
#define LPI_TIMER_CTRL 0x0034
|
||||
|
||||
/* LPI control and status defines */
|
||||
#define LPI_CTRL_STATUS_LPITXA 0x00080000 /* Enable LPI TX Automate */
|
||||
#define LPI_CTRL_STATUS_PLSEN 0x00040000 /* Enable PHY Link Status */
|
||||
#define LPI_CTRL_STATUS_PLS 0x00020000 /* PHY Link Status */
|
||||
#define LPI_CTRL_STATUS_LPIEN 0x00010000 /* LPI Enable */
|
||||
#define LPI_CTRL_STATUS_RLPIST 0x00000200 /* Receive LPI state */
|
||||
#define LPI_CTRL_STATUS_TLPIST 0x00000100 /* Transmit LPI state */
|
||||
#define LPI_CTRL_STATUS_RLPIEX 0x00000008 /* Receive LPI Exit */
|
||||
#define LPI_CTRL_STATUS_RLPIEN 0x00000004 /* Receive LPI Entry */
|
||||
#define LPI_CTRL_STATUS_TLPIEX 0x00000002 /* Transmit LPI Exit */
|
||||
#define LPI_CTRL_STATUS_TLPIEN 0x00000001 /* Transmit LPI Entry */
|
||||
|
||||
/* GMAC HW ADDR regs */
|
||||
#define GMAC_ADDR_HIGH(reg) ((reg > 15) ? 0x00000800 + (reg - 16) * 8 : \
|
||||
0x00000040 + (reg * 8))
|
||||
#define GMAC_ADDR_LOW(reg) ((reg > 15) ? 0x00000804 + (reg - 16) * 8 : \
|
||||
0x00000044 + (reg * 8))
|
||||
#define GMAC_MAX_PERFECT_ADDRESSES 1
|
||||
|
||||
#define GMAC_PCS_BASE 0x000000c0 /* PCS register base */
|
||||
#define GMAC_RGSMIIIS 0x000000d8 /* RGMII/SMII status */
|
||||
|
||||
/* SGMII/RGMII status register */
|
||||
#define GMAC_RGSMIIIS_LNKMODE BIT(0)
|
||||
#define GMAC_RGSMIIIS_SPEED GENMASK(2, 1)
|
||||
#define GMAC_RGSMIIIS_SPEED_SHIFT 1
|
||||
#define GMAC_RGSMIIIS_LNKSTS BIT(3)
|
||||
#define GMAC_RGSMIIIS_JABTO BIT(4)
|
||||
#define GMAC_RGSMIIIS_FALSECARDET BIT(5)
|
||||
#define GMAC_RGSMIIIS_SMIDRXS BIT(16)
|
||||
/* LNKMOD */
|
||||
#define GMAC_RGSMIIIS_LNKMOD_MASK 0x1
|
||||
/* LNKSPEED */
|
||||
#define GMAC_RGSMIIIS_SPEED_125 0x2
|
||||
#define GMAC_RGSMIIIS_SPEED_25 0x1
|
||||
#define GMAC_RGSMIIIS_SPEED_2_5 0x0
|
||||
|
||||
/* GMAC Configuration defines */
|
||||
#define GMAC_CONTROL_2K 0x08000000 /* IEEE 802.3as 2K packets */
|
||||
#define GMAC_CONTROL_TC 0x01000000 /* Transmit Conf. in RGMII/SGMII */
|
||||
#define GMAC_CONTROL_WD 0x00800000 /* Disable Watchdog on receive */
|
||||
#define GMAC_CONTROL_JD 0x00400000 /* Jabber disable */
|
||||
#define GMAC_CONTROL_BE 0x00200000 /* Frame Burst Enable */
|
||||
#define GMAC_CONTROL_JE 0x00100000 /* Jumbo frame */
|
||||
enum inter_frame_gap {
|
||||
GMAC_CONTROL_IFG_88 = 0x00040000,
|
||||
GMAC_CONTROL_IFG_80 = 0x00020000,
|
||||
GMAC_CONTROL_IFG_40 = 0x000e0000,
|
||||
};
|
||||
#define GMAC_CONTROL_DCRS 0x00010000 /* Disable carrier sense */
|
||||
#define GMAC_CONTROL_PS 0x00008000 /* Port Select 0:GMI 1:MII */
|
||||
#define GMAC_CONTROL_FES 0x00004000 /* Speed 0:10 1:100 */
|
||||
#define GMAC_CONTROL_DO 0x00002000 /* Disable Rx Own */
|
||||
#define GMAC_CONTROL_LM 0x00001000 /* Loop-back mode */
|
||||
#define GMAC_CONTROL_DM 0x00000800 /* Duplex Mode */
|
||||
#define GMAC_CONTROL_IPC 0x00000400 /* Checksum Offload */
|
||||
#define GMAC_CONTROL_DR 0x00000200 /* Disable Retry */
|
||||
#define GMAC_CONTROL_LUD 0x00000100 /* Link up/down */
|
||||
#define GMAC_CONTROL_ACS 0x00000080 /* Auto Pad/FCS Stripping */
|
||||
#define GMAC_CONTROL_DC 0x00000010 /* Deferral Check */
|
||||
#define GMAC_CONTROL_TE 0x00000008 /* Transmitter Enable */
|
||||
#define GMAC_CONTROL_RE 0x00000004 /* Receiver Enable */
|
||||
|
||||
#define GMAC_CORE_INIT (GMAC_CONTROL_JD | GMAC_CONTROL_PS | \
|
||||
GMAC_CONTROL_BE | GMAC_CONTROL_DCRS)
|
||||
|
||||
/* GMAC Frame Filter defines */
|
||||
#define GMAC_FRAME_FILTER_PR 0x00000001 /* Promiscuous Mode */
|
||||
#define GMAC_FRAME_FILTER_HUC 0x00000002 /* Hash Unicast */
|
||||
#define GMAC_FRAME_FILTER_HMC 0x00000004 /* Hash Multicast */
|
||||
#define GMAC_FRAME_FILTER_DAIF 0x00000008 /* DA Inverse Filtering */
|
||||
#define GMAC_FRAME_FILTER_PM 0x00000010 /* Pass all multicast */
|
||||
#define GMAC_FRAME_FILTER_DBF 0x00000020 /* Disable Broadcast frames */
|
||||
#define GMAC_FRAME_FILTER_PCF 0x00000080 /* Pass Control frames */
|
||||
#define GMAC_FRAME_FILTER_SAIF 0x00000100 /* Inverse Filtering */
|
||||
#define GMAC_FRAME_FILTER_SAF 0x00000200 /* Source Address Filter */
|
||||
#define GMAC_FRAME_FILTER_HPF 0x00000400 /* Hash or perfect Filter */
|
||||
#define GMAC_FRAME_FILTER_RA 0x80000000 /* Receive all mode */
|
||||
/* GMII ADDR defines */
|
||||
#define GMAC_MII_ADDR_WRITE 0x00000002 /* MII Write */
|
||||
#define GMAC_MII_ADDR_BUSY 0x00000001 /* MII Busy */
|
||||
/* GMAC FLOW CTRL defines */
|
||||
#define GMAC_FLOW_CTRL_PT_MASK 0xffff0000 /* Pause Time Mask */
|
||||
#define GMAC_FLOW_CTRL_PT_SHIFT 16
|
||||
#define GMAC_FLOW_CTRL_UP 0x00000008 /* Unicast pause frame enable */
|
||||
#define GMAC_FLOW_CTRL_RFE 0x00000004 /* Rx Flow Control Enable */
|
||||
#define GMAC_FLOW_CTRL_TFE 0x00000002 /* Tx Flow Control Enable */
|
||||
#define GMAC_FLOW_CTRL_FCB_BPA 0x00000001 /* Flow Control Busy ... */
|
||||
|
||||
/* DEBUG Register defines */
|
||||
/* MTL TxStatus FIFO */
|
||||
#define GMAC_DEBUG_TXSTSFSTS BIT(25) /* MTL TxStatus FIFO Full Status */
|
||||
#define GMAC_DEBUG_TXFSTS BIT(24) /* MTL Tx FIFO Not Empty Status */
|
||||
#define GMAC_DEBUG_TWCSTS BIT(22) /* MTL Tx FIFO Write Controller */
|
||||
/* MTL Tx FIFO Read Controller Status */
|
||||
#define GMAC_DEBUG_TRCSTS_MASK GENMASK(21, 20)
|
||||
#define GMAC_DEBUG_TRCSTS_SHIFT 20
|
||||
#define GMAC_DEBUG_TRCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_TRCSTS_READ 1
|
||||
#define GMAC_DEBUG_TRCSTS_TXW 2
|
||||
#define GMAC_DEBUG_TRCSTS_WRITE 3
|
||||
#define GMAC_DEBUG_TXPAUSED BIT(19) /* MAC Transmitter in PAUSE */
|
||||
/* MAC Transmit Frame Controller Status */
|
||||
#define GMAC_DEBUG_TFCSTS_MASK GENMASK(18, 17)
|
||||
#define GMAC_DEBUG_TFCSTS_SHIFT 17
|
||||
#define GMAC_DEBUG_TFCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_TFCSTS_WAIT 1
|
||||
#define GMAC_DEBUG_TFCSTS_GEN_PAUSE 2
|
||||
#define GMAC_DEBUG_TFCSTS_XFER 3
|
||||
/* MAC GMII or MII Transmit Protocol Engine Status */
|
||||
#define GMAC_DEBUG_TPESTS BIT(16)
|
||||
#define GMAC_DEBUG_RXFSTS_MASK GENMASK(9, 8) /* MTL Rx FIFO Fill-level */
|
||||
#define GMAC_DEBUG_RXFSTS_SHIFT 8
|
||||
#define GMAC_DEBUG_RXFSTS_EMPTY 0
|
||||
#define GMAC_DEBUG_RXFSTS_BT 1
|
||||
#define GMAC_DEBUG_RXFSTS_AT 2
|
||||
#define GMAC_DEBUG_RXFSTS_FULL 3
|
||||
#define GMAC_DEBUG_RRCSTS_MASK GENMASK(6, 5) /* MTL Rx FIFO Read Controller */
|
||||
#define GMAC_DEBUG_RRCSTS_SHIFT 5
|
||||
#define GMAC_DEBUG_RRCSTS_IDLE 0
|
||||
#define GMAC_DEBUG_RRCSTS_RDATA 1
|
||||
#define GMAC_DEBUG_RRCSTS_RSTAT 2
|
||||
#define GMAC_DEBUG_RRCSTS_FLUSH 3
|
||||
#define GMAC_DEBUG_RWCSTS BIT(4) /* MTL Rx FIFO Write Controller Active */
|
||||
/* MAC Receive Frame Controller FIFO Status */
|
||||
#define GMAC_DEBUG_RFCFCSTS_MASK GENMASK(2, 1)
|
||||
#define GMAC_DEBUG_RFCFCSTS_SHIFT 1
|
||||
/* MAC GMII or MII Receive Protocol Engine Status */
|
||||
#define GMAC_DEBUG_RPESTS BIT(0)
|
||||
|
||||
/*--- DMA BLOCK defines ---*/
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_MODE_DA 0x00000002 /* Arbitration scheme */
|
||||
#define DMA_BUS_MODE_DSL_MASK 0x0000007c /* Descriptor Skip Length */
|
||||
#define DMA_BUS_MODE_DSL_SHIFT 2 /* (in DWORDS) */
|
||||
/* Programmable burst length (passed thorugh platform)*/
|
||||
#define DMA_BUS_MODE_PBL_MASK 0x00003f00 /* Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 8
|
||||
#define DMA_BUS_MODE_ATDS 0x00000080 /* Alternate Descriptor Size */
|
||||
|
||||
enum rx_tx_priority_ratio {
|
||||
double_ratio = 0x00004000, /* 2:1 */
|
||||
triple_ratio = 0x00008000, /* 3:1 */
|
||||
quadruple_ratio = 0x0000c000, /* 4:1 */
|
||||
};
|
||||
|
||||
#define DMA_BUS_MODE_FB 0x00010000 /* Fixed burst */
|
||||
#define DMA_BUS_MODE_MB 0x04000000 /* Mixed burst */
|
||||
#define DMA_BUS_MODE_RPBL_MASK 0x007e0000 /* Rx-Programmable Burst Len */
|
||||
#define DMA_BUS_MODE_RPBL_SHIFT 17
|
||||
#define DMA_BUS_MODE_USP 0x00800000
|
||||
#define DMA_BUS_MODE_MAXPBL 0x01000000
|
||||
#define DMA_BUS_MODE_AAL 0x02000000
|
||||
|
||||
/* DMA CRS Control and Status Register Mapping */
|
||||
#define DMA_HOST_TX_DESC 0x00001048 /* Current Host Tx descriptor */
|
||||
#define DMA_HOST_RX_DESC 0x0000104c /* Current Host Rx descriptor */
|
||||
/* DMA Bus Mode register defines */
|
||||
#define DMA_BUS_PR_RATIO_MASK 0x0000c000 /* Rx/Tx priority ratio */
|
||||
#define DMA_BUS_PR_RATIO_SHIFT 14
|
||||
#define DMA_BUS_FB 0x00010000 /* Fixed Burst */
|
||||
|
||||
/* DMA operation mode defines (start/stop tx/rx are placed in common header)*/
|
||||
/* Disable Drop TCP/IP csum error */
|
||||
#define DMA_CONTROL_DT 0x04000000
|
||||
#define DMA_CONTROL_RSF 0x02000000 /* Receive Store and Forward */
|
||||
#define DMA_CONTROL_DFF 0x01000000 /* Disaable flushing */
|
||||
/* Threshold for Activating the FC */
|
||||
enum rfa {
|
||||
act_full_minus_1 = 0x00800000,
|
||||
act_full_minus_2 = 0x00800200,
|
||||
act_full_minus_3 = 0x00800400,
|
||||
act_full_minus_4 = 0x00800600,
|
||||
};
|
||||
/* Threshold for Deactivating the FC */
|
||||
enum rfd {
|
||||
deac_full_minus_1 = 0x00400000,
|
||||
deac_full_minus_2 = 0x00400800,
|
||||
deac_full_minus_3 = 0x00401000,
|
||||
deac_full_minus_4 = 0x00401800,
|
||||
};
|
||||
#define DMA_CONTROL_TSF 0x00200000 /* Transmit Store and Forward */
|
||||
|
||||
enum ttc_control {
|
||||
DMA_CONTROL_TTC_64 = 0x00000000,
|
||||
DMA_CONTROL_TTC_128 = 0x00004000,
|
||||
DMA_CONTROL_TTC_192 = 0x00008000,
|
||||
DMA_CONTROL_TTC_256 = 0x0000c000,
|
||||
DMA_CONTROL_TTC_40 = 0x00010000,
|
||||
DMA_CONTROL_TTC_32 = 0x00014000,
|
||||
DMA_CONTROL_TTC_24 = 0x00018000,
|
||||
DMA_CONTROL_TTC_16 = 0x0001c000,
|
||||
};
|
||||
#define DMA_CONTROL_TC_TX_MASK 0xfffe3fff
|
||||
|
||||
#define DMA_CONTROL_EFC 0x00000100
|
||||
#define DMA_CONTROL_FEF 0x00000080
|
||||
#define DMA_CONTROL_FUF 0x00000040
|
||||
|
||||
/* Receive flow control activation field
|
||||
* RFA field in DMA control register, bits 23,10:9
|
||||
*/
|
||||
#define DMA_CONTROL_RFA_MASK 0x00800600
|
||||
|
||||
/* Receive flow control deactivation field
|
||||
* RFD field in DMA control register, bits 22,12:11
|
||||
*/
|
||||
#define DMA_CONTROL_RFD_MASK 0x00401800
|
||||
|
||||
/* RFD and RFA fields are encoded as follows
|
||||
*
|
||||
* Bit Field
|
||||
* 0,00 - Full minus 1KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,01 - Full minus 2KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,10 - Full minus 3KB (only valid when rxfifo >= 4KB and EFC enabled)
|
||||
* 0,11 - Full minus 4KB (only valid when rxfifo > 4KB and EFC enabled)
|
||||
* 1,00 - Full minus 5KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,01 - Full minus 6KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,10 - Full minus 7KB (only valid when rxfifo > 8KB and EFC enabled)
|
||||
* 1,11 - Reserved
|
||||
*
|
||||
* RFD should always be > RFA for a given FIFO size. RFD == RFA may work,
|
||||
* but packet throughput performance may not be as expected.
|
||||
*
|
||||
* Be sure that bit 3 in GMAC Register 6 is set for Unicast Pause frame
|
||||
* detection (IEEE Specification Requirement, Annex 31B, 31B.1, Pause
|
||||
* Description).
|
||||
*
|
||||
* Be sure that DZPA (bit 7 in Flow Control Register, GMAC Register 6),
|
||||
* is set to 0. This allows pause frames with a quanta of 0 to be sent
|
||||
* as an XOFF message to the link peer.
|
||||
*/
|
||||
|
||||
#define RFA_FULL_MINUS_1K 0x00000000
|
||||
#define RFA_FULL_MINUS_2K 0x00000200
|
||||
#define RFA_FULL_MINUS_3K 0x00000400
|
||||
#define RFA_FULL_MINUS_4K 0x00000600
|
||||
#define RFA_FULL_MINUS_5K 0x00800000
|
||||
#define RFA_FULL_MINUS_6K 0x00800200
|
||||
#define RFA_FULL_MINUS_7K 0x00800400
|
||||
|
||||
#define RFD_FULL_MINUS_1K 0x00000000
|
||||
#define RFD_FULL_MINUS_2K 0x00000800
|
||||
#define RFD_FULL_MINUS_3K 0x00001000
|
||||
#define RFD_FULL_MINUS_4K 0x00001800
|
||||
#define RFD_FULL_MINUS_5K 0x00400000
|
||||
#define RFD_FULL_MINUS_6K 0x00400800
|
||||
#define RFD_FULL_MINUS_7K 0x00401000
|
||||
|
||||
enum rtc_control {
|
||||
DMA_CONTROL_RTC_64 = 0x00000000,
|
||||
DMA_CONTROL_RTC_32 = 0x00000008,
|
||||
DMA_CONTROL_RTC_96 = 0x00000010,
|
||||
DMA_CONTROL_RTC_128 = 0x00000018,
|
||||
};
|
||||
#define DMA_CONTROL_TC_RX_MASK 0xffffffe7
|
||||
|
||||
#define DMA_CONTROL_OSF 0x00000004 /* Operate on second frame */
|
||||
|
||||
/* MMC registers offset */
|
||||
#define GMAC_MMC_CTRL 0x100
|
||||
#define GMAC_MMC_RX_INTR 0x104
|
||||
#define GMAC_MMC_TX_INTR 0x108
|
||||
#define GMAC_MMC_RX_CSUM_OFFLOAD 0x208
|
||||
#define GMAC_EXTHASH_BASE 0x500
|
||||
|
||||
extern const struct stmmac_dma_ops dwmac1000_dma_ops;
|
||||
#endif /* __DWMAC1000_H__ */
|
||||
557
devices/stmmac/dwmac1000_core-6.4-ethercat.c
Normal file
557
devices/stmmac/dwmac1000_core-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
557
devices/stmmac/dwmac1000_core-6.4-orig.c
Normal file
557
devices/stmmac/dwmac1000_core-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
296
devices/stmmac/dwmac1000_dma-6.4-ethercat.c
Normal file
296
devices/stmmac/dwmac1000_dma-6.4-ethercat.c
Normal file
@@ -0,0 +1,296 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the GMAC on-chip Ethernet controller for ST SoCs.
|
||||
DWC Ether MAC 10/100/1000 Universal version 3.41a has been used for
|
||||
developing this code.
|
||||
|
||||
This contains the functions to handle the dma.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "dwmac1000-6.4-ethercat.h"
|
||||
#include "dwmac_dma-6.4-ethercat.h"
|
||||
|
||||
static void dwmac1000_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_AXI_BUS_MODE);
|
||||
int i;
|
||||
|
||||
pr_info("dwmac1000: Master AXI performs %s burst length\n",
|
||||
!(value & DMA_AXI_UNDEF) ? "fixed" : "any");
|
||||
|
||||
if (axi->axi_lpi_en)
|
||||
value |= DMA_AXI_EN_LPI;
|
||||
if (axi->axi_xit_frm)
|
||||
value |= DMA_AXI_LPI_XIT_FRM;
|
||||
|
||||
value &= ~DMA_AXI_WR_OSR_LMT;
|
||||
value |= (axi->axi_wr_osr_lmt & DMA_AXI_WR_OSR_LMT_MASK) <<
|
||||
DMA_AXI_WR_OSR_LMT_SHIFT;
|
||||
|
||||
value &= ~DMA_AXI_RD_OSR_LMT;
|
||||
value |= (axi->axi_rd_osr_lmt & DMA_AXI_RD_OSR_LMT_MASK) <<
|
||||
DMA_AXI_RD_OSR_LMT_SHIFT;
|
||||
|
||||
/* Depending on the UNDEF bit the Master AXI will perform any burst
|
||||
* length according to the BLEN programmed (by default all BLEN are
|
||||
* set).
|
||||
*/
|
||||
for (i = 0; i < AXI_BLEN; i++) {
|
||||
switch (axi->axi_blen[i]) {
|
||||
case 256:
|
||||
value |= DMA_AXI_BLEN256;
|
||||
break;
|
||||
case 128:
|
||||
value |= DMA_AXI_BLEN128;
|
||||
break;
|
||||
case 64:
|
||||
value |= DMA_AXI_BLEN64;
|
||||
break;
|
||||
case 32:
|
||||
value |= DMA_AXI_BLEN32;
|
||||
break;
|
||||
case 16:
|
||||
value |= DMA_AXI_BLEN16;
|
||||
break;
|
||||
case 8:
|
||||
value |= DMA_AXI_BLEN8;
|
||||
break;
|
||||
case 4:
|
||||
value |= DMA_AXI_BLEN4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
writel(value, ioaddr + DMA_AXI_BUS_MODE);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init(void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg, int atds)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
int txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
|
||||
int rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
|
||||
|
||||
/*
|
||||
* Set the DMA PBL (Programmable Burst Length) mode.
|
||||
*
|
||||
* Note: before stmmac core 3.50 this mode bit was 4xPBL, and
|
||||
* post 3.5 mode bit acts as 8*PBL.
|
||||
*/
|
||||
if (dma_cfg->pblx8)
|
||||
value |= DMA_BUS_MODE_MAXPBL;
|
||||
value |= DMA_BUS_MODE_USP;
|
||||
value &= ~(DMA_BUS_MODE_PBL_MASK | DMA_BUS_MODE_RPBL_MASK);
|
||||
value |= (txpbl << DMA_BUS_MODE_PBL_SHIFT);
|
||||
value |= (rxpbl << DMA_BUS_MODE_RPBL_SHIFT);
|
||||
|
||||
/* Set the Fixed burst mode */
|
||||
if (dma_cfg->fixed_burst)
|
||||
value |= DMA_BUS_MODE_FB;
|
||||
|
||||
/* Mixed Burst has no effect when fb is set */
|
||||
if (dma_cfg->mixed_burst)
|
||||
value |= DMA_BUS_MODE_MB;
|
||||
|
||||
if (atds)
|
||||
value |= DMA_BUS_MODE_ATDS;
|
||||
|
||||
if (dma_cfg->aal)
|
||||
value |= DMA_BUS_MODE_AAL;
|
||||
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* Mask interrupts by writing to CSR7 */
|
||||
writel(DMA_INTR_DEFAULT_MASK, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init_rx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_rx_phy, u32 chan)
|
||||
{
|
||||
/* RX descriptor base address list must be written into DMA CSR3 */
|
||||
writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_tx_phy, u32 chan)
|
||||
{
|
||||
/* TX descriptor base address list must be written into DMA CSR4 */
|
||||
writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
|
||||
}
|
||||
|
||||
static u32 dwmac1000_configure_fc(u32 csr6, int rxfifosz)
|
||||
{
|
||||
csr6 &= ~DMA_CONTROL_RFA_MASK;
|
||||
csr6 &= ~DMA_CONTROL_RFD_MASK;
|
||||
|
||||
/* Leave flow control disabled if receive fifo size is less than
|
||||
* 4K or 0. Otherwise, send XOFF when fifo is 1K less than full,
|
||||
* and send XON when 2K less than full.
|
||||
*/
|
||||
if (rxfifosz < 4096) {
|
||||
csr6 &= ~DMA_CONTROL_EFC;
|
||||
pr_debug("GMAC: disabling flow control, rxfifo too small(%d)\n",
|
||||
rxfifosz);
|
||||
} else {
|
||||
csr6 |= DMA_CONTROL_EFC;
|
||||
csr6 |= RFA_FULL_MINUS_1K;
|
||||
csr6 |= RFD_FULL_MINUS_2K;
|
||||
}
|
||||
return csr6;
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_operation_mode_rx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode == SF_DMA_MODE) {
|
||||
pr_debug("GMAC: enable RX store and forward mode\n");
|
||||
csr6 |= DMA_CONTROL_RSF;
|
||||
} else {
|
||||
pr_debug("GMAC: disable RX SF mode (threshold %d)\n", mode);
|
||||
csr6 &= ~DMA_CONTROL_RSF;
|
||||
csr6 &= DMA_CONTROL_TC_RX_MASK;
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_RTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_RTC_64;
|
||||
else if (mode <= 96)
|
||||
csr6 |= DMA_CONTROL_RTC_96;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_RTC_128;
|
||||
}
|
||||
|
||||
/* Configure flow control based on rx fifo size */
|
||||
csr6 = dwmac1000_configure_fc(csr6, fifosz);
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_operation_mode_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode == SF_DMA_MODE) {
|
||||
pr_debug("GMAC: enable TX store and forward mode\n");
|
||||
/* Transmit COE type 2 cannot be done in cut-through mode. */
|
||||
csr6 |= DMA_CONTROL_TSF;
|
||||
/* Operating on second frame increase the performance
|
||||
* especially when transmit store-and-forward is used.
|
||||
*/
|
||||
csr6 |= DMA_CONTROL_OSF;
|
||||
} else {
|
||||
pr_debug("GMAC: disabling TX SF (threshold %d)\n", mode);
|
||||
csr6 &= ~DMA_CONTROL_TSF;
|
||||
csr6 &= DMA_CONTROL_TC_TX_MASK;
|
||||
/* Set the transmit threshold */
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_TTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_TTC_64;
|
||||
else if (mode <= 128)
|
||||
csr6 |= DMA_CONTROL_TTC_128;
|
||||
else if (mode <= 192)
|
||||
csr6 |= DMA_CONTROL_TTC_192;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_TTC_256;
|
||||
}
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac1000_dump_dma_regs(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 *reg_space)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_DWMAC1000_DMA_REGS; i++)
|
||||
if ((i < 12) || (i > 17))
|
||||
reg_space[DMA_BUS_MODE / 4 + i] =
|
||||
readl(ioaddr + DMA_BUS_MODE + i * 4);
|
||||
}
|
||||
|
||||
static int dwmac1000_get_hw_feature(void __iomem *ioaddr,
|
||||
struct dma_features *dma_cap)
|
||||
{
|
||||
u32 hw_cap = readl(ioaddr + DMA_HW_FEATURE);
|
||||
|
||||
if (!hw_cap) {
|
||||
/* 0x00000000 is the value read on old hardware that does not
|
||||
* implement this register
|
||||
*/
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
dma_cap->mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
|
||||
dma_cap->mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
|
||||
dma_cap->half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
|
||||
dma_cap->hash_filter = (hw_cap & DMA_HW_FEAT_HASHSEL) >> 4;
|
||||
dma_cap->multi_addr = (hw_cap & DMA_HW_FEAT_ADDMAC) >> 5;
|
||||
dma_cap->pcs = (hw_cap & DMA_HW_FEAT_PCSSEL) >> 6;
|
||||
dma_cap->sma_mdio = (hw_cap & DMA_HW_FEAT_SMASEL) >> 8;
|
||||
dma_cap->pmt_remote_wake_up = (hw_cap & DMA_HW_FEAT_RWKSEL) >> 9;
|
||||
dma_cap->pmt_magic_frame = (hw_cap & DMA_HW_FEAT_MGKSEL) >> 10;
|
||||
/* MMC */
|
||||
dma_cap->rmon = (hw_cap & DMA_HW_FEAT_MMCSEL) >> 11;
|
||||
/* IEEE 1588-2002 */
|
||||
dma_cap->time_stamp =
|
||||
(hw_cap & DMA_HW_FEAT_TSVER1SEL) >> 12;
|
||||
/* IEEE 1588-2008 */
|
||||
dma_cap->atime_stamp = (hw_cap & DMA_HW_FEAT_TSVER2SEL) >> 13;
|
||||
/* 802.3az - Energy-Efficient Ethernet (EEE) */
|
||||
dma_cap->eee = (hw_cap & DMA_HW_FEAT_EEESEL) >> 14;
|
||||
dma_cap->av = (hw_cap & DMA_HW_FEAT_AVSEL) >> 15;
|
||||
/* TX and RX csum */
|
||||
dma_cap->tx_coe = (hw_cap & DMA_HW_FEAT_TXCOESEL) >> 16;
|
||||
dma_cap->rx_coe_type1 = (hw_cap & DMA_HW_FEAT_RXTYP1COE) >> 17;
|
||||
dma_cap->rx_coe_type2 = (hw_cap & DMA_HW_FEAT_RXTYP2COE) >> 18;
|
||||
dma_cap->rxfifo_over_2048 = (hw_cap & DMA_HW_FEAT_RXFIFOSIZE) >> 19;
|
||||
/* TX and RX number of channels */
|
||||
dma_cap->number_rx_channel = (hw_cap & DMA_HW_FEAT_RXCHCNT) >> 20;
|
||||
dma_cap->number_tx_channel = (hw_cap & DMA_HW_FEAT_TXCHCNT) >> 22;
|
||||
/* Alternate (enhanced) DESC mode */
|
||||
dma_cap->enh_desc = (hw_cap & DMA_HW_FEAT_ENHDESSEL) >> 24;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwmac1000_rx_watchdog(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 riwt, u32 queue)
|
||||
{
|
||||
writel(riwt, ioaddr + DMA_RX_WATCHDOG);
|
||||
}
|
||||
|
||||
const struct stmmac_dma_ops dwmac1000_dma_ops = {
|
||||
.reset = dwmac_dma_reset,
|
||||
.init = dwmac1000_dma_init,
|
||||
.init_rx_chan = dwmac1000_dma_init_rx,
|
||||
.init_tx_chan = dwmac1000_dma_init_tx,
|
||||
.axi = dwmac1000_dma_axi,
|
||||
.dump_regs = dwmac1000_dump_dma_regs,
|
||||
.dma_rx_mode = dwmac1000_dma_operation_mode_rx,
|
||||
.dma_tx_mode = dwmac1000_dma_operation_mode_tx,
|
||||
.enable_dma_transmission = dwmac_enable_dma_transmission,
|
||||
.enable_dma_irq = dwmac_enable_dma_irq,
|
||||
.disable_dma_irq = dwmac_disable_dma_irq,
|
||||
.start_tx = dwmac_dma_start_tx,
|
||||
.stop_tx = dwmac_dma_stop_tx,
|
||||
.start_rx = dwmac_dma_start_rx,
|
||||
.stop_rx = dwmac_dma_stop_rx,
|
||||
.dma_interrupt = dwmac_dma_interrupt,
|
||||
.get_hw_feature = dwmac1000_get_hw_feature,
|
||||
.rx_watchdog = dwmac1000_rx_watchdog,
|
||||
};
|
||||
296
devices/stmmac/dwmac1000_dma-6.4-orig.c
Normal file
296
devices/stmmac/dwmac1000_dma-6.4-orig.c
Normal file
@@ -0,0 +1,296 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the GMAC on-chip Ethernet controller for ST SoCs.
|
||||
DWC Ether MAC 10/100/1000 Universal version 3.41a has been used for
|
||||
developing this code.
|
||||
|
||||
This contains the functions to handle the dma.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "dwmac1000.h"
|
||||
#include "dwmac_dma.h"
|
||||
|
||||
static void dwmac1000_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_AXI_BUS_MODE);
|
||||
int i;
|
||||
|
||||
pr_info("dwmac1000: Master AXI performs %s burst length\n",
|
||||
!(value & DMA_AXI_UNDEF) ? "fixed" : "any");
|
||||
|
||||
if (axi->axi_lpi_en)
|
||||
value |= DMA_AXI_EN_LPI;
|
||||
if (axi->axi_xit_frm)
|
||||
value |= DMA_AXI_LPI_XIT_FRM;
|
||||
|
||||
value &= ~DMA_AXI_WR_OSR_LMT;
|
||||
value |= (axi->axi_wr_osr_lmt & DMA_AXI_WR_OSR_LMT_MASK) <<
|
||||
DMA_AXI_WR_OSR_LMT_SHIFT;
|
||||
|
||||
value &= ~DMA_AXI_RD_OSR_LMT;
|
||||
value |= (axi->axi_rd_osr_lmt & DMA_AXI_RD_OSR_LMT_MASK) <<
|
||||
DMA_AXI_RD_OSR_LMT_SHIFT;
|
||||
|
||||
/* Depending on the UNDEF bit the Master AXI will perform any burst
|
||||
* length according to the BLEN programmed (by default all BLEN are
|
||||
* set).
|
||||
*/
|
||||
for (i = 0; i < AXI_BLEN; i++) {
|
||||
switch (axi->axi_blen[i]) {
|
||||
case 256:
|
||||
value |= DMA_AXI_BLEN256;
|
||||
break;
|
||||
case 128:
|
||||
value |= DMA_AXI_BLEN128;
|
||||
break;
|
||||
case 64:
|
||||
value |= DMA_AXI_BLEN64;
|
||||
break;
|
||||
case 32:
|
||||
value |= DMA_AXI_BLEN32;
|
||||
break;
|
||||
case 16:
|
||||
value |= DMA_AXI_BLEN16;
|
||||
break;
|
||||
case 8:
|
||||
value |= DMA_AXI_BLEN8;
|
||||
break;
|
||||
case 4:
|
||||
value |= DMA_AXI_BLEN4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
writel(value, ioaddr + DMA_AXI_BUS_MODE);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init(void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg, int atds)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
int txpbl = dma_cfg->txpbl ?: dma_cfg->pbl;
|
||||
int rxpbl = dma_cfg->rxpbl ?: dma_cfg->pbl;
|
||||
|
||||
/*
|
||||
* Set the DMA PBL (Programmable Burst Length) mode.
|
||||
*
|
||||
* Note: before stmmac core 3.50 this mode bit was 4xPBL, and
|
||||
* post 3.5 mode bit acts as 8*PBL.
|
||||
*/
|
||||
if (dma_cfg->pblx8)
|
||||
value |= DMA_BUS_MODE_MAXPBL;
|
||||
value |= DMA_BUS_MODE_USP;
|
||||
value &= ~(DMA_BUS_MODE_PBL_MASK | DMA_BUS_MODE_RPBL_MASK);
|
||||
value |= (txpbl << DMA_BUS_MODE_PBL_SHIFT);
|
||||
value |= (rxpbl << DMA_BUS_MODE_RPBL_SHIFT);
|
||||
|
||||
/* Set the Fixed burst mode */
|
||||
if (dma_cfg->fixed_burst)
|
||||
value |= DMA_BUS_MODE_FB;
|
||||
|
||||
/* Mixed Burst has no effect when fb is set */
|
||||
if (dma_cfg->mixed_burst)
|
||||
value |= DMA_BUS_MODE_MB;
|
||||
|
||||
if (atds)
|
||||
value |= DMA_BUS_MODE_ATDS;
|
||||
|
||||
if (dma_cfg->aal)
|
||||
value |= DMA_BUS_MODE_AAL;
|
||||
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* Mask interrupts by writing to CSR7 */
|
||||
writel(DMA_INTR_DEFAULT_MASK, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init_rx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_rx_phy, u32 chan)
|
||||
{
|
||||
/* RX descriptor base address list must be written into DMA CSR3 */
|
||||
writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_init_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_tx_phy, u32 chan)
|
||||
{
|
||||
/* TX descriptor base address list must be written into DMA CSR4 */
|
||||
writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
|
||||
}
|
||||
|
||||
static u32 dwmac1000_configure_fc(u32 csr6, int rxfifosz)
|
||||
{
|
||||
csr6 &= ~DMA_CONTROL_RFA_MASK;
|
||||
csr6 &= ~DMA_CONTROL_RFD_MASK;
|
||||
|
||||
/* Leave flow control disabled if receive fifo size is less than
|
||||
* 4K or 0. Otherwise, send XOFF when fifo is 1K less than full,
|
||||
* and send XON when 2K less than full.
|
||||
*/
|
||||
if (rxfifosz < 4096) {
|
||||
csr6 &= ~DMA_CONTROL_EFC;
|
||||
pr_debug("GMAC: disabling flow control, rxfifo too small(%d)\n",
|
||||
rxfifosz);
|
||||
} else {
|
||||
csr6 |= DMA_CONTROL_EFC;
|
||||
csr6 |= RFA_FULL_MINUS_1K;
|
||||
csr6 |= RFD_FULL_MINUS_2K;
|
||||
}
|
||||
return csr6;
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_operation_mode_rx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode == SF_DMA_MODE) {
|
||||
pr_debug("GMAC: enable RX store and forward mode\n");
|
||||
csr6 |= DMA_CONTROL_RSF;
|
||||
} else {
|
||||
pr_debug("GMAC: disable RX SF mode (threshold %d)\n", mode);
|
||||
csr6 &= ~DMA_CONTROL_RSF;
|
||||
csr6 &= DMA_CONTROL_TC_RX_MASK;
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_RTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_RTC_64;
|
||||
else if (mode <= 96)
|
||||
csr6 |= DMA_CONTROL_RTC_96;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_RTC_128;
|
||||
}
|
||||
|
||||
/* Configure flow control based on rx fifo size */
|
||||
csr6 = dwmac1000_configure_fc(csr6, fifosz);
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac1000_dma_operation_mode_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode == SF_DMA_MODE) {
|
||||
pr_debug("GMAC: enable TX store and forward mode\n");
|
||||
/* Transmit COE type 2 cannot be done in cut-through mode. */
|
||||
csr6 |= DMA_CONTROL_TSF;
|
||||
/* Operating on second frame increase the performance
|
||||
* especially when transmit store-and-forward is used.
|
||||
*/
|
||||
csr6 |= DMA_CONTROL_OSF;
|
||||
} else {
|
||||
pr_debug("GMAC: disabling TX SF (threshold %d)\n", mode);
|
||||
csr6 &= ~DMA_CONTROL_TSF;
|
||||
csr6 &= DMA_CONTROL_TC_TX_MASK;
|
||||
/* Set the transmit threshold */
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_TTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_TTC_64;
|
||||
else if (mode <= 128)
|
||||
csr6 |= DMA_CONTROL_TTC_128;
|
||||
else if (mode <= 192)
|
||||
csr6 |= DMA_CONTROL_TTC_192;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_TTC_256;
|
||||
}
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac1000_dump_dma_regs(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 *reg_space)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_DWMAC1000_DMA_REGS; i++)
|
||||
if ((i < 12) || (i > 17))
|
||||
reg_space[DMA_BUS_MODE / 4 + i] =
|
||||
readl(ioaddr + DMA_BUS_MODE + i * 4);
|
||||
}
|
||||
|
||||
static int dwmac1000_get_hw_feature(void __iomem *ioaddr,
|
||||
struct dma_features *dma_cap)
|
||||
{
|
||||
u32 hw_cap = readl(ioaddr + DMA_HW_FEATURE);
|
||||
|
||||
if (!hw_cap) {
|
||||
/* 0x00000000 is the value read on old hardware that does not
|
||||
* implement this register
|
||||
*/
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
dma_cap->mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
|
||||
dma_cap->mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
|
||||
dma_cap->half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
|
||||
dma_cap->hash_filter = (hw_cap & DMA_HW_FEAT_HASHSEL) >> 4;
|
||||
dma_cap->multi_addr = (hw_cap & DMA_HW_FEAT_ADDMAC) >> 5;
|
||||
dma_cap->pcs = (hw_cap & DMA_HW_FEAT_PCSSEL) >> 6;
|
||||
dma_cap->sma_mdio = (hw_cap & DMA_HW_FEAT_SMASEL) >> 8;
|
||||
dma_cap->pmt_remote_wake_up = (hw_cap & DMA_HW_FEAT_RWKSEL) >> 9;
|
||||
dma_cap->pmt_magic_frame = (hw_cap & DMA_HW_FEAT_MGKSEL) >> 10;
|
||||
/* MMC */
|
||||
dma_cap->rmon = (hw_cap & DMA_HW_FEAT_MMCSEL) >> 11;
|
||||
/* IEEE 1588-2002 */
|
||||
dma_cap->time_stamp =
|
||||
(hw_cap & DMA_HW_FEAT_TSVER1SEL) >> 12;
|
||||
/* IEEE 1588-2008 */
|
||||
dma_cap->atime_stamp = (hw_cap & DMA_HW_FEAT_TSVER2SEL) >> 13;
|
||||
/* 802.3az - Energy-Efficient Ethernet (EEE) */
|
||||
dma_cap->eee = (hw_cap & DMA_HW_FEAT_EEESEL) >> 14;
|
||||
dma_cap->av = (hw_cap & DMA_HW_FEAT_AVSEL) >> 15;
|
||||
/* TX and RX csum */
|
||||
dma_cap->tx_coe = (hw_cap & DMA_HW_FEAT_TXCOESEL) >> 16;
|
||||
dma_cap->rx_coe_type1 = (hw_cap & DMA_HW_FEAT_RXTYP1COE) >> 17;
|
||||
dma_cap->rx_coe_type2 = (hw_cap & DMA_HW_FEAT_RXTYP2COE) >> 18;
|
||||
dma_cap->rxfifo_over_2048 = (hw_cap & DMA_HW_FEAT_RXFIFOSIZE) >> 19;
|
||||
/* TX and RX number of channels */
|
||||
dma_cap->number_rx_channel = (hw_cap & DMA_HW_FEAT_RXCHCNT) >> 20;
|
||||
dma_cap->number_tx_channel = (hw_cap & DMA_HW_FEAT_TXCHCNT) >> 22;
|
||||
/* Alternate (enhanced) DESC mode */
|
||||
dma_cap->enh_desc = (hw_cap & DMA_HW_FEAT_ENHDESSEL) >> 24;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwmac1000_rx_watchdog(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 riwt, u32 queue)
|
||||
{
|
||||
writel(riwt, ioaddr + DMA_RX_WATCHDOG);
|
||||
}
|
||||
|
||||
const struct stmmac_dma_ops dwmac1000_dma_ops = {
|
||||
.reset = dwmac_dma_reset,
|
||||
.init = dwmac1000_dma_init,
|
||||
.init_rx_chan = dwmac1000_dma_init_rx,
|
||||
.init_tx_chan = dwmac1000_dma_init_tx,
|
||||
.axi = dwmac1000_dma_axi,
|
||||
.dump_regs = dwmac1000_dump_dma_regs,
|
||||
.dma_rx_mode = dwmac1000_dma_operation_mode_rx,
|
||||
.dma_tx_mode = dwmac1000_dma_operation_mode_tx,
|
||||
.enable_dma_transmission = dwmac_enable_dma_transmission,
|
||||
.enable_dma_irq = dwmac_enable_dma_irq,
|
||||
.disable_dma_irq = dwmac_disable_dma_irq,
|
||||
.start_tx = dwmac_dma_start_tx,
|
||||
.stop_tx = dwmac_dma_stop_tx,
|
||||
.start_rx = dwmac_dma_start_rx,
|
||||
.stop_rx = dwmac_dma_stop_rx,
|
||||
.dma_interrupt = dwmac_dma_interrupt,
|
||||
.get_hw_feature = dwmac1000_get_hw_feature,
|
||||
.rx_watchdog = dwmac1000_rx_watchdog,
|
||||
};
|
||||
193
devices/stmmac/dwmac100_core-6.4-ethercat.c
Normal file
193
devices/stmmac/dwmac100_core-6.4-ethercat.c
Normal file
@@ -0,0 +1,193 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the MAC 10/100 on-chip Ethernet controller
|
||||
currently tested on all the ST boards based on STb7109 and stx7200 SoCs.
|
||||
|
||||
DWC Ether MAC 10/100 Universal version 4.0 has been used for developing
|
||||
this code.
|
||||
|
||||
This only implements the mac core functions for this chip.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/crc32.h>
|
||||
#include <asm/io.h>
|
||||
#include "stmmac-6.4-ethercat.h"
|
||||
#include "dwmac100-6.4-ethercat.h"
|
||||
|
||||
static void dwmac100_core_init(struct mac_device_info *hw,
|
||||
struct net_device *dev)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
value |= MAC_CORE_INIT;
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
|
||||
#ifdef STMMAC_VLAN_TAG_USED
|
||||
writel(ETH_P_8021Q, ioaddr + MAC_VLAN1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void dwmac100_dump_mac_regs(struct mac_device_info *hw, u32 *reg_space)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
|
||||
reg_space[MAC_CONTROL / 4] = readl(ioaddr + MAC_CONTROL);
|
||||
reg_space[MAC_ADDR_HIGH / 4] = readl(ioaddr + MAC_ADDR_HIGH);
|
||||
reg_space[MAC_ADDR_LOW / 4] = readl(ioaddr + MAC_ADDR_LOW);
|
||||
reg_space[MAC_HASH_HIGH / 4] = readl(ioaddr + MAC_HASH_HIGH);
|
||||
reg_space[MAC_HASH_LOW / 4] = readl(ioaddr + MAC_HASH_LOW);
|
||||
reg_space[MAC_FLOW_CTRL / 4] = readl(ioaddr + MAC_FLOW_CTRL);
|
||||
reg_space[MAC_VLAN1 / 4] = readl(ioaddr + MAC_VLAN1);
|
||||
reg_space[MAC_VLAN2 / 4] = readl(ioaddr + MAC_VLAN2);
|
||||
}
|
||||
|
||||
static int dwmac100_rx_ipc_enable(struct mac_device_info *hw)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwmac100_irq_status(struct mac_device_info *hw,
|
||||
struct stmmac_extra_stats *x)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwmac100_set_umac_addr(struct mac_device_info *hw,
|
||||
const unsigned char *addr,
|
||||
unsigned int reg_n)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
stmmac_set_mac_addr(ioaddr, addr, MAC_ADDR_HIGH, MAC_ADDR_LOW);
|
||||
}
|
||||
|
||||
static void dwmac100_get_umac_addr(struct mac_device_info *hw,
|
||||
unsigned char *addr,
|
||||
unsigned int reg_n)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
stmmac_get_mac_addr(ioaddr, addr, MAC_ADDR_HIGH, MAC_ADDR_LOW);
|
||||
}
|
||||
|
||||
static void dwmac100_set_filter(struct mac_device_info *hw,
|
||||
struct net_device *dev)
|
||||
{
|
||||
void __iomem *ioaddr = (void __iomem *)dev->base_addr;
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
value |= MAC_CONTROL_PR;
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_IF | MAC_CONTROL_HO |
|
||||
MAC_CONTROL_HP);
|
||||
} else if ((netdev_mc_count(dev) > HASH_TABLE_SIZE)
|
||||
|| (dev->flags & IFF_ALLMULTI)) {
|
||||
value |= MAC_CONTROL_PM;
|
||||
value &= ~(MAC_CONTROL_PR | MAC_CONTROL_IF | MAC_CONTROL_HO);
|
||||
writel(0xffffffff, ioaddr + MAC_HASH_HIGH);
|
||||
writel(0xffffffff, ioaddr + MAC_HASH_LOW);
|
||||
} else if (netdev_mc_empty(dev)) { /* no multicast */
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR | MAC_CONTROL_IF |
|
||||
MAC_CONTROL_HO | MAC_CONTROL_HP);
|
||||
} else {
|
||||
u32 mc_filter[2];
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
/* Perfect filter mode for physical address and Hash
|
||||
* filter for multicast
|
||||
*/
|
||||
value |= MAC_CONTROL_HP;
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR |
|
||||
MAC_CONTROL_IF | MAC_CONTROL_HO);
|
||||
|
||||
memset(mc_filter, 0, sizeof(mc_filter));
|
||||
netdev_for_each_mc_addr(ha, dev) {
|
||||
/* The upper 6 bits of the calculated CRC are used to
|
||||
* index the contens of the hash table
|
||||
*/
|
||||
int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
|
||||
/* The most significant bit determines the register to
|
||||
* use (H/L) while the other 5 bits determine the bit
|
||||
* within the register.
|
||||
*/
|
||||
mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
|
||||
}
|
||||
writel(mc_filter[0], ioaddr + MAC_HASH_LOW);
|
||||
writel(mc_filter[1], ioaddr + MAC_HASH_HIGH);
|
||||
}
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac100_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time,
|
||||
u32 tx_cnt)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
unsigned int flow = MAC_FLOW_CTRL_ENABLE;
|
||||
|
||||
if (duplex)
|
||||
flow |= (pause_time << MAC_FLOW_CTRL_PT_SHIFT);
|
||||
writel(flow, ioaddr + MAC_FLOW_CTRL);
|
||||
}
|
||||
|
||||
/* No PMT module supported on ST boards with this Eth chip. */
|
||||
static void dwmac100_pmt(struct mac_device_info *hw, unsigned long mode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static void dwmac100_set_mac_loopback(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
if (enable)
|
||||
value |= MAC_CONTROL_OM;
|
||||
else
|
||||
value &= ~MAC_CONTROL_OM;
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
}
|
||||
|
||||
const struct stmmac_ops dwmac100_ops = {
|
||||
.core_init = dwmac100_core_init,
|
||||
.set_mac = stmmac_set_mac,
|
||||
.rx_ipc = dwmac100_rx_ipc_enable,
|
||||
.dump_regs = dwmac100_dump_mac_regs,
|
||||
.host_irq_status = dwmac100_irq_status,
|
||||
.set_filter = dwmac100_set_filter,
|
||||
.flow_ctrl = dwmac100_flow_ctrl,
|
||||
.pmt = dwmac100_pmt,
|
||||
.set_umac_addr = dwmac100_set_umac_addr,
|
||||
.get_umac_addr = dwmac100_get_umac_addr,
|
||||
.set_mac_loopback = dwmac100_set_mac_loopback,
|
||||
};
|
||||
|
||||
int dwmac100_setup(struct stmmac_priv *priv)
|
||||
{
|
||||
struct mac_device_info *mac = priv->hw;
|
||||
|
||||
dev_info(priv->device, "\tDWMAC100\n");
|
||||
|
||||
mac->pcsr = priv->ioaddr;
|
||||
mac->link.duplex = MAC_CONTROL_F;
|
||||
mac->link.speed10 = 0;
|
||||
mac->link.speed100 = 0;
|
||||
mac->link.speed1000 = 0;
|
||||
mac->link.speed_mask = MAC_CONTROL_PS;
|
||||
mac->mii.addr = MAC_MII_ADDR;
|
||||
mac->mii.data = MAC_MII_DATA;
|
||||
mac->mii.addr_shift = 11;
|
||||
mac->mii.addr_mask = 0x0000F800;
|
||||
mac->mii.reg_shift = 6;
|
||||
mac->mii.reg_mask = 0x000007C0;
|
||||
mac->mii.clk_csr_shift = 2;
|
||||
mac->mii.clk_csr_mask = GENMASK(5, 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
193
devices/stmmac/dwmac100_core-6.4-orig.c
Normal file
193
devices/stmmac/dwmac100_core-6.4-orig.c
Normal file
@@ -0,0 +1,193 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the MAC 10/100 on-chip Ethernet controller
|
||||
currently tested on all the ST boards based on STb7109 and stx7200 SoCs.
|
||||
|
||||
DWC Ether MAC 10/100 Universal version 4.0 has been used for developing
|
||||
this code.
|
||||
|
||||
This only implements the mac core functions for this chip.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/crc32.h>
|
||||
#include <asm/io.h>
|
||||
#include "stmmac.h"
|
||||
#include "dwmac100.h"
|
||||
|
||||
static void dwmac100_core_init(struct mac_device_info *hw,
|
||||
struct net_device *dev)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
value |= MAC_CORE_INIT;
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
|
||||
#ifdef STMMAC_VLAN_TAG_USED
|
||||
writel(ETH_P_8021Q, ioaddr + MAC_VLAN1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void dwmac100_dump_mac_regs(struct mac_device_info *hw, u32 *reg_space)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
|
||||
reg_space[MAC_CONTROL / 4] = readl(ioaddr + MAC_CONTROL);
|
||||
reg_space[MAC_ADDR_HIGH / 4] = readl(ioaddr + MAC_ADDR_HIGH);
|
||||
reg_space[MAC_ADDR_LOW / 4] = readl(ioaddr + MAC_ADDR_LOW);
|
||||
reg_space[MAC_HASH_HIGH / 4] = readl(ioaddr + MAC_HASH_HIGH);
|
||||
reg_space[MAC_HASH_LOW / 4] = readl(ioaddr + MAC_HASH_LOW);
|
||||
reg_space[MAC_FLOW_CTRL / 4] = readl(ioaddr + MAC_FLOW_CTRL);
|
||||
reg_space[MAC_VLAN1 / 4] = readl(ioaddr + MAC_VLAN1);
|
||||
reg_space[MAC_VLAN2 / 4] = readl(ioaddr + MAC_VLAN2);
|
||||
}
|
||||
|
||||
static int dwmac100_rx_ipc_enable(struct mac_device_info *hw)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwmac100_irq_status(struct mac_device_info *hw,
|
||||
struct stmmac_extra_stats *x)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwmac100_set_umac_addr(struct mac_device_info *hw,
|
||||
const unsigned char *addr,
|
||||
unsigned int reg_n)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
stmmac_set_mac_addr(ioaddr, addr, MAC_ADDR_HIGH, MAC_ADDR_LOW);
|
||||
}
|
||||
|
||||
static void dwmac100_get_umac_addr(struct mac_device_info *hw,
|
||||
unsigned char *addr,
|
||||
unsigned int reg_n)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
stmmac_get_mac_addr(ioaddr, addr, MAC_ADDR_HIGH, MAC_ADDR_LOW);
|
||||
}
|
||||
|
||||
static void dwmac100_set_filter(struct mac_device_info *hw,
|
||||
struct net_device *dev)
|
||||
{
|
||||
void __iomem *ioaddr = (void __iomem *)dev->base_addr;
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
value |= MAC_CONTROL_PR;
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_IF | MAC_CONTROL_HO |
|
||||
MAC_CONTROL_HP);
|
||||
} else if ((netdev_mc_count(dev) > HASH_TABLE_SIZE)
|
||||
|| (dev->flags & IFF_ALLMULTI)) {
|
||||
value |= MAC_CONTROL_PM;
|
||||
value &= ~(MAC_CONTROL_PR | MAC_CONTROL_IF | MAC_CONTROL_HO);
|
||||
writel(0xffffffff, ioaddr + MAC_HASH_HIGH);
|
||||
writel(0xffffffff, ioaddr + MAC_HASH_LOW);
|
||||
} else if (netdev_mc_empty(dev)) { /* no multicast */
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR | MAC_CONTROL_IF |
|
||||
MAC_CONTROL_HO | MAC_CONTROL_HP);
|
||||
} else {
|
||||
u32 mc_filter[2];
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
/* Perfect filter mode for physical address and Hash
|
||||
* filter for multicast
|
||||
*/
|
||||
value |= MAC_CONTROL_HP;
|
||||
value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR |
|
||||
MAC_CONTROL_IF | MAC_CONTROL_HO);
|
||||
|
||||
memset(mc_filter, 0, sizeof(mc_filter));
|
||||
netdev_for_each_mc_addr(ha, dev) {
|
||||
/* The upper 6 bits of the calculated CRC are used to
|
||||
* index the contens of the hash table
|
||||
*/
|
||||
int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
|
||||
/* The most significant bit determines the register to
|
||||
* use (H/L) while the other 5 bits determine the bit
|
||||
* within the register.
|
||||
*/
|
||||
mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
|
||||
}
|
||||
writel(mc_filter[0], ioaddr + MAC_HASH_LOW);
|
||||
writel(mc_filter[1], ioaddr + MAC_HASH_HIGH);
|
||||
}
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac100_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time,
|
||||
u32 tx_cnt)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
unsigned int flow = MAC_FLOW_CTRL_ENABLE;
|
||||
|
||||
if (duplex)
|
||||
flow |= (pause_time << MAC_FLOW_CTRL_PT_SHIFT);
|
||||
writel(flow, ioaddr + MAC_FLOW_CTRL);
|
||||
}
|
||||
|
||||
/* No PMT module supported on ST boards with this Eth chip. */
|
||||
static void dwmac100_pmt(struct mac_device_info *hw, unsigned long mode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static void dwmac100_set_mac_loopback(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 value = readl(ioaddr + MAC_CONTROL);
|
||||
|
||||
if (enable)
|
||||
value |= MAC_CONTROL_OM;
|
||||
else
|
||||
value &= ~MAC_CONTROL_OM;
|
||||
|
||||
writel(value, ioaddr + MAC_CONTROL);
|
||||
}
|
||||
|
||||
const struct stmmac_ops dwmac100_ops = {
|
||||
.core_init = dwmac100_core_init,
|
||||
.set_mac = stmmac_set_mac,
|
||||
.rx_ipc = dwmac100_rx_ipc_enable,
|
||||
.dump_regs = dwmac100_dump_mac_regs,
|
||||
.host_irq_status = dwmac100_irq_status,
|
||||
.set_filter = dwmac100_set_filter,
|
||||
.flow_ctrl = dwmac100_flow_ctrl,
|
||||
.pmt = dwmac100_pmt,
|
||||
.set_umac_addr = dwmac100_set_umac_addr,
|
||||
.get_umac_addr = dwmac100_get_umac_addr,
|
||||
.set_mac_loopback = dwmac100_set_mac_loopback,
|
||||
};
|
||||
|
||||
int dwmac100_setup(struct stmmac_priv *priv)
|
||||
{
|
||||
struct mac_device_info *mac = priv->hw;
|
||||
|
||||
dev_info(priv->device, "\tDWMAC100\n");
|
||||
|
||||
mac->pcsr = priv->ioaddr;
|
||||
mac->link.duplex = MAC_CONTROL_F;
|
||||
mac->link.speed10 = 0;
|
||||
mac->link.speed100 = 0;
|
||||
mac->link.speed1000 = 0;
|
||||
mac->link.speed_mask = MAC_CONTROL_PS;
|
||||
mac->mii.addr = MAC_MII_ADDR;
|
||||
mac->mii.data = MAC_MII_DATA;
|
||||
mac->mii.addr_shift = 11;
|
||||
mac->mii.addr_mask = 0x0000F800;
|
||||
mac->mii.reg_shift = 6;
|
||||
mac->mii.reg_mask = 0x000007C0;
|
||||
mac->mii.clk_csr_shift = 2;
|
||||
mac->mii.clk_csr_mask = GENMASK(5, 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
129
devices/stmmac/dwmac100_dma-6.4-ethercat.c
Normal file
129
devices/stmmac/dwmac100_dma-6.4-ethercat.c
Normal file
@@ -0,0 +1,129 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the MAC 10/100 on-chip Ethernet controller
|
||||
currently tested on all the ST boards based on STb7109 and stx7200 SoCs.
|
||||
|
||||
DWC Ether MAC 10/100 Universal version 4.0 has been used for developing
|
||||
this code.
|
||||
|
||||
This contains the functions to handle the dma.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "dwmac100-6.4-ethercat.h"
|
||||
#include "dwmac_dma-6.4-ethercat.h"
|
||||
|
||||
static void dwmac100_dma_init(void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg, int atds)
|
||||
{
|
||||
/* Enable Application Access by writing to DMA CSR0 */
|
||||
writel(DMA_BUS_MODE_DEFAULT | (dma_cfg->pbl << DMA_BUS_MODE_PBL_SHIFT),
|
||||
ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* Mask interrupts by writing to CSR7 */
|
||||
writel(DMA_INTR_DEFAULT_MASK, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
static void dwmac100_dma_init_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_rx_phy, u32 chan)
|
||||
{
|
||||
/* RX descriptor base addr lists must be written into DMA CSR3 */
|
||||
writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
|
||||
}
|
||||
|
||||
static void dwmac100_dma_init_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_tx_phy, u32 chan)
|
||||
{
|
||||
/* TX descriptor base addr lists must be written into DMA CSR4 */
|
||||
writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
|
||||
}
|
||||
|
||||
/* Store and Forward capability is not used at all.
|
||||
*
|
||||
* The transmit threshold can be programmed by setting the TTC bits in the DMA
|
||||
* control register.
|
||||
*/
|
||||
static void dwmac100_dma_operation_mode_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_TTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_TTC_64;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_TTC_128;
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac100_dump_dma_regs(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 *reg_space)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_DWMAC100_DMA_REGS; i++)
|
||||
reg_space[DMA_BUS_MODE / 4 + i] =
|
||||
readl(ioaddr + DMA_BUS_MODE + i * 4);
|
||||
|
||||
reg_space[DMA_CUR_TX_BUF_ADDR / 4] =
|
||||
readl(ioaddr + DMA_CUR_TX_BUF_ADDR);
|
||||
reg_space[DMA_CUR_RX_BUF_ADDR / 4] =
|
||||
readl(ioaddr + DMA_CUR_RX_BUF_ADDR);
|
||||
}
|
||||
|
||||
/* DMA controller has two counters to track the number of the missed frames. */
|
||||
static void dwmac100_dma_diagnostic_fr(struct net_device_stats *stats,
|
||||
struct stmmac_extra_stats *x,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
u32 csr8 = readl(ioaddr + DMA_MISSED_FRAME_CTR);
|
||||
|
||||
if (unlikely(csr8)) {
|
||||
if (csr8 & DMA_MISSED_FRAME_OVE) {
|
||||
stats->rx_over_errors += 0x800;
|
||||
x->rx_overflow_cntr += 0x800;
|
||||
} else {
|
||||
unsigned int ove_cntr;
|
||||
ove_cntr = ((csr8 & DMA_MISSED_FRAME_OVE_CNTR) >> 17);
|
||||
stats->rx_over_errors += ove_cntr;
|
||||
x->rx_overflow_cntr += ove_cntr;
|
||||
}
|
||||
|
||||
if (csr8 & DMA_MISSED_FRAME_OVE_M) {
|
||||
stats->rx_missed_errors += 0xffff;
|
||||
x->rx_missed_cntr += 0xffff;
|
||||
} else {
|
||||
unsigned int miss_f = (csr8 & DMA_MISSED_FRAME_M_CNTR);
|
||||
stats->rx_missed_errors += miss_f;
|
||||
x->rx_missed_cntr += miss_f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const struct stmmac_dma_ops dwmac100_dma_ops = {
|
||||
.reset = dwmac_dma_reset,
|
||||
.init = dwmac100_dma_init,
|
||||
.init_rx_chan = dwmac100_dma_init_rx,
|
||||
.init_tx_chan = dwmac100_dma_init_tx,
|
||||
.dump_regs = dwmac100_dump_dma_regs,
|
||||
.dma_tx_mode = dwmac100_dma_operation_mode_tx,
|
||||
.dma_diagnostic_fr = dwmac100_dma_diagnostic_fr,
|
||||
.enable_dma_transmission = dwmac_enable_dma_transmission,
|
||||
.enable_dma_irq = dwmac_enable_dma_irq,
|
||||
.disable_dma_irq = dwmac_disable_dma_irq,
|
||||
.start_tx = dwmac_dma_start_tx,
|
||||
.stop_tx = dwmac_dma_stop_tx,
|
||||
.start_rx = dwmac_dma_start_rx,
|
||||
.stop_rx = dwmac_dma_stop_rx,
|
||||
.dma_interrupt = dwmac_dma_interrupt,
|
||||
};
|
||||
129
devices/stmmac/dwmac100_dma-6.4-orig.c
Normal file
129
devices/stmmac/dwmac100_dma-6.4-orig.c
Normal file
@@ -0,0 +1,129 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
This is the driver for the MAC 10/100 on-chip Ethernet controller
|
||||
currently tested on all the ST boards based on STb7109 and stx7200 SoCs.
|
||||
|
||||
DWC Ether MAC 10/100 Universal version 4.0 has been used for developing
|
||||
this code.
|
||||
|
||||
This contains the functions to handle the dma.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "dwmac100.h"
|
||||
#include "dwmac_dma.h"
|
||||
|
||||
static void dwmac100_dma_init(void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg, int atds)
|
||||
{
|
||||
/* Enable Application Access by writing to DMA CSR0 */
|
||||
writel(DMA_BUS_MODE_DEFAULT | (dma_cfg->pbl << DMA_BUS_MODE_PBL_SHIFT),
|
||||
ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* Mask interrupts by writing to CSR7 */
|
||||
writel(DMA_INTR_DEFAULT_MASK, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
static void dwmac100_dma_init_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_rx_phy, u32 chan)
|
||||
{
|
||||
/* RX descriptor base addr lists must be written into DMA CSR3 */
|
||||
writel(lower_32_bits(dma_rx_phy), ioaddr + DMA_RCV_BASE_ADDR);
|
||||
}
|
||||
|
||||
static void dwmac100_dma_init_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_dma_cfg *dma_cfg,
|
||||
dma_addr_t dma_tx_phy, u32 chan)
|
||||
{
|
||||
/* TX descriptor base addr lists must be written into DMA CSR4 */
|
||||
writel(lower_32_bits(dma_tx_phy), ioaddr + DMA_TX_BASE_ADDR);
|
||||
}
|
||||
|
||||
/* Store and Forward capability is not used at all.
|
||||
*
|
||||
* The transmit threshold can be programmed by setting the TTC bits in the DMA
|
||||
* control register.
|
||||
*/
|
||||
static void dwmac100_dma_operation_mode_tx(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, int mode,
|
||||
u32 channel, int fifosz, u8 qmode)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
|
||||
if (mode <= 32)
|
||||
csr6 |= DMA_CONTROL_TTC_32;
|
||||
else if (mode <= 64)
|
||||
csr6 |= DMA_CONTROL_TTC_64;
|
||||
else
|
||||
csr6 |= DMA_CONTROL_TTC_128;
|
||||
|
||||
writel(csr6, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
static void dwmac100_dump_dma_regs(struct stmmac_priv *priv,
|
||||
void __iomem *ioaddr, u32 *reg_space)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_DWMAC100_DMA_REGS; i++)
|
||||
reg_space[DMA_BUS_MODE / 4 + i] =
|
||||
readl(ioaddr + DMA_BUS_MODE + i * 4);
|
||||
|
||||
reg_space[DMA_CUR_TX_BUF_ADDR / 4] =
|
||||
readl(ioaddr + DMA_CUR_TX_BUF_ADDR);
|
||||
reg_space[DMA_CUR_RX_BUF_ADDR / 4] =
|
||||
readl(ioaddr + DMA_CUR_RX_BUF_ADDR);
|
||||
}
|
||||
|
||||
/* DMA controller has two counters to track the number of the missed frames. */
|
||||
static void dwmac100_dma_diagnostic_fr(struct net_device_stats *stats,
|
||||
struct stmmac_extra_stats *x,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
u32 csr8 = readl(ioaddr + DMA_MISSED_FRAME_CTR);
|
||||
|
||||
if (unlikely(csr8)) {
|
||||
if (csr8 & DMA_MISSED_FRAME_OVE) {
|
||||
stats->rx_over_errors += 0x800;
|
||||
x->rx_overflow_cntr += 0x800;
|
||||
} else {
|
||||
unsigned int ove_cntr;
|
||||
ove_cntr = ((csr8 & DMA_MISSED_FRAME_OVE_CNTR) >> 17);
|
||||
stats->rx_over_errors += ove_cntr;
|
||||
x->rx_overflow_cntr += ove_cntr;
|
||||
}
|
||||
|
||||
if (csr8 & DMA_MISSED_FRAME_OVE_M) {
|
||||
stats->rx_missed_errors += 0xffff;
|
||||
x->rx_missed_cntr += 0xffff;
|
||||
} else {
|
||||
unsigned int miss_f = (csr8 & DMA_MISSED_FRAME_M_CNTR);
|
||||
stats->rx_missed_errors += miss_f;
|
||||
x->rx_missed_cntr += miss_f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const struct stmmac_dma_ops dwmac100_dma_ops = {
|
||||
.reset = dwmac_dma_reset,
|
||||
.init = dwmac100_dma_init,
|
||||
.init_rx_chan = dwmac100_dma_init_rx,
|
||||
.init_tx_chan = dwmac100_dma_init_tx,
|
||||
.dump_regs = dwmac100_dump_dma_regs,
|
||||
.dma_tx_mode = dwmac100_dma_operation_mode_tx,
|
||||
.dma_diagnostic_fr = dwmac100_dma_diagnostic_fr,
|
||||
.enable_dma_transmission = dwmac_enable_dma_transmission,
|
||||
.enable_dma_irq = dwmac_enable_dma_irq,
|
||||
.disable_dma_irq = dwmac_disable_dma_irq,
|
||||
.start_tx = dwmac_dma_start_tx,
|
||||
.stop_tx = dwmac_dma_stop_tx,
|
||||
.start_rx = dwmac_dma_start_rx,
|
||||
.stop_rx = dwmac_dma_stop_rx,
|
||||
.dma_interrupt = dwmac_dma_interrupt,
|
||||
};
|
||||
585
devices/stmmac/dwmac4-6.4-ethercat.h
Normal file
585
devices/stmmac/dwmac4-6.4-ethercat.h
Normal file
File diff suppressed because it is too large
Load Diff
585
devices/stmmac/dwmac4-6.4-orig.h
Normal file
585
devices/stmmac/dwmac4-6.4-orig.h
Normal file
File diff suppressed because it is too large
Load Diff
1337
devices/stmmac/dwmac4_core-6.4-ethercat.c
Normal file
1337
devices/stmmac/dwmac4_core-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
1337
devices/stmmac/dwmac4_core-6.4-orig.c
Normal file
1337
devices/stmmac/dwmac4_core-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
585
devices/stmmac/dwmac4_descs-6.4-ethercat.c
Normal file
585
devices/stmmac/dwmac4_descs-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
147
devices/stmmac/dwmac4_descs-6.4-ethercat.h
Normal file
147
devices/stmmac/dwmac4_descs-6.4-ethercat.h
Normal file
@@ -0,0 +1,147 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Header File to describe the DMA descriptors and related definitions specific
|
||||
* for DesignWare databook 4.xx.
|
||||
*
|
||||
* Copyright (C) 2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC4_DESCS_H__
|
||||
#define __DWMAC4_DESCS_H__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* Normal transmit descriptor defines (without split feature) */
|
||||
|
||||
/* TDES2 (read format) */
|
||||
#define TDES2_BUFFER1_SIZE_MASK GENMASK(13, 0)
|
||||
#define TDES2_VLAN_TAG_MASK GENMASK(15, 14)
|
||||
#define TDES2_VLAN_TAG_SHIFT 14
|
||||
#define TDES2_BUFFER2_SIZE_MASK GENMASK(29, 16)
|
||||
#define TDES2_BUFFER2_SIZE_MASK_SHIFT 16
|
||||
#define TDES3_IVTIR_MASK GENMASK(19, 18)
|
||||
#define TDES3_IVTIR_SHIFT 18
|
||||
#define TDES3_IVLTV BIT(17)
|
||||
#define TDES2_TIMESTAMP_ENABLE BIT(30)
|
||||
#define TDES2_IVT_MASK GENMASK(31, 16)
|
||||
#define TDES2_IVT_SHIFT 16
|
||||
#define TDES2_INTERRUPT_ON_COMPLETION BIT(31)
|
||||
|
||||
/* TDES3 (read format) */
|
||||
#define TDES3_PACKET_SIZE_MASK GENMASK(14, 0)
|
||||
#define TDES3_VLAN_TAG GENMASK(15, 0)
|
||||
#define TDES3_VLTV BIT(16)
|
||||
#define TDES3_CHECKSUM_INSERTION_MASK GENMASK(17, 16)
|
||||
#define TDES3_CHECKSUM_INSERTION_SHIFT 16
|
||||
#define TDES3_TCP_PKT_PAYLOAD_MASK GENMASK(17, 0)
|
||||
#define TDES3_TCP_SEGMENTATION_ENABLE BIT(18)
|
||||
#define TDES3_HDR_LEN_SHIFT 19
|
||||
#define TDES3_SLOT_NUMBER_MASK GENMASK(22, 19)
|
||||
#define TDES3_SA_INSERT_CTRL_MASK GENMASK(25, 23)
|
||||
#define TDES3_SA_INSERT_CTRL_SHIFT 23
|
||||
#define TDES3_CRC_PAD_CTRL_MASK GENMASK(27, 26)
|
||||
|
||||
/* TDES3 (write back format) */
|
||||
#define TDES3_IP_HDR_ERROR BIT(0)
|
||||
#define TDES3_DEFERRED BIT(1)
|
||||
#define TDES3_UNDERFLOW_ERROR BIT(2)
|
||||
#define TDES3_EXCESSIVE_DEFERRAL BIT(3)
|
||||
#define TDES3_COLLISION_COUNT_MASK GENMASK(7, 4)
|
||||
#define TDES3_COLLISION_COUNT_SHIFT 4
|
||||
#define TDES3_EXCESSIVE_COLLISION BIT(8)
|
||||
#define TDES3_LATE_COLLISION BIT(9)
|
||||
#define TDES3_NO_CARRIER BIT(10)
|
||||
#define TDES3_LOSS_CARRIER BIT(11)
|
||||
#define TDES3_PAYLOAD_ERROR BIT(12)
|
||||
#define TDES3_PACKET_FLUSHED BIT(13)
|
||||
#define TDES3_JABBER_TIMEOUT BIT(14)
|
||||
#define TDES3_ERROR_SUMMARY BIT(15)
|
||||
#define TDES3_TIMESTAMP_STATUS BIT(17)
|
||||
#define TDES3_TIMESTAMP_STATUS_SHIFT 17
|
||||
|
||||
/* TDES3 context */
|
||||
#define TDES3_CTXT_TCMSSV BIT(26)
|
||||
|
||||
/* TDES3 Common */
|
||||
#define TDES3_RS1V BIT(26)
|
||||
#define TDES3_RS1V_SHIFT 26
|
||||
#define TDES3_LAST_DESCRIPTOR BIT(28)
|
||||
#define TDES3_LAST_DESCRIPTOR_SHIFT 28
|
||||
#define TDES3_FIRST_DESCRIPTOR BIT(29)
|
||||
#define TDES3_CONTEXT_TYPE BIT(30)
|
||||
#define TDES3_CONTEXT_TYPE_SHIFT 30
|
||||
|
||||
/* TDES4 */
|
||||
#define TDES4_LTV BIT(31)
|
||||
#define TDES4_LT GENMASK(7, 0)
|
||||
|
||||
/* TDES5 */
|
||||
#define TDES5_LT GENMASK(31, 8)
|
||||
|
||||
/* TDS3 use for both format (read and write back) */
|
||||
#define TDES3_OWN BIT(31)
|
||||
#define TDES3_OWN_SHIFT 31
|
||||
|
||||
/* Normal receive descriptor defines (without split feature) */
|
||||
|
||||
/* RDES0 (write back format) */
|
||||
#define RDES0_VLAN_TAG_MASK GENMASK(15, 0)
|
||||
|
||||
/* RDES1 (write back format) */
|
||||
#define RDES1_IP_PAYLOAD_TYPE_MASK GENMASK(2, 0)
|
||||
#define RDES1_IP_HDR_ERROR BIT(3)
|
||||
#define RDES1_IPV4_HEADER BIT(4)
|
||||
#define RDES1_IPV6_HEADER BIT(5)
|
||||
#define RDES1_IP_CSUM_BYPASSED BIT(6)
|
||||
#define RDES1_IP_CSUM_ERROR BIT(7)
|
||||
#define RDES1_PTP_MSG_TYPE_MASK GENMASK(11, 8)
|
||||
#define RDES1_PTP_PACKET_TYPE BIT(12)
|
||||
#define RDES1_PTP_VER BIT(13)
|
||||
#define RDES1_TIMESTAMP_AVAILABLE BIT(14)
|
||||
#define RDES1_TIMESTAMP_AVAILABLE_SHIFT 14
|
||||
#define RDES1_TIMESTAMP_DROPPED BIT(15)
|
||||
#define RDES1_IP_TYPE1_CSUM_MASK GENMASK(31, 16)
|
||||
|
||||
/* RDES2 (write back format) */
|
||||
#define RDES2_L3_L4_HEADER_SIZE_MASK GENMASK(9, 0)
|
||||
#define RDES2_VLAN_FILTER_STATUS BIT(15)
|
||||
#define RDES2_SA_FILTER_FAIL BIT(16)
|
||||
#define RDES2_DA_FILTER_FAIL BIT(17)
|
||||
#define RDES2_HASH_FILTER_STATUS BIT(18)
|
||||
#define RDES2_MAC_ADDR_MATCH_MASK GENMASK(26, 19)
|
||||
#define RDES2_HASH_VALUE_MATCH_MASK GENMASK(26, 19)
|
||||
#define RDES2_L3_FILTER_MATCH BIT(27)
|
||||
#define RDES2_L4_FILTER_MATCH BIT(28)
|
||||
#define RDES2_L3_L4_FILT_NB_MATCH_MASK GENMASK(27, 26)
|
||||
#define RDES2_L3_L4_FILT_NB_MATCH_SHIFT 26
|
||||
#define RDES2_HL GENMASK(9, 0)
|
||||
|
||||
/* RDES3 (write back format) */
|
||||
#define RDES3_PACKET_SIZE_MASK GENMASK(14, 0)
|
||||
#define RDES3_ERROR_SUMMARY BIT(15)
|
||||
#define RDES3_PACKET_LEN_TYPE_MASK GENMASK(18, 16)
|
||||
#define RDES3_DRIBBLE_ERROR BIT(19)
|
||||
#define RDES3_RECEIVE_ERROR BIT(20)
|
||||
#define RDES3_OVERFLOW_ERROR BIT(21)
|
||||
#define RDES3_RECEIVE_WATCHDOG BIT(22)
|
||||
#define RDES3_GIANT_PACKET BIT(23)
|
||||
#define RDES3_CRC_ERROR BIT(24)
|
||||
#define RDES3_RDES0_VALID BIT(25)
|
||||
#define RDES3_RDES1_VALID BIT(26)
|
||||
#define RDES3_RDES2_VALID BIT(27)
|
||||
#define RDES3_LAST_DESCRIPTOR BIT(28)
|
||||
#define RDES3_FIRST_DESCRIPTOR BIT(29)
|
||||
#define RDES3_CONTEXT_DESCRIPTOR BIT(30)
|
||||
#define RDES3_CONTEXT_DESCRIPTOR_SHIFT 30
|
||||
|
||||
/* RDES3 (read format) */
|
||||
#define RDES3_BUFFER1_VALID_ADDR BIT(24)
|
||||
#define RDES3_BUFFER2_VALID_ADDR BIT(25)
|
||||
#define RDES3_INT_ON_COMPLETION_EN BIT(30)
|
||||
|
||||
/* TDS3 use for both format (read and write back) */
|
||||
#define RDES3_OWN BIT(31)
|
||||
|
||||
#endif /* __DWMAC4_DESCS_H__ */
|
||||
585
devices/stmmac/dwmac4_descs-6.4-orig.c
Normal file
585
devices/stmmac/dwmac4_descs-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
147
devices/stmmac/dwmac4_descs-6.4-orig.h
Normal file
147
devices/stmmac/dwmac4_descs-6.4-orig.h
Normal file
@@ -0,0 +1,147 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Header File to describe the DMA descriptors and related definitions specific
|
||||
* for DesignWare databook 4.xx.
|
||||
*
|
||||
* Copyright (C) 2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC4_DESCS_H__
|
||||
#define __DWMAC4_DESCS_H__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* Normal transmit descriptor defines (without split feature) */
|
||||
|
||||
/* TDES2 (read format) */
|
||||
#define TDES2_BUFFER1_SIZE_MASK GENMASK(13, 0)
|
||||
#define TDES2_VLAN_TAG_MASK GENMASK(15, 14)
|
||||
#define TDES2_VLAN_TAG_SHIFT 14
|
||||
#define TDES2_BUFFER2_SIZE_MASK GENMASK(29, 16)
|
||||
#define TDES2_BUFFER2_SIZE_MASK_SHIFT 16
|
||||
#define TDES3_IVTIR_MASK GENMASK(19, 18)
|
||||
#define TDES3_IVTIR_SHIFT 18
|
||||
#define TDES3_IVLTV BIT(17)
|
||||
#define TDES2_TIMESTAMP_ENABLE BIT(30)
|
||||
#define TDES2_IVT_MASK GENMASK(31, 16)
|
||||
#define TDES2_IVT_SHIFT 16
|
||||
#define TDES2_INTERRUPT_ON_COMPLETION BIT(31)
|
||||
|
||||
/* TDES3 (read format) */
|
||||
#define TDES3_PACKET_SIZE_MASK GENMASK(14, 0)
|
||||
#define TDES3_VLAN_TAG GENMASK(15, 0)
|
||||
#define TDES3_VLTV BIT(16)
|
||||
#define TDES3_CHECKSUM_INSERTION_MASK GENMASK(17, 16)
|
||||
#define TDES3_CHECKSUM_INSERTION_SHIFT 16
|
||||
#define TDES3_TCP_PKT_PAYLOAD_MASK GENMASK(17, 0)
|
||||
#define TDES3_TCP_SEGMENTATION_ENABLE BIT(18)
|
||||
#define TDES3_HDR_LEN_SHIFT 19
|
||||
#define TDES3_SLOT_NUMBER_MASK GENMASK(22, 19)
|
||||
#define TDES3_SA_INSERT_CTRL_MASK GENMASK(25, 23)
|
||||
#define TDES3_SA_INSERT_CTRL_SHIFT 23
|
||||
#define TDES3_CRC_PAD_CTRL_MASK GENMASK(27, 26)
|
||||
|
||||
/* TDES3 (write back format) */
|
||||
#define TDES3_IP_HDR_ERROR BIT(0)
|
||||
#define TDES3_DEFERRED BIT(1)
|
||||
#define TDES3_UNDERFLOW_ERROR BIT(2)
|
||||
#define TDES3_EXCESSIVE_DEFERRAL BIT(3)
|
||||
#define TDES3_COLLISION_COUNT_MASK GENMASK(7, 4)
|
||||
#define TDES3_COLLISION_COUNT_SHIFT 4
|
||||
#define TDES3_EXCESSIVE_COLLISION BIT(8)
|
||||
#define TDES3_LATE_COLLISION BIT(9)
|
||||
#define TDES3_NO_CARRIER BIT(10)
|
||||
#define TDES3_LOSS_CARRIER BIT(11)
|
||||
#define TDES3_PAYLOAD_ERROR BIT(12)
|
||||
#define TDES3_PACKET_FLUSHED BIT(13)
|
||||
#define TDES3_JABBER_TIMEOUT BIT(14)
|
||||
#define TDES3_ERROR_SUMMARY BIT(15)
|
||||
#define TDES3_TIMESTAMP_STATUS BIT(17)
|
||||
#define TDES3_TIMESTAMP_STATUS_SHIFT 17
|
||||
|
||||
/* TDES3 context */
|
||||
#define TDES3_CTXT_TCMSSV BIT(26)
|
||||
|
||||
/* TDES3 Common */
|
||||
#define TDES3_RS1V BIT(26)
|
||||
#define TDES3_RS1V_SHIFT 26
|
||||
#define TDES3_LAST_DESCRIPTOR BIT(28)
|
||||
#define TDES3_LAST_DESCRIPTOR_SHIFT 28
|
||||
#define TDES3_FIRST_DESCRIPTOR BIT(29)
|
||||
#define TDES3_CONTEXT_TYPE BIT(30)
|
||||
#define TDES3_CONTEXT_TYPE_SHIFT 30
|
||||
|
||||
/* TDES4 */
|
||||
#define TDES4_LTV BIT(31)
|
||||
#define TDES4_LT GENMASK(7, 0)
|
||||
|
||||
/* TDES5 */
|
||||
#define TDES5_LT GENMASK(31, 8)
|
||||
|
||||
/* TDS3 use for both format (read and write back) */
|
||||
#define TDES3_OWN BIT(31)
|
||||
#define TDES3_OWN_SHIFT 31
|
||||
|
||||
/* Normal receive descriptor defines (without split feature) */
|
||||
|
||||
/* RDES0 (write back format) */
|
||||
#define RDES0_VLAN_TAG_MASK GENMASK(15, 0)
|
||||
|
||||
/* RDES1 (write back format) */
|
||||
#define RDES1_IP_PAYLOAD_TYPE_MASK GENMASK(2, 0)
|
||||
#define RDES1_IP_HDR_ERROR BIT(3)
|
||||
#define RDES1_IPV4_HEADER BIT(4)
|
||||
#define RDES1_IPV6_HEADER BIT(5)
|
||||
#define RDES1_IP_CSUM_BYPASSED BIT(6)
|
||||
#define RDES1_IP_CSUM_ERROR BIT(7)
|
||||
#define RDES1_PTP_MSG_TYPE_MASK GENMASK(11, 8)
|
||||
#define RDES1_PTP_PACKET_TYPE BIT(12)
|
||||
#define RDES1_PTP_VER BIT(13)
|
||||
#define RDES1_TIMESTAMP_AVAILABLE BIT(14)
|
||||
#define RDES1_TIMESTAMP_AVAILABLE_SHIFT 14
|
||||
#define RDES1_TIMESTAMP_DROPPED BIT(15)
|
||||
#define RDES1_IP_TYPE1_CSUM_MASK GENMASK(31, 16)
|
||||
|
||||
/* RDES2 (write back format) */
|
||||
#define RDES2_L3_L4_HEADER_SIZE_MASK GENMASK(9, 0)
|
||||
#define RDES2_VLAN_FILTER_STATUS BIT(15)
|
||||
#define RDES2_SA_FILTER_FAIL BIT(16)
|
||||
#define RDES2_DA_FILTER_FAIL BIT(17)
|
||||
#define RDES2_HASH_FILTER_STATUS BIT(18)
|
||||
#define RDES2_MAC_ADDR_MATCH_MASK GENMASK(26, 19)
|
||||
#define RDES2_HASH_VALUE_MATCH_MASK GENMASK(26, 19)
|
||||
#define RDES2_L3_FILTER_MATCH BIT(27)
|
||||
#define RDES2_L4_FILTER_MATCH BIT(28)
|
||||
#define RDES2_L3_L4_FILT_NB_MATCH_MASK GENMASK(27, 26)
|
||||
#define RDES2_L3_L4_FILT_NB_MATCH_SHIFT 26
|
||||
#define RDES2_HL GENMASK(9, 0)
|
||||
|
||||
/* RDES3 (write back format) */
|
||||
#define RDES3_PACKET_SIZE_MASK GENMASK(14, 0)
|
||||
#define RDES3_ERROR_SUMMARY BIT(15)
|
||||
#define RDES3_PACKET_LEN_TYPE_MASK GENMASK(18, 16)
|
||||
#define RDES3_DRIBBLE_ERROR BIT(19)
|
||||
#define RDES3_RECEIVE_ERROR BIT(20)
|
||||
#define RDES3_OVERFLOW_ERROR BIT(21)
|
||||
#define RDES3_RECEIVE_WATCHDOG BIT(22)
|
||||
#define RDES3_GIANT_PACKET BIT(23)
|
||||
#define RDES3_CRC_ERROR BIT(24)
|
||||
#define RDES3_RDES0_VALID BIT(25)
|
||||
#define RDES3_RDES1_VALID BIT(26)
|
||||
#define RDES3_RDES2_VALID BIT(27)
|
||||
#define RDES3_LAST_DESCRIPTOR BIT(28)
|
||||
#define RDES3_FIRST_DESCRIPTOR BIT(29)
|
||||
#define RDES3_CONTEXT_DESCRIPTOR BIT(30)
|
||||
#define RDES3_CONTEXT_DESCRIPTOR_SHIFT 30
|
||||
|
||||
/* RDES3 (read format) */
|
||||
#define RDES3_BUFFER1_VALID_ADDR BIT(24)
|
||||
#define RDES3_BUFFER2_VALID_ADDR BIT(25)
|
||||
#define RDES3_INT_ON_COMPLETION_EN BIT(30)
|
||||
|
||||
/* TDS3 use for both format (read and write back) */
|
||||
#define RDES3_OWN BIT(31)
|
||||
|
||||
#endif /* __DWMAC4_DESCS_H__ */
|
||||
616
devices/stmmac/dwmac4_dma-6.4-ethercat.c
Normal file
616
devices/stmmac/dwmac4_dma-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
262
devices/stmmac/dwmac4_dma-6.4-ethercat.h
Normal file
262
devices/stmmac/dwmac4_dma-6.4-ethercat.h
Normal file
@@ -0,0 +1,262 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* DWMAC4 DMA Header file.
|
||||
*
|
||||
* Copyright (C) 2007-2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC4_DMA_H__
|
||||
#define __DWMAC4_DMA_H__
|
||||
|
||||
/* Define the max channel number used for tx (also rx).
|
||||
* dwmac4 accepts up to 8 channels for TX (and also 8 channels for RX
|
||||
*/
|
||||
#define DMA_CHANNEL_NB_MAX 1
|
||||
|
||||
#define DMA_BUS_MODE 0x00001000
|
||||
#define DMA_SYS_BUS_MODE 0x00001004
|
||||
#define DMA_STATUS 0x00001008
|
||||
#define DMA_DEBUG_STATUS_0 0x0000100c
|
||||
#define DMA_DEBUG_STATUS_1 0x00001010
|
||||
#define DMA_DEBUG_STATUS_2 0x00001014
|
||||
#define DMA_AXI_BUS_MODE 0x00001028
|
||||
#define DMA_TBS_CTRL 0x00001050
|
||||
|
||||
/* DMA Bus Mode bitmap */
|
||||
#define DMA_BUS_MODE_DCHE BIT(19)
|
||||
#define DMA_BUS_MODE_INTM_MASK GENMASK(17, 16)
|
||||
#define DMA_BUS_MODE_INTM_SHIFT 16
|
||||
#define DMA_BUS_MODE_INTM_MODE1 0x1
|
||||
#define DMA_BUS_MODE_SFT_RESET BIT(0)
|
||||
|
||||
/* DMA SYS Bus Mode bitmap */
|
||||
#define DMA_BUS_MODE_SPH BIT(24)
|
||||
#define DMA_BUS_MODE_PBL BIT(16)
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 16
|
||||
#define DMA_BUS_MODE_RPBL_SHIFT 16
|
||||
#define DMA_BUS_MODE_MB BIT(14)
|
||||
#define DMA_BUS_MODE_FB BIT(0)
|
||||
|
||||
/* DMA Interrupt top status */
|
||||
#define DMA_STATUS_MAC BIT(17)
|
||||
#define DMA_STATUS_MTL BIT(16)
|
||||
#define DMA_STATUS_CHAN7 BIT(7)
|
||||
#define DMA_STATUS_CHAN6 BIT(6)
|
||||
#define DMA_STATUS_CHAN5 BIT(5)
|
||||
#define DMA_STATUS_CHAN4 BIT(4)
|
||||
#define DMA_STATUS_CHAN3 BIT(3)
|
||||
#define DMA_STATUS_CHAN2 BIT(2)
|
||||
#define DMA_STATUS_CHAN1 BIT(1)
|
||||
#define DMA_STATUS_CHAN0 BIT(0)
|
||||
|
||||
/* DMA debug status bitmap */
|
||||
#define DMA_DEBUG_STATUS_TS_MASK 0xf
|
||||
#define DMA_DEBUG_STATUS_RS_MASK 0xf
|
||||
|
||||
/* DMA AXI bitmap */
|
||||
#define DMA_AXI_EN_LPI BIT(31)
|
||||
#define DMA_AXI_LPI_XIT_FRM BIT(30)
|
||||
#define DMA_AXI_WR_OSR_LMT GENMASK(27, 24)
|
||||
#define DMA_AXI_WR_OSR_LMT_SHIFT 24
|
||||
#define DMA_AXI_RD_OSR_LMT GENMASK(19, 16)
|
||||
#define DMA_AXI_RD_OSR_LMT_SHIFT 16
|
||||
|
||||
#define DMA_AXI_OSR_MAX 0xf
|
||||
#define DMA_AXI_MAX_OSR_LIMIT ((DMA_AXI_OSR_MAX << DMA_AXI_WR_OSR_LMT_SHIFT) | \
|
||||
(DMA_AXI_OSR_MAX << DMA_AXI_RD_OSR_LMT_SHIFT))
|
||||
|
||||
#define DMA_SYS_BUS_MB BIT(14)
|
||||
#define DMA_AXI_1KBBE BIT(13)
|
||||
#define DMA_SYS_BUS_AAL BIT(12)
|
||||
#define DMA_SYS_BUS_EAME BIT(11)
|
||||
#define DMA_AXI_BLEN256 BIT(7)
|
||||
#define DMA_AXI_BLEN128 BIT(6)
|
||||
#define DMA_AXI_BLEN64 BIT(5)
|
||||
#define DMA_AXI_BLEN32 BIT(4)
|
||||
#define DMA_AXI_BLEN16 BIT(3)
|
||||
#define DMA_AXI_BLEN8 BIT(2)
|
||||
#define DMA_AXI_BLEN4 BIT(1)
|
||||
#define DMA_SYS_BUS_FB BIT(0)
|
||||
|
||||
#define DMA_BURST_LEN_DEFAULT (DMA_AXI_BLEN256 | DMA_AXI_BLEN128 | \
|
||||
DMA_AXI_BLEN64 | DMA_AXI_BLEN32 | \
|
||||
DMA_AXI_BLEN16 | DMA_AXI_BLEN8 | \
|
||||
DMA_AXI_BLEN4)
|
||||
|
||||
#define DMA_AXI_BURST_LEN_MASK 0x000000FE
|
||||
|
||||
/* DMA TBS Control */
|
||||
#define DMA_TBS_FTOS GENMASK(31, 8)
|
||||
#define DMA_TBS_FTOV BIT(0)
|
||||
#define DMA_TBS_DEF_FTOS (DMA_TBS_FTOS | DMA_TBS_FTOV)
|
||||
|
||||
/* Following DMA defines are chanels oriented */
|
||||
#define DMA_CHAN_BASE_ADDR 0x00001100
|
||||
#define DMA_CHAN_BASE_OFFSET 0x80
|
||||
|
||||
static inline u32 dma_chanx_base_addr(const struct dwmac4_addrs *addrs,
|
||||
const u32 x)
|
||||
{
|
||||
u32 addr;
|
||||
|
||||
if (addrs)
|
||||
addr = addrs->dma_chan + (x * addrs->dma_chan_offset);
|
||||
else
|
||||
addr = DMA_CHAN_BASE_ADDR + (x * DMA_CHAN_BASE_OFFSET);
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
#define DMA_CHAN_REG_NUMBER 17
|
||||
|
||||
#define DMA_CHAN_CONTROL(addrs, x) dma_chanx_base_addr(addrs, x)
|
||||
#define DMA_CHAN_TX_CONTROL(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x4)
|
||||
#define DMA_CHAN_RX_CONTROL(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x8)
|
||||
#define DMA_CHAN_TX_BASE_ADDR_HI(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x10)
|
||||
#define DMA_CHAN_TX_BASE_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x14)
|
||||
#define DMA_CHAN_RX_BASE_ADDR_HI(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x18)
|
||||
#define DMA_CHAN_RX_BASE_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x1c)
|
||||
#define DMA_CHAN_TX_END_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x20)
|
||||
#define DMA_CHAN_RX_END_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x28)
|
||||
#define DMA_CHAN_TX_RING_LEN(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x2c)
|
||||
#define DMA_CHAN_RX_RING_LEN(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x30)
|
||||
#define DMA_CHAN_INTR_ENA(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x34)
|
||||
#define DMA_CHAN_RX_WATCHDOG(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x38)
|
||||
#define DMA_CHAN_SLOT_CTRL_STATUS(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x3c)
|
||||
#define DMA_CHAN_CUR_TX_DESC(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x44)
|
||||
#define DMA_CHAN_CUR_RX_DESC(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x4c)
|
||||
#define DMA_CHAN_CUR_TX_BUF_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x54)
|
||||
#define DMA_CHAN_CUR_RX_BUF_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x5c)
|
||||
#define DMA_CHAN_STATUS(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x60)
|
||||
|
||||
/* DMA Control X */
|
||||
#define DMA_CONTROL_SPH BIT(24)
|
||||
#define DMA_CONTROL_MSS_MASK GENMASK(13, 0)
|
||||
|
||||
/* DMA Tx Channel X Control register defines */
|
||||
#define DMA_CONTROL_EDSE BIT(28)
|
||||
#define DMA_CONTROL_TSE BIT(12)
|
||||
#define DMA_CONTROL_OSP BIT(4)
|
||||
#define DMA_CONTROL_ST BIT(0)
|
||||
|
||||
/* DMA Rx Channel X Control register defines */
|
||||
#define DMA_CONTROL_SR BIT(0)
|
||||
#define DMA_RBSZ_MASK GENMASK(14, 1)
|
||||
#define DMA_RBSZ_SHIFT 1
|
||||
|
||||
/* Interrupt status per channel */
|
||||
#define DMA_CHAN_STATUS_REB GENMASK(21, 19)
|
||||
#define DMA_CHAN_STATUS_REB_SHIFT 19
|
||||
#define DMA_CHAN_STATUS_TEB GENMASK(18, 16)
|
||||
#define DMA_CHAN_STATUS_TEB_SHIFT 16
|
||||
#define DMA_CHAN_STATUS_NIS BIT(15)
|
||||
#define DMA_CHAN_STATUS_AIS BIT(14)
|
||||
#define DMA_CHAN_STATUS_CDE BIT(13)
|
||||
#define DMA_CHAN_STATUS_FBE BIT(12)
|
||||
#define DMA_CHAN_STATUS_ERI BIT(11)
|
||||
#define DMA_CHAN_STATUS_ETI BIT(10)
|
||||
#define DMA_CHAN_STATUS_RWT BIT(9)
|
||||
#define DMA_CHAN_STATUS_RPS BIT(8)
|
||||
#define DMA_CHAN_STATUS_RBU BIT(7)
|
||||
#define DMA_CHAN_STATUS_RI BIT(6)
|
||||
#define DMA_CHAN_STATUS_TBU BIT(2)
|
||||
#define DMA_CHAN_STATUS_TPS BIT(1)
|
||||
#define DMA_CHAN_STATUS_TI BIT(0)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_COMMON (DMA_CHAN_STATUS_NIS | \
|
||||
DMA_CHAN_STATUS_AIS | \
|
||||
DMA_CHAN_STATUS_CDE | \
|
||||
DMA_CHAN_STATUS_FBE)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_RX (DMA_CHAN_STATUS_REB | \
|
||||
DMA_CHAN_STATUS_ERI | \
|
||||
DMA_CHAN_STATUS_RWT | \
|
||||
DMA_CHAN_STATUS_RPS | \
|
||||
DMA_CHAN_STATUS_RBU | \
|
||||
DMA_CHAN_STATUS_RI | \
|
||||
DMA_CHAN_STATUS_MSK_COMMON)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_TX (DMA_CHAN_STATUS_ETI | \
|
||||
DMA_CHAN_STATUS_TBU | \
|
||||
DMA_CHAN_STATUS_TPS | \
|
||||
DMA_CHAN_STATUS_TI | \
|
||||
DMA_CHAN_STATUS_MSK_COMMON)
|
||||
|
||||
/* Interrupt enable bits per channel */
|
||||
#define DMA_CHAN_INTR_ENA_NIE BIT(16)
|
||||
#define DMA_CHAN_INTR_ENA_AIE BIT(15)
|
||||
#define DMA_CHAN_INTR_ENA_NIE_4_10 BIT(15)
|
||||
#define DMA_CHAN_INTR_ENA_AIE_4_10 BIT(14)
|
||||
#define DMA_CHAN_INTR_ENA_CDE BIT(13)
|
||||
#define DMA_CHAN_INTR_ENA_FBE BIT(12)
|
||||
#define DMA_CHAN_INTR_ENA_ERE BIT(11)
|
||||
#define DMA_CHAN_INTR_ENA_ETE BIT(10)
|
||||
#define DMA_CHAN_INTR_ENA_RWE BIT(9)
|
||||
#define DMA_CHAN_INTR_ENA_RSE BIT(8)
|
||||
#define DMA_CHAN_INTR_ENA_RBUE BIT(7)
|
||||
#define DMA_CHAN_INTR_ENA_RIE BIT(6)
|
||||
#define DMA_CHAN_INTR_ENA_TBUE BIT(2)
|
||||
#define DMA_CHAN_INTR_ENA_TSE BIT(1)
|
||||
#define DMA_CHAN_INTR_ENA_TIE BIT(0)
|
||||
|
||||
#define DMA_CHAN_INTR_NORMAL (DMA_CHAN_INTR_ENA_NIE | \
|
||||
DMA_CHAN_INTR_ENA_RIE | \
|
||||
DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_ABNORMAL (DMA_CHAN_INTR_ENA_AIE | \
|
||||
DMA_CHAN_INTR_ENA_FBE)
|
||||
/* DMA default interrupt mask for 4.00 */
|
||||
#define DMA_CHAN_INTR_DEFAULT_MASK (DMA_CHAN_INTR_NORMAL | \
|
||||
DMA_CHAN_INTR_ABNORMAL)
|
||||
#define DMA_CHAN_INTR_DEFAULT_RX (DMA_CHAN_INTR_ENA_RIE)
|
||||
#define DMA_CHAN_INTR_DEFAULT_TX (DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_NORMAL_4_10 (DMA_CHAN_INTR_ENA_NIE_4_10 | \
|
||||
DMA_CHAN_INTR_ENA_RIE | \
|
||||
DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_ABNORMAL_4_10 (DMA_CHAN_INTR_ENA_AIE_4_10 | \
|
||||
DMA_CHAN_INTR_ENA_FBE)
|
||||
/* DMA default interrupt mask for 4.10a */
|
||||
#define DMA_CHAN_INTR_DEFAULT_MASK_4_10 (DMA_CHAN_INTR_NORMAL_4_10 | \
|
||||
DMA_CHAN_INTR_ABNORMAL_4_10)
|
||||
#define DMA_CHAN_INTR_DEFAULT_RX_4_10 (DMA_CHAN_INTR_ENA_RIE)
|
||||
#define DMA_CHAN_INTR_DEFAULT_TX_4_10 (DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
/* channel 0 specific fields */
|
||||
#define DMA_CHAN0_DBG_STAT_TPS GENMASK(15, 12)
|
||||
#define DMA_CHAN0_DBG_STAT_TPS_SHIFT 12
|
||||
#define DMA_CHAN0_DBG_STAT_RPS GENMASK(11, 8)
|
||||
#define DMA_CHAN0_DBG_STAT_RPS_SHIFT 8
|
||||
|
||||
int dwmac4_dma_reset(void __iomem *ioaddr);
|
||||
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac410_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac410_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan);
|
||||
void dwmac4_set_tx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan);
|
||||
void dwmac4_set_rx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan);
|
||||
void dwmac4_set_tx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan);
|
||||
|
||||
#endif /* __DWMAC4_DMA_H__ */
|
||||
616
devices/stmmac/dwmac4_dma-6.4-orig.c
Normal file
616
devices/stmmac/dwmac4_dma-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
262
devices/stmmac/dwmac4_dma-6.4-orig.h
Normal file
262
devices/stmmac/dwmac4_dma-6.4-orig.h
Normal file
@@ -0,0 +1,262 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* DWMAC4 DMA Header file.
|
||||
*
|
||||
* Copyright (C) 2007-2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#ifndef __DWMAC4_DMA_H__
|
||||
#define __DWMAC4_DMA_H__
|
||||
|
||||
/* Define the max channel number used for tx (also rx).
|
||||
* dwmac4 accepts up to 8 channels for TX (and also 8 channels for RX
|
||||
*/
|
||||
#define DMA_CHANNEL_NB_MAX 1
|
||||
|
||||
#define DMA_BUS_MODE 0x00001000
|
||||
#define DMA_SYS_BUS_MODE 0x00001004
|
||||
#define DMA_STATUS 0x00001008
|
||||
#define DMA_DEBUG_STATUS_0 0x0000100c
|
||||
#define DMA_DEBUG_STATUS_1 0x00001010
|
||||
#define DMA_DEBUG_STATUS_2 0x00001014
|
||||
#define DMA_AXI_BUS_MODE 0x00001028
|
||||
#define DMA_TBS_CTRL 0x00001050
|
||||
|
||||
/* DMA Bus Mode bitmap */
|
||||
#define DMA_BUS_MODE_DCHE BIT(19)
|
||||
#define DMA_BUS_MODE_INTM_MASK GENMASK(17, 16)
|
||||
#define DMA_BUS_MODE_INTM_SHIFT 16
|
||||
#define DMA_BUS_MODE_INTM_MODE1 0x1
|
||||
#define DMA_BUS_MODE_SFT_RESET BIT(0)
|
||||
|
||||
/* DMA SYS Bus Mode bitmap */
|
||||
#define DMA_BUS_MODE_SPH BIT(24)
|
||||
#define DMA_BUS_MODE_PBL BIT(16)
|
||||
#define DMA_BUS_MODE_PBL_SHIFT 16
|
||||
#define DMA_BUS_MODE_RPBL_SHIFT 16
|
||||
#define DMA_BUS_MODE_MB BIT(14)
|
||||
#define DMA_BUS_MODE_FB BIT(0)
|
||||
|
||||
/* DMA Interrupt top status */
|
||||
#define DMA_STATUS_MAC BIT(17)
|
||||
#define DMA_STATUS_MTL BIT(16)
|
||||
#define DMA_STATUS_CHAN7 BIT(7)
|
||||
#define DMA_STATUS_CHAN6 BIT(6)
|
||||
#define DMA_STATUS_CHAN5 BIT(5)
|
||||
#define DMA_STATUS_CHAN4 BIT(4)
|
||||
#define DMA_STATUS_CHAN3 BIT(3)
|
||||
#define DMA_STATUS_CHAN2 BIT(2)
|
||||
#define DMA_STATUS_CHAN1 BIT(1)
|
||||
#define DMA_STATUS_CHAN0 BIT(0)
|
||||
|
||||
/* DMA debug status bitmap */
|
||||
#define DMA_DEBUG_STATUS_TS_MASK 0xf
|
||||
#define DMA_DEBUG_STATUS_RS_MASK 0xf
|
||||
|
||||
/* DMA AXI bitmap */
|
||||
#define DMA_AXI_EN_LPI BIT(31)
|
||||
#define DMA_AXI_LPI_XIT_FRM BIT(30)
|
||||
#define DMA_AXI_WR_OSR_LMT GENMASK(27, 24)
|
||||
#define DMA_AXI_WR_OSR_LMT_SHIFT 24
|
||||
#define DMA_AXI_RD_OSR_LMT GENMASK(19, 16)
|
||||
#define DMA_AXI_RD_OSR_LMT_SHIFT 16
|
||||
|
||||
#define DMA_AXI_OSR_MAX 0xf
|
||||
#define DMA_AXI_MAX_OSR_LIMIT ((DMA_AXI_OSR_MAX << DMA_AXI_WR_OSR_LMT_SHIFT) | \
|
||||
(DMA_AXI_OSR_MAX << DMA_AXI_RD_OSR_LMT_SHIFT))
|
||||
|
||||
#define DMA_SYS_BUS_MB BIT(14)
|
||||
#define DMA_AXI_1KBBE BIT(13)
|
||||
#define DMA_SYS_BUS_AAL BIT(12)
|
||||
#define DMA_SYS_BUS_EAME BIT(11)
|
||||
#define DMA_AXI_BLEN256 BIT(7)
|
||||
#define DMA_AXI_BLEN128 BIT(6)
|
||||
#define DMA_AXI_BLEN64 BIT(5)
|
||||
#define DMA_AXI_BLEN32 BIT(4)
|
||||
#define DMA_AXI_BLEN16 BIT(3)
|
||||
#define DMA_AXI_BLEN8 BIT(2)
|
||||
#define DMA_AXI_BLEN4 BIT(1)
|
||||
#define DMA_SYS_BUS_FB BIT(0)
|
||||
|
||||
#define DMA_BURST_LEN_DEFAULT (DMA_AXI_BLEN256 | DMA_AXI_BLEN128 | \
|
||||
DMA_AXI_BLEN64 | DMA_AXI_BLEN32 | \
|
||||
DMA_AXI_BLEN16 | DMA_AXI_BLEN8 | \
|
||||
DMA_AXI_BLEN4)
|
||||
|
||||
#define DMA_AXI_BURST_LEN_MASK 0x000000FE
|
||||
|
||||
/* DMA TBS Control */
|
||||
#define DMA_TBS_FTOS GENMASK(31, 8)
|
||||
#define DMA_TBS_FTOV BIT(0)
|
||||
#define DMA_TBS_DEF_FTOS (DMA_TBS_FTOS | DMA_TBS_FTOV)
|
||||
|
||||
/* Following DMA defines are chanels oriented */
|
||||
#define DMA_CHAN_BASE_ADDR 0x00001100
|
||||
#define DMA_CHAN_BASE_OFFSET 0x80
|
||||
|
||||
static inline u32 dma_chanx_base_addr(const struct dwmac4_addrs *addrs,
|
||||
const u32 x)
|
||||
{
|
||||
u32 addr;
|
||||
|
||||
if (addrs)
|
||||
addr = addrs->dma_chan + (x * addrs->dma_chan_offset);
|
||||
else
|
||||
addr = DMA_CHAN_BASE_ADDR + (x * DMA_CHAN_BASE_OFFSET);
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
#define DMA_CHAN_REG_NUMBER 17
|
||||
|
||||
#define DMA_CHAN_CONTROL(addrs, x) dma_chanx_base_addr(addrs, x)
|
||||
#define DMA_CHAN_TX_CONTROL(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x4)
|
||||
#define DMA_CHAN_RX_CONTROL(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x8)
|
||||
#define DMA_CHAN_TX_BASE_ADDR_HI(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x10)
|
||||
#define DMA_CHAN_TX_BASE_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x14)
|
||||
#define DMA_CHAN_RX_BASE_ADDR_HI(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x18)
|
||||
#define DMA_CHAN_RX_BASE_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x1c)
|
||||
#define DMA_CHAN_TX_END_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x20)
|
||||
#define DMA_CHAN_RX_END_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x28)
|
||||
#define DMA_CHAN_TX_RING_LEN(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x2c)
|
||||
#define DMA_CHAN_RX_RING_LEN(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x30)
|
||||
#define DMA_CHAN_INTR_ENA(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x34)
|
||||
#define DMA_CHAN_RX_WATCHDOG(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x38)
|
||||
#define DMA_CHAN_SLOT_CTRL_STATUS(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x3c)
|
||||
#define DMA_CHAN_CUR_TX_DESC(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x44)
|
||||
#define DMA_CHAN_CUR_RX_DESC(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x4c)
|
||||
#define DMA_CHAN_CUR_TX_BUF_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x54)
|
||||
#define DMA_CHAN_CUR_RX_BUF_ADDR(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x5c)
|
||||
#define DMA_CHAN_STATUS(addrs, x) (dma_chanx_base_addr(addrs, x) + 0x60)
|
||||
|
||||
/* DMA Control X */
|
||||
#define DMA_CONTROL_SPH BIT(24)
|
||||
#define DMA_CONTROL_MSS_MASK GENMASK(13, 0)
|
||||
|
||||
/* DMA Tx Channel X Control register defines */
|
||||
#define DMA_CONTROL_EDSE BIT(28)
|
||||
#define DMA_CONTROL_TSE BIT(12)
|
||||
#define DMA_CONTROL_OSP BIT(4)
|
||||
#define DMA_CONTROL_ST BIT(0)
|
||||
|
||||
/* DMA Rx Channel X Control register defines */
|
||||
#define DMA_CONTROL_SR BIT(0)
|
||||
#define DMA_RBSZ_MASK GENMASK(14, 1)
|
||||
#define DMA_RBSZ_SHIFT 1
|
||||
|
||||
/* Interrupt status per channel */
|
||||
#define DMA_CHAN_STATUS_REB GENMASK(21, 19)
|
||||
#define DMA_CHAN_STATUS_REB_SHIFT 19
|
||||
#define DMA_CHAN_STATUS_TEB GENMASK(18, 16)
|
||||
#define DMA_CHAN_STATUS_TEB_SHIFT 16
|
||||
#define DMA_CHAN_STATUS_NIS BIT(15)
|
||||
#define DMA_CHAN_STATUS_AIS BIT(14)
|
||||
#define DMA_CHAN_STATUS_CDE BIT(13)
|
||||
#define DMA_CHAN_STATUS_FBE BIT(12)
|
||||
#define DMA_CHAN_STATUS_ERI BIT(11)
|
||||
#define DMA_CHAN_STATUS_ETI BIT(10)
|
||||
#define DMA_CHAN_STATUS_RWT BIT(9)
|
||||
#define DMA_CHAN_STATUS_RPS BIT(8)
|
||||
#define DMA_CHAN_STATUS_RBU BIT(7)
|
||||
#define DMA_CHAN_STATUS_RI BIT(6)
|
||||
#define DMA_CHAN_STATUS_TBU BIT(2)
|
||||
#define DMA_CHAN_STATUS_TPS BIT(1)
|
||||
#define DMA_CHAN_STATUS_TI BIT(0)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_COMMON (DMA_CHAN_STATUS_NIS | \
|
||||
DMA_CHAN_STATUS_AIS | \
|
||||
DMA_CHAN_STATUS_CDE | \
|
||||
DMA_CHAN_STATUS_FBE)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_RX (DMA_CHAN_STATUS_REB | \
|
||||
DMA_CHAN_STATUS_ERI | \
|
||||
DMA_CHAN_STATUS_RWT | \
|
||||
DMA_CHAN_STATUS_RPS | \
|
||||
DMA_CHAN_STATUS_RBU | \
|
||||
DMA_CHAN_STATUS_RI | \
|
||||
DMA_CHAN_STATUS_MSK_COMMON)
|
||||
|
||||
#define DMA_CHAN_STATUS_MSK_TX (DMA_CHAN_STATUS_ETI | \
|
||||
DMA_CHAN_STATUS_TBU | \
|
||||
DMA_CHAN_STATUS_TPS | \
|
||||
DMA_CHAN_STATUS_TI | \
|
||||
DMA_CHAN_STATUS_MSK_COMMON)
|
||||
|
||||
/* Interrupt enable bits per channel */
|
||||
#define DMA_CHAN_INTR_ENA_NIE BIT(16)
|
||||
#define DMA_CHAN_INTR_ENA_AIE BIT(15)
|
||||
#define DMA_CHAN_INTR_ENA_NIE_4_10 BIT(15)
|
||||
#define DMA_CHAN_INTR_ENA_AIE_4_10 BIT(14)
|
||||
#define DMA_CHAN_INTR_ENA_CDE BIT(13)
|
||||
#define DMA_CHAN_INTR_ENA_FBE BIT(12)
|
||||
#define DMA_CHAN_INTR_ENA_ERE BIT(11)
|
||||
#define DMA_CHAN_INTR_ENA_ETE BIT(10)
|
||||
#define DMA_CHAN_INTR_ENA_RWE BIT(9)
|
||||
#define DMA_CHAN_INTR_ENA_RSE BIT(8)
|
||||
#define DMA_CHAN_INTR_ENA_RBUE BIT(7)
|
||||
#define DMA_CHAN_INTR_ENA_RIE BIT(6)
|
||||
#define DMA_CHAN_INTR_ENA_TBUE BIT(2)
|
||||
#define DMA_CHAN_INTR_ENA_TSE BIT(1)
|
||||
#define DMA_CHAN_INTR_ENA_TIE BIT(0)
|
||||
|
||||
#define DMA_CHAN_INTR_NORMAL (DMA_CHAN_INTR_ENA_NIE | \
|
||||
DMA_CHAN_INTR_ENA_RIE | \
|
||||
DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_ABNORMAL (DMA_CHAN_INTR_ENA_AIE | \
|
||||
DMA_CHAN_INTR_ENA_FBE)
|
||||
/* DMA default interrupt mask for 4.00 */
|
||||
#define DMA_CHAN_INTR_DEFAULT_MASK (DMA_CHAN_INTR_NORMAL | \
|
||||
DMA_CHAN_INTR_ABNORMAL)
|
||||
#define DMA_CHAN_INTR_DEFAULT_RX (DMA_CHAN_INTR_ENA_RIE)
|
||||
#define DMA_CHAN_INTR_DEFAULT_TX (DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_NORMAL_4_10 (DMA_CHAN_INTR_ENA_NIE_4_10 | \
|
||||
DMA_CHAN_INTR_ENA_RIE | \
|
||||
DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
#define DMA_CHAN_INTR_ABNORMAL_4_10 (DMA_CHAN_INTR_ENA_AIE_4_10 | \
|
||||
DMA_CHAN_INTR_ENA_FBE)
|
||||
/* DMA default interrupt mask for 4.10a */
|
||||
#define DMA_CHAN_INTR_DEFAULT_MASK_4_10 (DMA_CHAN_INTR_NORMAL_4_10 | \
|
||||
DMA_CHAN_INTR_ABNORMAL_4_10)
|
||||
#define DMA_CHAN_INTR_DEFAULT_RX_4_10 (DMA_CHAN_INTR_ENA_RIE)
|
||||
#define DMA_CHAN_INTR_DEFAULT_TX_4_10 (DMA_CHAN_INTR_ENA_TIE)
|
||||
|
||||
/* channel 0 specific fields */
|
||||
#define DMA_CHAN0_DBG_STAT_TPS GENMASK(15, 12)
|
||||
#define DMA_CHAN0_DBG_STAT_TPS_SHIFT 12
|
||||
#define DMA_CHAN0_DBG_STAT_RPS GENMASK(11, 8)
|
||||
#define DMA_CHAN0_DBG_STAT_RPS_SHIFT 8
|
||||
|
||||
int dwmac4_dma_reset(void __iomem *ioaddr);
|
||||
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac410_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac410_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac4_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan);
|
||||
void dwmac4_set_tx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan);
|
||||
void dwmac4_set_rx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan);
|
||||
void dwmac4_set_tx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan);
|
||||
|
||||
#endif /* __DWMAC4_DMA_H__ */
|
||||
268
devices/stmmac/dwmac4_lib-6.4-ethercat.c
Normal file
268
devices/stmmac/dwmac4_lib-6.4-ethercat.c
Normal file
@@ -0,0 +1,268 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2007-2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/delay.h>
|
||||
#include "common-6.4-ethercat.h"
|
||||
#include "dwmac4_dma-6.4-ethercat.h"
|
||||
#include "dwmac4-6.4-ethercat.h"
|
||||
#include "stmmac-6.4-ethercat.h"
|
||||
|
||||
int dwmac4_dma_reset(void __iomem *ioaddr)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* DMA SW reset */
|
||||
value |= DMA_BUS_MODE_SFT_RESET;
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
|
||||
!(value & DMA_BUS_MODE_SFT_RESET),
|
||||
10000, 1000000);
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_TE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value |= DMA_CONTROL_SR;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_RE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac410_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX_4_10;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX_4_10;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac410_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX_4_10;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX_4_10;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));
|
||||
u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
int ret = 0;
|
||||
|
||||
if (dir == DMA_DIR_RX)
|
||||
intr_status &= DMA_CHAN_STATUS_MSK_RX;
|
||||
else if (dir == DMA_DIR_TX)
|
||||
intr_status &= DMA_CHAN_STATUS_MSK_TX;
|
||||
|
||||
/* ABNORMAL interrupts */
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_AIS)) {
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RBU))
|
||||
x->rx_buf_unav_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RPS))
|
||||
x->rx_process_stopped_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RWT))
|
||||
x->rx_watchdog_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_ETI))
|
||||
x->tx_early_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_TPS)) {
|
||||
x->tx_process_stopped_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_FBE)) {
|
||||
x->fatal_bus_error_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
}
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_NIS))
|
||||
x->normal_irq_n++;
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_RI)) {
|
||||
x->rx_normal_irq_n++;
|
||||
x->rxq_stats[chan].rx_normal_irq_n++;
|
||||
ret |= handle_rx;
|
||||
}
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_TI)) {
|
||||
x->tx_normal_irq_n++;
|
||||
x->txq_stats[chan].tx_normal_irq_n++;
|
||||
ret |= handle_tx;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_TBU))
|
||||
ret |= handle_tx;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_ERI))
|
||||
x->rx_early_irq++;
|
||||
|
||||
writel(intr_status & intr_en,
|
||||
ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));
|
||||
return ret;
|
||||
}
|
||||
|
||||
void stmmac_dwmac4_set_mac_addr(void __iomem *ioaddr, const u8 addr[6],
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
data = (addr[5] << 8) | addr[4];
|
||||
/* For MAC Addr registers se have to set the Address Enable (AE)
|
||||
* bit that has no effect on the High Reg 0 where the bit 31 (MO)
|
||||
* is RO.
|
||||
*/
|
||||
data |= (STMMAC_CHAN0 << GMAC_HI_DCS_SHIFT);
|
||||
writel(data | GMAC_HI_REG_AE, ioaddr + high);
|
||||
data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
|
||||
writel(data, ioaddr + low);
|
||||
}
|
||||
|
||||
/* Enable disable MAC RX/TX */
|
||||
void stmmac_dwmac4_set_mac(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 value = readl(ioaddr + GMAC_CONFIG);
|
||||
|
||||
if (enable)
|
||||
value |= GMAC_CONFIG_RE | GMAC_CONFIG_TE;
|
||||
else
|
||||
value &= ~(GMAC_CONFIG_TE | GMAC_CONFIG_RE);
|
||||
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned int hi_addr, lo_addr;
|
||||
|
||||
/* Read the MAC address from the hardware */
|
||||
hi_addr = readl(ioaddr + high);
|
||||
lo_addr = readl(ioaddr + low);
|
||||
|
||||
/* Extract the MAC address from the high and low words */
|
||||
addr[0] = lo_addr & 0xff;
|
||||
addr[1] = (lo_addr >> 8) & 0xff;
|
||||
addr[2] = (lo_addr >> 16) & 0xff;
|
||||
addr[3] = (lo_addr >> 24) & 0xff;
|
||||
addr[4] = hi_addr & 0xff;
|
||||
addr[5] = (hi_addr >> 8) & 0xff;
|
||||
}
|
||||
268
devices/stmmac/dwmac4_lib-6.4-orig.c
Normal file
268
devices/stmmac/dwmac4_lib-6.4-orig.c
Normal file
@@ -0,0 +1,268 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2007-2015 STMicroelectronics Ltd
|
||||
*
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/delay.h>
|
||||
#include "common.h"
|
||||
#include "dwmac4_dma.h"
|
||||
#include "dwmac4.h"
|
||||
#include "stmmac.h"
|
||||
|
||||
int dwmac4_dma_reset(void __iomem *ioaddr)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* DMA SW reset */
|
||||
value |= DMA_BUS_MODE_SFT_RESET;
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
|
||||
!(value & DMA_BUS_MODE_SFT_RESET),
|
||||
10000, 1000000);
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 tail_ptr, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_TE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value |= DMA_CONTROL_SR;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_RE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 len, u32 chan)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
|
||||
writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac410_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX_4_10;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX_4_10;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
void dwmac410_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX_4_10;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX_4_10;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
}
|
||||
|
||||
int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));
|
||||
u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
int ret = 0;
|
||||
|
||||
if (dir == DMA_DIR_RX)
|
||||
intr_status &= DMA_CHAN_STATUS_MSK_RX;
|
||||
else if (dir == DMA_DIR_TX)
|
||||
intr_status &= DMA_CHAN_STATUS_MSK_TX;
|
||||
|
||||
/* ABNORMAL interrupts */
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_AIS)) {
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RBU))
|
||||
x->rx_buf_unav_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RPS))
|
||||
x->rx_process_stopped_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_RWT))
|
||||
x->rx_watchdog_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_ETI))
|
||||
x->tx_early_irq++;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_TPS)) {
|
||||
x->tx_process_stopped_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_FBE)) {
|
||||
x->fatal_bus_error_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
}
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_NIS))
|
||||
x->normal_irq_n++;
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_RI)) {
|
||||
x->rx_normal_irq_n++;
|
||||
x->rxq_stats[chan].rx_normal_irq_n++;
|
||||
ret |= handle_rx;
|
||||
}
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_TI)) {
|
||||
x->tx_normal_irq_n++;
|
||||
x->txq_stats[chan].tx_normal_irq_n++;
|
||||
ret |= handle_tx;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_TBU))
|
||||
ret |= handle_tx;
|
||||
if (unlikely(intr_status & DMA_CHAN_STATUS_ERI))
|
||||
x->rx_early_irq++;
|
||||
|
||||
writel(intr_status & intr_en,
|
||||
ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));
|
||||
return ret;
|
||||
}
|
||||
|
||||
void stmmac_dwmac4_set_mac_addr(void __iomem *ioaddr, const u8 addr[6],
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
data = (addr[5] << 8) | addr[4];
|
||||
/* For MAC Addr registers se have to set the Address Enable (AE)
|
||||
* bit that has no effect on the High Reg 0 where the bit 31 (MO)
|
||||
* is RO.
|
||||
*/
|
||||
data |= (STMMAC_CHAN0 << GMAC_HI_DCS_SHIFT);
|
||||
writel(data | GMAC_HI_REG_AE, ioaddr + high);
|
||||
data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
|
||||
writel(data, ioaddr + low);
|
||||
}
|
||||
|
||||
/* Enable disable MAC RX/TX */
|
||||
void stmmac_dwmac4_set_mac(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 value = readl(ioaddr + GMAC_CONFIG);
|
||||
|
||||
if (enable)
|
||||
value |= GMAC_CONFIG_RE | GMAC_CONFIG_TE;
|
||||
else
|
||||
value &= ~(GMAC_CONFIG_TE | GMAC_CONFIG_RE);
|
||||
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned int hi_addr, lo_addr;
|
||||
|
||||
/* Read the MAC address from the hardware */
|
||||
hi_addr = readl(ioaddr + high);
|
||||
lo_addr = readl(ioaddr + low);
|
||||
|
||||
/* Extract the MAC address from the high and low words */
|
||||
addr[0] = lo_addr & 0xff;
|
||||
addr[1] = (lo_addr >> 8) & 0xff;
|
||||
addr[2] = (lo_addr >> 16) & 0xff;
|
||||
addr[3] = (lo_addr >> 24) & 0xff;
|
||||
addr[4] = hi_addr & 0xff;
|
||||
addr[5] = (hi_addr >> 8) & 0xff;
|
||||
}
|
||||
784
devices/stmmac/dwmac5-6.4-ethercat.c
Normal file
784
devices/stmmac/dwmac5-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
162
devices/stmmac/dwmac5-6.4-ethercat.h
Normal file
162
devices/stmmac/dwmac5-6.4-ethercat.h
Normal file
@@ -0,0 +1,162 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||
// Copyright (c) 2017 Synopsys, Inc. and/or its affiliates.
|
||||
// stmmac Support for 5.xx Ethernet QoS cores
|
||||
|
||||
#ifndef __DWMAC5_H__
|
||||
#define __DWMAC5_H__
|
||||
|
||||
#define MAC_DPP_FSM_INT_STATUS 0x00000140
|
||||
#define MAC_AXI_SLV_DPE_ADDR_STATUS 0x00000144
|
||||
#define MAC_FSM_CONTROL 0x00000148
|
||||
#define PRTYEN BIT(1)
|
||||
#define TMOUTEN BIT(0)
|
||||
|
||||
#define MAC_FPE_CTRL_STS 0x00000234
|
||||
#define TRSP BIT(19)
|
||||
#define TVER BIT(18)
|
||||
#define RRSP BIT(17)
|
||||
#define RVER BIT(16)
|
||||
#define SRSP BIT(2)
|
||||
#define SVER BIT(1)
|
||||
#define EFPE BIT(0)
|
||||
|
||||
#define MAC_PPS_CONTROL 0x00000b70
|
||||
#define PPS_MAXIDX(x) ((((x) + 1) * 8) - 1)
|
||||
#define PPS_MINIDX(x) ((x) * 8)
|
||||
#define PPSx_MASK(x) GENMASK(PPS_MAXIDX(x), PPS_MINIDX(x))
|
||||
#define MCGRENx(x) BIT(PPS_MAXIDX(x))
|
||||
#define TRGTMODSELx(x, val) \
|
||||
GENMASK(PPS_MAXIDX(x) - 1, PPS_MAXIDX(x) - 2) & \
|
||||
((val) << (PPS_MAXIDX(x) - 2))
|
||||
#define PPSCMDx(x, val) \
|
||||
GENMASK(PPS_MINIDX(x) + 3, PPS_MINIDX(x)) & \
|
||||
((val) << PPS_MINIDX(x))
|
||||
#define PPSEN0 BIT(4)
|
||||
#define MAC_PPSx_TARGET_TIME_SEC(x) (0x00000b80 + ((x) * 0x10))
|
||||
#define MAC_PPSx_TARGET_TIME_NSEC(x) (0x00000b84 + ((x) * 0x10))
|
||||
#define TRGTBUSY0 BIT(31)
|
||||
#define TTSL0 GENMASK(30, 0)
|
||||
#define MAC_PPSx_INTERVAL(x) (0x00000b88 + ((x) * 0x10))
|
||||
#define MAC_PPSx_WIDTH(x) (0x00000b8c + ((x) * 0x10))
|
||||
|
||||
#define MTL_EST_CONTROL 0x00000c50
|
||||
#define PTOV GENMASK(31, 24)
|
||||
#define PTOV_SHIFT 24
|
||||
#define SSWL BIT(1)
|
||||
#define EEST BIT(0)
|
||||
|
||||
#define MTL_EST_STATUS 0x00000c58
|
||||
#define BTRL GENMASK(11, 8)
|
||||
#define BTRL_SHIFT 8
|
||||
#define BTRL_MAX (0xF << BTRL_SHIFT)
|
||||
#define SWOL BIT(7)
|
||||
#define SWOL_SHIFT 7
|
||||
#define CGCE BIT(4)
|
||||
#define HLBS BIT(3)
|
||||
#define HLBF BIT(2)
|
||||
#define BTRE BIT(1)
|
||||
#define SWLC BIT(0)
|
||||
|
||||
#define MTL_EST_SCH_ERR 0x00000c60
|
||||
#define MTL_EST_FRM_SZ_ERR 0x00000c64
|
||||
#define MTL_EST_FRM_SZ_CAP 0x00000c68
|
||||
#define SZ_CAP_HBFS_MASK GENMASK(14, 0)
|
||||
#define SZ_CAP_HBFQ_SHIFT 16
|
||||
#define SZ_CAP_HBFQ_MASK(_val) ({ typeof(_val) (val) = (_val); \
|
||||
((val) > 4 ? GENMASK(18, 16) : \
|
||||
(val) > 2 ? GENMASK(17, 16) : \
|
||||
BIT(16)); })
|
||||
|
||||
#define MTL_EST_INT_EN 0x00000c70
|
||||
#define IECGCE CGCE
|
||||
#define IEHS HLBS
|
||||
#define IEHF HLBF
|
||||
#define IEBE BTRE
|
||||
#define IECC SWLC
|
||||
|
||||
#define MTL_EST_GCL_CONTROL 0x00000c80
|
||||
#define BTR_LOW 0x0
|
||||
#define BTR_HIGH 0x1
|
||||
#define CTR_LOW 0x2
|
||||
#define CTR_HIGH 0x3
|
||||
#define TER 0x4
|
||||
#define LLR 0x5
|
||||
#define ADDR_SHIFT 8
|
||||
#define GCRR BIT(2)
|
||||
#define SRWO BIT(0)
|
||||
#define MTL_EST_GCL_DATA 0x00000c84
|
||||
|
||||
#define MTL_RXP_CONTROL_STATUS 0x00000ca0
|
||||
#define RXPI BIT(31)
|
||||
#define NPE GENMASK(23, 16)
|
||||
#define NVE GENMASK(7, 0)
|
||||
#define MTL_RXP_IACC_CTRL_STATUS 0x00000cb0
|
||||
#define STARTBUSY BIT(31)
|
||||
#define RXPEIEC GENMASK(22, 21)
|
||||
#define RXPEIEE BIT(20)
|
||||
#define WRRDN BIT(16)
|
||||
#define ADDR GENMASK(15, 0)
|
||||
#define MTL_RXP_IACC_DATA 0x00000cb4
|
||||
#define MTL_ECC_CONTROL 0x00000cc0
|
||||
#define MEEAO BIT(8)
|
||||
#define TSOEE BIT(4)
|
||||
#define MRXPEE BIT(3)
|
||||
#define MESTEE BIT(2)
|
||||
#define MRXEE BIT(1)
|
||||
#define MTXEE BIT(0)
|
||||
|
||||
#define MTL_SAFETY_INT_STATUS 0x00000cc4
|
||||
#define MCSIS BIT(31)
|
||||
#define MEUIS BIT(1)
|
||||
#define MECIS BIT(0)
|
||||
#define MTL_ECC_INT_ENABLE 0x00000cc8
|
||||
#define RPCEIE BIT(12)
|
||||
#define ECEIE BIT(8)
|
||||
#define RXCEIE BIT(4)
|
||||
#define TXCEIE BIT(0)
|
||||
#define MTL_ECC_INT_STATUS 0x00000ccc
|
||||
#define MTL_DPP_CONTROL 0x00000ce0
|
||||
#define EPSI BIT(2)
|
||||
#define OPE BIT(1)
|
||||
#define EDPP BIT(0)
|
||||
|
||||
#define DMA_SAFETY_INT_STATUS 0x00001080
|
||||
#define MSUIS BIT(29)
|
||||
#define MSCIS BIT(28)
|
||||
#define DEUIS BIT(1)
|
||||
#define DECIS BIT(0)
|
||||
#define DMA_ECC_INT_ENABLE 0x00001084
|
||||
#define TCEIE BIT(0)
|
||||
#define DMA_ECC_INT_STATUS 0x00001088
|
||||
|
||||
/* EQoS version 5.xx VLAN Tag Filter Fail Packets Queuing */
|
||||
#define GMAC_RXQ_CTRL4 0x00000094
|
||||
#define GMAC_RXQCTRL_VFFQ_MASK GENMASK(19, 17)
|
||||
#define GMAC_RXQCTRL_VFFQ_SHIFT 17
|
||||
#define GMAC_RXQCTRL_VFFQE BIT(16)
|
||||
|
||||
#define GMAC_INT_FPE_EN BIT(17)
|
||||
|
||||
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
|
||||
struct stmmac_safety_feature_cfg *safety_cfg);
|
||||
int dwmac5_safety_feat_irq_status(struct net_device *ndev,
|
||||
void __iomem *ioaddr, unsigned int asp,
|
||||
struct stmmac_safety_stats *stats);
|
||||
int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
|
||||
int index, unsigned long *count, const char **desc);
|
||||
int dwmac5_rxp_config(void __iomem *ioaddr, struct stmmac_tc_entry *entries,
|
||||
unsigned int count);
|
||||
int dwmac5_flex_pps_config(void __iomem *ioaddr, int index,
|
||||
struct stmmac_pps_cfg *cfg, bool enable,
|
||||
u32 sub_second_inc, u32 systime_flags);
|
||||
int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg,
|
||||
unsigned int ptp_rate);
|
||||
void dwmac5_est_irq_status(void __iomem *ioaddr, struct net_device *dev,
|
||||
struct stmmac_extra_stats *x, u32 txqcnt);
|
||||
void dwmac5_fpe_configure(void __iomem *ioaddr, u32 num_txq, u32 num_rxq,
|
||||
bool enable);
|
||||
void dwmac5_fpe_send_mpacket(void __iomem *ioaddr,
|
||||
enum stmmac_mpacket_type type);
|
||||
int dwmac5_fpe_irq_status(void __iomem *ioaddr, struct net_device *dev);
|
||||
|
||||
#endif /* __DWMAC5_H__ */
|
||||
784
devices/stmmac/dwmac5-6.4-orig.c
Normal file
784
devices/stmmac/dwmac5-6.4-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
162
devices/stmmac/dwmac5-6.4-orig.h
Normal file
162
devices/stmmac/dwmac5-6.4-orig.h
Normal file
@@ -0,0 +1,162 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||
// Copyright (c) 2017 Synopsys, Inc. and/or its affiliates.
|
||||
// stmmac Support for 5.xx Ethernet QoS cores
|
||||
|
||||
#ifndef __DWMAC5_H__
|
||||
#define __DWMAC5_H__
|
||||
|
||||
#define MAC_DPP_FSM_INT_STATUS 0x00000140
|
||||
#define MAC_AXI_SLV_DPE_ADDR_STATUS 0x00000144
|
||||
#define MAC_FSM_CONTROL 0x00000148
|
||||
#define PRTYEN BIT(1)
|
||||
#define TMOUTEN BIT(0)
|
||||
|
||||
#define MAC_FPE_CTRL_STS 0x00000234
|
||||
#define TRSP BIT(19)
|
||||
#define TVER BIT(18)
|
||||
#define RRSP BIT(17)
|
||||
#define RVER BIT(16)
|
||||
#define SRSP BIT(2)
|
||||
#define SVER BIT(1)
|
||||
#define EFPE BIT(0)
|
||||
|
||||
#define MAC_PPS_CONTROL 0x00000b70
|
||||
#define PPS_MAXIDX(x) ((((x) + 1) * 8) - 1)
|
||||
#define PPS_MINIDX(x) ((x) * 8)
|
||||
#define PPSx_MASK(x) GENMASK(PPS_MAXIDX(x), PPS_MINIDX(x))
|
||||
#define MCGRENx(x) BIT(PPS_MAXIDX(x))
|
||||
#define TRGTMODSELx(x, val) \
|
||||
GENMASK(PPS_MAXIDX(x) - 1, PPS_MAXIDX(x) - 2) & \
|
||||
((val) << (PPS_MAXIDX(x) - 2))
|
||||
#define PPSCMDx(x, val) \
|
||||
GENMASK(PPS_MINIDX(x) + 3, PPS_MINIDX(x)) & \
|
||||
((val) << PPS_MINIDX(x))
|
||||
#define PPSEN0 BIT(4)
|
||||
#define MAC_PPSx_TARGET_TIME_SEC(x) (0x00000b80 + ((x) * 0x10))
|
||||
#define MAC_PPSx_TARGET_TIME_NSEC(x) (0x00000b84 + ((x) * 0x10))
|
||||
#define TRGTBUSY0 BIT(31)
|
||||
#define TTSL0 GENMASK(30, 0)
|
||||
#define MAC_PPSx_INTERVAL(x) (0x00000b88 + ((x) * 0x10))
|
||||
#define MAC_PPSx_WIDTH(x) (0x00000b8c + ((x) * 0x10))
|
||||
|
||||
#define MTL_EST_CONTROL 0x00000c50
|
||||
#define PTOV GENMASK(31, 24)
|
||||
#define PTOV_SHIFT 24
|
||||
#define SSWL BIT(1)
|
||||
#define EEST BIT(0)
|
||||
|
||||
#define MTL_EST_STATUS 0x00000c58
|
||||
#define BTRL GENMASK(11, 8)
|
||||
#define BTRL_SHIFT 8
|
||||
#define BTRL_MAX (0xF << BTRL_SHIFT)
|
||||
#define SWOL BIT(7)
|
||||
#define SWOL_SHIFT 7
|
||||
#define CGCE BIT(4)
|
||||
#define HLBS BIT(3)
|
||||
#define HLBF BIT(2)
|
||||
#define BTRE BIT(1)
|
||||
#define SWLC BIT(0)
|
||||
|
||||
#define MTL_EST_SCH_ERR 0x00000c60
|
||||
#define MTL_EST_FRM_SZ_ERR 0x00000c64
|
||||
#define MTL_EST_FRM_SZ_CAP 0x00000c68
|
||||
#define SZ_CAP_HBFS_MASK GENMASK(14, 0)
|
||||
#define SZ_CAP_HBFQ_SHIFT 16
|
||||
#define SZ_CAP_HBFQ_MASK(_val) ({ typeof(_val) (val) = (_val); \
|
||||
((val) > 4 ? GENMASK(18, 16) : \
|
||||
(val) > 2 ? GENMASK(17, 16) : \
|
||||
BIT(16)); })
|
||||
|
||||
#define MTL_EST_INT_EN 0x00000c70
|
||||
#define IECGCE CGCE
|
||||
#define IEHS HLBS
|
||||
#define IEHF HLBF
|
||||
#define IEBE BTRE
|
||||
#define IECC SWLC
|
||||
|
||||
#define MTL_EST_GCL_CONTROL 0x00000c80
|
||||
#define BTR_LOW 0x0
|
||||
#define BTR_HIGH 0x1
|
||||
#define CTR_LOW 0x2
|
||||
#define CTR_HIGH 0x3
|
||||
#define TER 0x4
|
||||
#define LLR 0x5
|
||||
#define ADDR_SHIFT 8
|
||||
#define GCRR BIT(2)
|
||||
#define SRWO BIT(0)
|
||||
#define MTL_EST_GCL_DATA 0x00000c84
|
||||
|
||||
#define MTL_RXP_CONTROL_STATUS 0x00000ca0
|
||||
#define RXPI BIT(31)
|
||||
#define NPE GENMASK(23, 16)
|
||||
#define NVE GENMASK(7, 0)
|
||||
#define MTL_RXP_IACC_CTRL_STATUS 0x00000cb0
|
||||
#define STARTBUSY BIT(31)
|
||||
#define RXPEIEC GENMASK(22, 21)
|
||||
#define RXPEIEE BIT(20)
|
||||
#define WRRDN BIT(16)
|
||||
#define ADDR GENMASK(15, 0)
|
||||
#define MTL_RXP_IACC_DATA 0x00000cb4
|
||||
#define MTL_ECC_CONTROL 0x00000cc0
|
||||
#define MEEAO BIT(8)
|
||||
#define TSOEE BIT(4)
|
||||
#define MRXPEE BIT(3)
|
||||
#define MESTEE BIT(2)
|
||||
#define MRXEE BIT(1)
|
||||
#define MTXEE BIT(0)
|
||||
|
||||
#define MTL_SAFETY_INT_STATUS 0x00000cc4
|
||||
#define MCSIS BIT(31)
|
||||
#define MEUIS BIT(1)
|
||||
#define MECIS BIT(0)
|
||||
#define MTL_ECC_INT_ENABLE 0x00000cc8
|
||||
#define RPCEIE BIT(12)
|
||||
#define ECEIE BIT(8)
|
||||
#define RXCEIE BIT(4)
|
||||
#define TXCEIE BIT(0)
|
||||
#define MTL_ECC_INT_STATUS 0x00000ccc
|
||||
#define MTL_DPP_CONTROL 0x00000ce0
|
||||
#define EPSI BIT(2)
|
||||
#define OPE BIT(1)
|
||||
#define EDPP BIT(0)
|
||||
|
||||
#define DMA_SAFETY_INT_STATUS 0x00001080
|
||||
#define MSUIS BIT(29)
|
||||
#define MSCIS BIT(28)
|
||||
#define DEUIS BIT(1)
|
||||
#define DECIS BIT(0)
|
||||
#define DMA_ECC_INT_ENABLE 0x00001084
|
||||
#define TCEIE BIT(0)
|
||||
#define DMA_ECC_INT_STATUS 0x00001088
|
||||
|
||||
/* EQoS version 5.xx VLAN Tag Filter Fail Packets Queuing */
|
||||
#define GMAC_RXQ_CTRL4 0x00000094
|
||||
#define GMAC_RXQCTRL_VFFQ_MASK GENMASK(19, 17)
|
||||
#define GMAC_RXQCTRL_VFFQ_SHIFT 17
|
||||
#define GMAC_RXQCTRL_VFFQE BIT(16)
|
||||
|
||||
#define GMAC_INT_FPE_EN BIT(17)
|
||||
|
||||
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
|
||||
struct stmmac_safety_feature_cfg *safety_cfg);
|
||||
int dwmac5_safety_feat_irq_status(struct net_device *ndev,
|
||||
void __iomem *ioaddr, unsigned int asp,
|
||||
struct stmmac_safety_stats *stats);
|
||||
int dwmac5_safety_feat_dump(struct stmmac_safety_stats *stats,
|
||||
int index, unsigned long *count, const char **desc);
|
||||
int dwmac5_rxp_config(void __iomem *ioaddr, struct stmmac_tc_entry *entries,
|
||||
unsigned int count);
|
||||
int dwmac5_flex_pps_config(void __iomem *ioaddr, int index,
|
||||
struct stmmac_pps_cfg *cfg, bool enable,
|
||||
u32 sub_second_inc, u32 systime_flags);
|
||||
int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg,
|
||||
unsigned int ptp_rate);
|
||||
void dwmac5_est_irq_status(void __iomem *ioaddr, struct net_device *dev,
|
||||
struct stmmac_extra_stats *x, u32 txqcnt);
|
||||
void dwmac5_fpe_configure(void __iomem *ioaddr, u32 num_txq, u32 num_rxq,
|
||||
bool enable);
|
||||
void dwmac5_fpe_send_mpacket(void __iomem *ioaddr,
|
||||
enum stmmac_mpacket_type type);
|
||||
int dwmac5_fpe_irq_status(void __iomem *ioaddr, struct net_device *dev);
|
||||
|
||||
#endif /* __DWMAC5_H__ */
|
||||
172
devices/stmmac/dwmac_dma-6.4-ethercat.h
Normal file
172
devices/stmmac/dwmac_dma-6.4-ethercat.h
Normal file
@@ -0,0 +1,172 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
DWMAC DMA Header file.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DWMAC_DMA_H__
|
||||
#define __DWMAC_DMA_H__
|
||||
|
||||
/* DMA CRS Control and Status Register Mapping */
|
||||
#define DMA_BUS_MODE 0x00001000 /* Bus Mode */
|
||||
#define DMA_XMT_POLL_DEMAND 0x00001004 /* Transmit Poll Demand */
|
||||
#define DMA_RCV_POLL_DEMAND 0x00001008 /* Received Poll Demand */
|
||||
#define DMA_RCV_BASE_ADDR 0x0000100c /* Receive List Base */
|
||||
#define DMA_TX_BASE_ADDR 0x00001010 /* Transmit List Base */
|
||||
#define DMA_STATUS 0x00001014 /* Status Register */
|
||||
#define DMA_CONTROL 0x00001018 /* Ctrl (Operational Mode) */
|
||||
#define DMA_INTR_ENA 0x0000101c /* Interrupt Enable */
|
||||
#define DMA_MISSED_FRAME_CTR 0x00001020 /* Missed Frame Counter */
|
||||
|
||||
/* SW Reset */
|
||||
#define DMA_BUS_MODE_SFT_RESET 0x00000001 /* Software Reset */
|
||||
|
||||
/* Rx watchdog register */
|
||||
#define DMA_RX_WATCHDOG 0x00001024
|
||||
|
||||
/* AXI Master Bus Mode */
|
||||
#define DMA_AXI_BUS_MODE 0x00001028
|
||||
|
||||
#define DMA_AXI_EN_LPI BIT(31)
|
||||
#define DMA_AXI_LPI_XIT_FRM BIT(30)
|
||||
#define DMA_AXI_WR_OSR_LMT GENMASK(23, 20)
|
||||
#define DMA_AXI_WR_OSR_LMT_SHIFT 20
|
||||
#define DMA_AXI_WR_OSR_LMT_MASK 0xf
|
||||
#define DMA_AXI_RD_OSR_LMT GENMASK(19, 16)
|
||||
#define DMA_AXI_RD_OSR_LMT_SHIFT 16
|
||||
#define DMA_AXI_RD_OSR_LMT_MASK 0xf
|
||||
|
||||
#define DMA_AXI_OSR_MAX 0xf
|
||||
#define DMA_AXI_MAX_OSR_LIMIT ((DMA_AXI_OSR_MAX << DMA_AXI_WR_OSR_LMT_SHIFT) | \
|
||||
(DMA_AXI_OSR_MAX << DMA_AXI_RD_OSR_LMT_SHIFT))
|
||||
#define DMA_AXI_1KBBE BIT(13)
|
||||
#define DMA_AXI_AAL BIT(12)
|
||||
#define DMA_AXI_BLEN256 BIT(7)
|
||||
#define DMA_AXI_BLEN128 BIT(6)
|
||||
#define DMA_AXI_BLEN64 BIT(5)
|
||||
#define DMA_AXI_BLEN32 BIT(4)
|
||||
#define DMA_AXI_BLEN16 BIT(3)
|
||||
#define DMA_AXI_BLEN8 BIT(2)
|
||||
#define DMA_AXI_BLEN4 BIT(1)
|
||||
#define DMA_BURST_LEN_DEFAULT (DMA_AXI_BLEN256 | DMA_AXI_BLEN128 | \
|
||||
DMA_AXI_BLEN64 | DMA_AXI_BLEN32 | \
|
||||
DMA_AXI_BLEN16 | DMA_AXI_BLEN8 | \
|
||||
DMA_AXI_BLEN4)
|
||||
|
||||
#define DMA_AXI_UNDEF BIT(0)
|
||||
|
||||
#define DMA_AXI_BURST_LEN_MASK 0x000000FE
|
||||
|
||||
#define DMA_CUR_TX_BUF_ADDR 0x00001050 /* Current Host Tx Buffer */
|
||||
#define DMA_CUR_RX_BUF_ADDR 0x00001054 /* Current Host Rx Buffer */
|
||||
#define DMA_HW_FEATURE 0x00001058 /* HW Feature Register */
|
||||
|
||||
/* DMA Control register defines */
|
||||
#define DMA_CONTROL_ST 0x00002000 /* Start/Stop Transmission */
|
||||
#define DMA_CONTROL_SR 0x00000002 /* Start/Stop Receive */
|
||||
|
||||
/* DMA Normal interrupt */
|
||||
#define DMA_INTR_ENA_NIE 0x00010000 /* Normal Summary */
|
||||
#define DMA_INTR_ENA_TIE 0x00000001 /* Transmit Interrupt */
|
||||
#define DMA_INTR_ENA_TUE 0x00000004 /* Transmit Buffer Unavailable */
|
||||
#define DMA_INTR_ENA_RIE 0x00000040 /* Receive Interrupt */
|
||||
#define DMA_INTR_ENA_ERE 0x00004000 /* Early Receive */
|
||||
|
||||
#define DMA_INTR_NORMAL (DMA_INTR_ENA_NIE | DMA_INTR_ENA_RIE | \
|
||||
DMA_INTR_ENA_TIE)
|
||||
|
||||
/* DMA Abnormal interrupt */
|
||||
#define DMA_INTR_ENA_AIE 0x00008000 /* Abnormal Summary */
|
||||
#define DMA_INTR_ENA_FBE 0x00002000 /* Fatal Bus Error */
|
||||
#define DMA_INTR_ENA_ETE 0x00000400 /* Early Transmit */
|
||||
#define DMA_INTR_ENA_RWE 0x00000200 /* Receive Watchdog */
|
||||
#define DMA_INTR_ENA_RSE 0x00000100 /* Receive Stopped */
|
||||
#define DMA_INTR_ENA_RUE 0x00000080 /* Receive Buffer Unavailable */
|
||||
#define DMA_INTR_ENA_UNE 0x00000020 /* Tx Underflow */
|
||||
#define DMA_INTR_ENA_OVE 0x00000010 /* Receive Overflow */
|
||||
#define DMA_INTR_ENA_TJE 0x00000008 /* Transmit Jabber */
|
||||
#define DMA_INTR_ENA_TSE 0x00000002 /* Transmit Stopped */
|
||||
|
||||
#define DMA_INTR_ABNORMAL (DMA_INTR_ENA_AIE | DMA_INTR_ENA_FBE | \
|
||||
DMA_INTR_ENA_UNE)
|
||||
|
||||
/* DMA default interrupt mask */
|
||||
#define DMA_INTR_DEFAULT_MASK (DMA_INTR_NORMAL | DMA_INTR_ABNORMAL)
|
||||
#define DMA_INTR_DEFAULT_RX (DMA_INTR_ENA_RIE)
|
||||
#define DMA_INTR_DEFAULT_TX (DMA_INTR_ENA_TIE)
|
||||
|
||||
/* DMA Status register defines */
|
||||
#define DMA_STATUS_GLPII 0x40000000 /* GMAC LPI interrupt */
|
||||
#define DMA_STATUS_GPI 0x10000000 /* PMT interrupt */
|
||||
#define DMA_STATUS_GMI 0x08000000 /* MMC interrupt */
|
||||
#define DMA_STATUS_GLI 0x04000000 /* GMAC Line interface int */
|
||||
#define DMA_STATUS_EB_MASK 0x00380000 /* Error Bits Mask */
|
||||
#define DMA_STATUS_EB_TX_ABORT 0x00080000 /* Error Bits - TX Abort */
|
||||
#define DMA_STATUS_EB_RX_ABORT 0x00100000 /* Error Bits - RX Abort */
|
||||
#define DMA_STATUS_TS_MASK 0x00700000 /* Transmit Process State */
|
||||
#define DMA_STATUS_TS_SHIFT 20
|
||||
#define DMA_STATUS_RS_MASK 0x000e0000 /* Receive Process State */
|
||||
#define DMA_STATUS_RS_SHIFT 17
|
||||
#define DMA_STATUS_NIS 0x00010000 /* Normal Interrupt Summary */
|
||||
#define DMA_STATUS_AIS 0x00008000 /* Abnormal Interrupt Summary */
|
||||
#define DMA_STATUS_ERI 0x00004000 /* Early Receive Interrupt */
|
||||
#define DMA_STATUS_FBI 0x00002000 /* Fatal Bus Error Interrupt */
|
||||
#define DMA_STATUS_ETI 0x00000400 /* Early Transmit Interrupt */
|
||||
#define DMA_STATUS_RWT 0x00000200 /* Receive Watchdog Timeout */
|
||||
#define DMA_STATUS_RPS 0x00000100 /* Receive Process Stopped */
|
||||
#define DMA_STATUS_RU 0x00000080 /* Receive Buffer Unavailable */
|
||||
#define DMA_STATUS_RI 0x00000040 /* Receive Interrupt */
|
||||
#define DMA_STATUS_UNF 0x00000020 /* Transmit Underflow */
|
||||
#define DMA_STATUS_OVF 0x00000010 /* Receive Overflow */
|
||||
#define DMA_STATUS_TJT 0x00000008 /* Transmit Jabber Timeout */
|
||||
#define DMA_STATUS_TU 0x00000004 /* Transmit Buffer Unavailable */
|
||||
#define DMA_STATUS_TPS 0x00000002 /* Transmit Process Stopped */
|
||||
#define DMA_STATUS_TI 0x00000001 /* Transmit Interrupt */
|
||||
#define DMA_CONTROL_FTF 0x00100000 /* Flush transmit FIFO */
|
||||
|
||||
#define DMA_STATUS_MSK_COMMON (DMA_STATUS_NIS | \
|
||||
DMA_STATUS_AIS | \
|
||||
DMA_STATUS_FBI)
|
||||
|
||||
#define DMA_STATUS_MSK_RX (DMA_STATUS_ERI | \
|
||||
DMA_STATUS_RWT | \
|
||||
DMA_STATUS_RPS | \
|
||||
DMA_STATUS_RU | \
|
||||
DMA_STATUS_RI | \
|
||||
DMA_STATUS_OVF | \
|
||||
DMA_STATUS_MSK_COMMON)
|
||||
|
||||
#define DMA_STATUS_MSK_TX (DMA_STATUS_ETI | \
|
||||
DMA_STATUS_UNF | \
|
||||
DMA_STATUS_TJT | \
|
||||
DMA_STATUS_TU | \
|
||||
DMA_STATUS_TPS | \
|
||||
DMA_STATUS_TI | \
|
||||
DMA_STATUS_MSK_COMMON)
|
||||
|
||||
#define NUM_DWMAC100_DMA_REGS 9
|
||||
#define NUM_DWMAC1000_DMA_REGS 23
|
||||
#define NUM_DWMAC4_DMA_REGS 27
|
||||
|
||||
void dwmac_enable_dma_transmission(void __iomem *ioaddr);
|
||||
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
int dwmac_dma_reset(void __iomem *ioaddr);
|
||||
|
||||
#endif /* __DWMAC_DMA_H__ */
|
||||
172
devices/stmmac/dwmac_dma-6.4-orig.h
Normal file
172
devices/stmmac/dwmac_dma-6.4-orig.h
Normal file
@@ -0,0 +1,172 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*******************************************************************************
|
||||
DWMAC DMA Header file.
|
||||
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DWMAC_DMA_H__
|
||||
#define __DWMAC_DMA_H__
|
||||
|
||||
/* DMA CRS Control and Status Register Mapping */
|
||||
#define DMA_BUS_MODE 0x00001000 /* Bus Mode */
|
||||
#define DMA_XMT_POLL_DEMAND 0x00001004 /* Transmit Poll Demand */
|
||||
#define DMA_RCV_POLL_DEMAND 0x00001008 /* Received Poll Demand */
|
||||
#define DMA_RCV_BASE_ADDR 0x0000100c /* Receive List Base */
|
||||
#define DMA_TX_BASE_ADDR 0x00001010 /* Transmit List Base */
|
||||
#define DMA_STATUS 0x00001014 /* Status Register */
|
||||
#define DMA_CONTROL 0x00001018 /* Ctrl (Operational Mode) */
|
||||
#define DMA_INTR_ENA 0x0000101c /* Interrupt Enable */
|
||||
#define DMA_MISSED_FRAME_CTR 0x00001020 /* Missed Frame Counter */
|
||||
|
||||
/* SW Reset */
|
||||
#define DMA_BUS_MODE_SFT_RESET 0x00000001 /* Software Reset */
|
||||
|
||||
/* Rx watchdog register */
|
||||
#define DMA_RX_WATCHDOG 0x00001024
|
||||
|
||||
/* AXI Master Bus Mode */
|
||||
#define DMA_AXI_BUS_MODE 0x00001028
|
||||
|
||||
#define DMA_AXI_EN_LPI BIT(31)
|
||||
#define DMA_AXI_LPI_XIT_FRM BIT(30)
|
||||
#define DMA_AXI_WR_OSR_LMT GENMASK(23, 20)
|
||||
#define DMA_AXI_WR_OSR_LMT_SHIFT 20
|
||||
#define DMA_AXI_WR_OSR_LMT_MASK 0xf
|
||||
#define DMA_AXI_RD_OSR_LMT GENMASK(19, 16)
|
||||
#define DMA_AXI_RD_OSR_LMT_SHIFT 16
|
||||
#define DMA_AXI_RD_OSR_LMT_MASK 0xf
|
||||
|
||||
#define DMA_AXI_OSR_MAX 0xf
|
||||
#define DMA_AXI_MAX_OSR_LIMIT ((DMA_AXI_OSR_MAX << DMA_AXI_WR_OSR_LMT_SHIFT) | \
|
||||
(DMA_AXI_OSR_MAX << DMA_AXI_RD_OSR_LMT_SHIFT))
|
||||
#define DMA_AXI_1KBBE BIT(13)
|
||||
#define DMA_AXI_AAL BIT(12)
|
||||
#define DMA_AXI_BLEN256 BIT(7)
|
||||
#define DMA_AXI_BLEN128 BIT(6)
|
||||
#define DMA_AXI_BLEN64 BIT(5)
|
||||
#define DMA_AXI_BLEN32 BIT(4)
|
||||
#define DMA_AXI_BLEN16 BIT(3)
|
||||
#define DMA_AXI_BLEN8 BIT(2)
|
||||
#define DMA_AXI_BLEN4 BIT(1)
|
||||
#define DMA_BURST_LEN_DEFAULT (DMA_AXI_BLEN256 | DMA_AXI_BLEN128 | \
|
||||
DMA_AXI_BLEN64 | DMA_AXI_BLEN32 | \
|
||||
DMA_AXI_BLEN16 | DMA_AXI_BLEN8 | \
|
||||
DMA_AXI_BLEN4)
|
||||
|
||||
#define DMA_AXI_UNDEF BIT(0)
|
||||
|
||||
#define DMA_AXI_BURST_LEN_MASK 0x000000FE
|
||||
|
||||
#define DMA_CUR_TX_BUF_ADDR 0x00001050 /* Current Host Tx Buffer */
|
||||
#define DMA_CUR_RX_BUF_ADDR 0x00001054 /* Current Host Rx Buffer */
|
||||
#define DMA_HW_FEATURE 0x00001058 /* HW Feature Register */
|
||||
|
||||
/* DMA Control register defines */
|
||||
#define DMA_CONTROL_ST 0x00002000 /* Start/Stop Transmission */
|
||||
#define DMA_CONTROL_SR 0x00000002 /* Start/Stop Receive */
|
||||
|
||||
/* DMA Normal interrupt */
|
||||
#define DMA_INTR_ENA_NIE 0x00010000 /* Normal Summary */
|
||||
#define DMA_INTR_ENA_TIE 0x00000001 /* Transmit Interrupt */
|
||||
#define DMA_INTR_ENA_TUE 0x00000004 /* Transmit Buffer Unavailable */
|
||||
#define DMA_INTR_ENA_RIE 0x00000040 /* Receive Interrupt */
|
||||
#define DMA_INTR_ENA_ERE 0x00004000 /* Early Receive */
|
||||
|
||||
#define DMA_INTR_NORMAL (DMA_INTR_ENA_NIE | DMA_INTR_ENA_RIE | \
|
||||
DMA_INTR_ENA_TIE)
|
||||
|
||||
/* DMA Abnormal interrupt */
|
||||
#define DMA_INTR_ENA_AIE 0x00008000 /* Abnormal Summary */
|
||||
#define DMA_INTR_ENA_FBE 0x00002000 /* Fatal Bus Error */
|
||||
#define DMA_INTR_ENA_ETE 0x00000400 /* Early Transmit */
|
||||
#define DMA_INTR_ENA_RWE 0x00000200 /* Receive Watchdog */
|
||||
#define DMA_INTR_ENA_RSE 0x00000100 /* Receive Stopped */
|
||||
#define DMA_INTR_ENA_RUE 0x00000080 /* Receive Buffer Unavailable */
|
||||
#define DMA_INTR_ENA_UNE 0x00000020 /* Tx Underflow */
|
||||
#define DMA_INTR_ENA_OVE 0x00000010 /* Receive Overflow */
|
||||
#define DMA_INTR_ENA_TJE 0x00000008 /* Transmit Jabber */
|
||||
#define DMA_INTR_ENA_TSE 0x00000002 /* Transmit Stopped */
|
||||
|
||||
#define DMA_INTR_ABNORMAL (DMA_INTR_ENA_AIE | DMA_INTR_ENA_FBE | \
|
||||
DMA_INTR_ENA_UNE)
|
||||
|
||||
/* DMA default interrupt mask */
|
||||
#define DMA_INTR_DEFAULT_MASK (DMA_INTR_NORMAL | DMA_INTR_ABNORMAL)
|
||||
#define DMA_INTR_DEFAULT_RX (DMA_INTR_ENA_RIE)
|
||||
#define DMA_INTR_DEFAULT_TX (DMA_INTR_ENA_TIE)
|
||||
|
||||
/* DMA Status register defines */
|
||||
#define DMA_STATUS_GLPII 0x40000000 /* GMAC LPI interrupt */
|
||||
#define DMA_STATUS_GPI 0x10000000 /* PMT interrupt */
|
||||
#define DMA_STATUS_GMI 0x08000000 /* MMC interrupt */
|
||||
#define DMA_STATUS_GLI 0x04000000 /* GMAC Line interface int */
|
||||
#define DMA_STATUS_EB_MASK 0x00380000 /* Error Bits Mask */
|
||||
#define DMA_STATUS_EB_TX_ABORT 0x00080000 /* Error Bits - TX Abort */
|
||||
#define DMA_STATUS_EB_RX_ABORT 0x00100000 /* Error Bits - RX Abort */
|
||||
#define DMA_STATUS_TS_MASK 0x00700000 /* Transmit Process State */
|
||||
#define DMA_STATUS_TS_SHIFT 20
|
||||
#define DMA_STATUS_RS_MASK 0x000e0000 /* Receive Process State */
|
||||
#define DMA_STATUS_RS_SHIFT 17
|
||||
#define DMA_STATUS_NIS 0x00010000 /* Normal Interrupt Summary */
|
||||
#define DMA_STATUS_AIS 0x00008000 /* Abnormal Interrupt Summary */
|
||||
#define DMA_STATUS_ERI 0x00004000 /* Early Receive Interrupt */
|
||||
#define DMA_STATUS_FBI 0x00002000 /* Fatal Bus Error Interrupt */
|
||||
#define DMA_STATUS_ETI 0x00000400 /* Early Transmit Interrupt */
|
||||
#define DMA_STATUS_RWT 0x00000200 /* Receive Watchdog Timeout */
|
||||
#define DMA_STATUS_RPS 0x00000100 /* Receive Process Stopped */
|
||||
#define DMA_STATUS_RU 0x00000080 /* Receive Buffer Unavailable */
|
||||
#define DMA_STATUS_RI 0x00000040 /* Receive Interrupt */
|
||||
#define DMA_STATUS_UNF 0x00000020 /* Transmit Underflow */
|
||||
#define DMA_STATUS_OVF 0x00000010 /* Receive Overflow */
|
||||
#define DMA_STATUS_TJT 0x00000008 /* Transmit Jabber Timeout */
|
||||
#define DMA_STATUS_TU 0x00000004 /* Transmit Buffer Unavailable */
|
||||
#define DMA_STATUS_TPS 0x00000002 /* Transmit Process Stopped */
|
||||
#define DMA_STATUS_TI 0x00000001 /* Transmit Interrupt */
|
||||
#define DMA_CONTROL_FTF 0x00100000 /* Flush transmit FIFO */
|
||||
|
||||
#define DMA_STATUS_MSK_COMMON (DMA_STATUS_NIS | \
|
||||
DMA_STATUS_AIS | \
|
||||
DMA_STATUS_FBI)
|
||||
|
||||
#define DMA_STATUS_MSK_RX (DMA_STATUS_ERI | \
|
||||
DMA_STATUS_RWT | \
|
||||
DMA_STATUS_RPS | \
|
||||
DMA_STATUS_RU | \
|
||||
DMA_STATUS_RI | \
|
||||
DMA_STATUS_OVF | \
|
||||
DMA_STATUS_MSK_COMMON)
|
||||
|
||||
#define DMA_STATUS_MSK_TX (DMA_STATUS_ETI | \
|
||||
DMA_STATUS_UNF | \
|
||||
DMA_STATUS_TJT | \
|
||||
DMA_STATUS_TU | \
|
||||
DMA_STATUS_TPS | \
|
||||
DMA_STATUS_TI | \
|
||||
DMA_STATUS_MSK_COMMON)
|
||||
|
||||
#define NUM_DWMAC100_DMA_REGS 9
|
||||
#define NUM_DWMAC1000_DMA_REGS 23
|
||||
#define NUM_DWMAC4_DMA_REGS 27
|
||||
|
||||
void dwmac_enable_dma_transmission(void __iomem *ioaddr);
|
||||
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx);
|
||||
void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
void dwmac_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan);
|
||||
int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
int dwmac_dma_reset(void __iomem *ioaddr);
|
||||
|
||||
#endif /* __DWMAC_DMA_H__ */
|
||||
294
devices/stmmac/dwmac_lib-6.4-ethercat.c
Normal file
294
devices/stmmac/dwmac_lib-6.4-ethercat.c
Normal file
@@ -0,0 +1,294 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include "common-6.4-ethercat.h"
|
||||
#include "dwmac_dma-6.4-ethercat.h"
|
||||
|
||||
#define GMAC_HI_REG_AE 0x80000000
|
||||
|
||||
int dwmac_dma_reset(void __iomem *ioaddr)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* DMA SW reset */
|
||||
value |= DMA_BUS_MODE_SFT_RESET;
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
|
||||
!(value & DMA_BUS_MODE_SFT_RESET),
|
||||
10000, 200000);
|
||||
}
|
||||
|
||||
/* CSR1 enables the transmit DMA to check for new descriptor */
|
||||
void dwmac_enable_dma_transmission(void __iomem *ioaddr)
|
||||
{
|
||||
writel(1, ioaddr + DMA_XMT_POLL_DEMAND);
|
||||
}
|
||||
|
||||
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
|
||||
if (rx)
|
||||
value |= DMA_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value |= DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
#ifdef DWMAC_DMA_DEBUG
|
||||
static void show_tx_process_state(unsigned int status)
|
||||
{
|
||||
unsigned int state;
|
||||
state = (status & DMA_STATUS_TS_MASK) >> DMA_STATUS_TS_SHIFT;
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
pr_debug("- TX (Stopped): Reset or Stop command\n");
|
||||
break;
|
||||
case 1:
|
||||
pr_debug("- TX (Running): Fetching the Tx desc\n");
|
||||
break;
|
||||
case 2:
|
||||
pr_debug("- TX (Running): Waiting for end of tx\n");
|
||||
break;
|
||||
case 3:
|
||||
pr_debug("- TX (Running): Reading the data "
|
||||
"and queuing the data into the Tx buf\n");
|
||||
break;
|
||||
case 6:
|
||||
pr_debug("- TX (Suspended): Tx Buff Underflow "
|
||||
"or an unavailable Transmit descriptor\n");
|
||||
break;
|
||||
case 7:
|
||||
pr_debug("- TX (Running): Closing Tx descriptor\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void show_rx_process_state(unsigned int status)
|
||||
{
|
||||
unsigned int state;
|
||||
state = (status & DMA_STATUS_RS_MASK) >> DMA_STATUS_RS_SHIFT;
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
pr_debug("- RX (Stopped): Reset or Stop command\n");
|
||||
break;
|
||||
case 1:
|
||||
pr_debug("- RX (Running): Fetching the Rx desc\n");
|
||||
break;
|
||||
case 2:
|
||||
pr_debug("- RX (Running): Checking for end of pkt\n");
|
||||
break;
|
||||
case 3:
|
||||
pr_debug("- RX (Running): Waiting for Rx pkt\n");
|
||||
break;
|
||||
case 4:
|
||||
pr_debug("- RX (Suspended): Unavailable Rx buf\n");
|
||||
break;
|
||||
case 5:
|
||||
pr_debug("- RX (Running): Closing Rx descriptor\n");
|
||||
break;
|
||||
case 6:
|
||||
pr_debug("- RX(Running): Flushing the current frame"
|
||||
" from the Rx buf\n");
|
||||
break;
|
||||
case 7:
|
||||
pr_debug("- RX (Running): Queuing the Rx frame"
|
||||
" from the Rx buf into memory\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
int ret = 0;
|
||||
/* read the status register (CSR5) */
|
||||
u32 intr_status = readl(ioaddr + DMA_STATUS);
|
||||
|
||||
#ifdef DWMAC_DMA_DEBUG
|
||||
/* Enable it to monitor DMA rx/tx status in case of critical problems */
|
||||
pr_debug("%s: [CSR5: 0x%08x]\n", __func__, intr_status);
|
||||
show_tx_process_state(intr_status);
|
||||
show_rx_process_state(intr_status);
|
||||
#endif
|
||||
|
||||
if (dir == DMA_DIR_RX)
|
||||
intr_status &= DMA_STATUS_MSK_RX;
|
||||
else if (dir == DMA_DIR_TX)
|
||||
intr_status &= DMA_STATUS_MSK_TX;
|
||||
|
||||
/* ABNORMAL interrupts */
|
||||
if (unlikely(intr_status & DMA_STATUS_AIS)) {
|
||||
if (unlikely(intr_status & DMA_STATUS_UNF)) {
|
||||
ret = tx_hard_error_bump_tc;
|
||||
x->tx_undeflow_irq++;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_TJT))
|
||||
x->tx_jabber_irq++;
|
||||
|
||||
if (unlikely(intr_status & DMA_STATUS_OVF))
|
||||
x->rx_overflow_irq++;
|
||||
|
||||
if (unlikely(intr_status & DMA_STATUS_RU))
|
||||
x->rx_buf_unav_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_RPS))
|
||||
x->rx_process_stopped_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_RWT))
|
||||
x->rx_watchdog_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_ETI))
|
||||
x->tx_early_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_TPS)) {
|
||||
x->tx_process_stopped_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_FBI)) {
|
||||
x->fatal_bus_error_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
}
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & DMA_STATUS_NIS)) {
|
||||
x->normal_irq_n++;
|
||||
if (likely(intr_status & DMA_STATUS_RI)) {
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
/* to schedule NAPI on real RIE event. */
|
||||
if (likely(value & DMA_INTR_ENA_RIE)) {
|
||||
x->rx_normal_irq_n++;
|
||||
ret |= handle_rx;
|
||||
}
|
||||
}
|
||||
if (likely(intr_status & DMA_STATUS_TI)) {
|
||||
x->tx_normal_irq_n++;
|
||||
ret |= handle_tx;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_ERI))
|
||||
x->rx_early_irq++;
|
||||
}
|
||||
/* Optional hardware blocks, interrupts should be disabled */
|
||||
if (unlikely(intr_status &
|
||||
(DMA_STATUS_GPI | DMA_STATUS_GMI | DMA_STATUS_GLI)))
|
||||
pr_warn("%s: unexpected status %08x\n", __func__, intr_status);
|
||||
|
||||
/* Clear the interrupt by writing a logic 1 to the CSR5[15-0] */
|
||||
writel((intr_status & 0x1ffff), ioaddr + DMA_STATUS);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
writel((csr6 | DMA_CONTROL_FTF), ioaddr + DMA_CONTROL);
|
||||
|
||||
do {} while ((readl(ioaddr + DMA_CONTROL) & DMA_CONTROL_FTF));
|
||||
}
|
||||
|
||||
void stmmac_set_mac_addr(void __iomem *ioaddr, const u8 addr[6],
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
data = (addr[5] << 8) | addr[4];
|
||||
/* For MAC Addr registers we have to set the Address Enable (AE)
|
||||
* bit that has no effect on the High Reg 0 where the bit 31 (MO)
|
||||
* is RO.
|
||||
*/
|
||||
writel(data | GMAC_HI_REG_AE, ioaddr + high);
|
||||
data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
|
||||
writel(data, ioaddr + low);
|
||||
}
|
||||
|
||||
/* Enable disable MAC RX/TX */
|
||||
void stmmac_set_mac(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 old_val, value;
|
||||
|
||||
old_val = readl(ioaddr + MAC_CTRL_REG);
|
||||
value = old_val;
|
||||
|
||||
if (enable)
|
||||
value |= MAC_ENABLE_RX | MAC_ENABLE_TX;
|
||||
else
|
||||
value &= ~(MAC_ENABLE_TX | MAC_ENABLE_RX);
|
||||
|
||||
if (value != old_val)
|
||||
writel(value, ioaddr + MAC_CTRL_REG);
|
||||
}
|
||||
|
||||
void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned int hi_addr, lo_addr;
|
||||
|
||||
/* Read the MAC address from the hardware */
|
||||
hi_addr = readl(ioaddr + high);
|
||||
lo_addr = readl(ioaddr + low);
|
||||
|
||||
/* Extract the MAC address from the high and low words */
|
||||
addr[0] = lo_addr & 0xff;
|
||||
addr[1] = (lo_addr >> 8) & 0xff;
|
||||
addr[2] = (lo_addr >> 16) & 0xff;
|
||||
addr[3] = (lo_addr >> 24) & 0xff;
|
||||
addr[4] = hi_addr & 0xff;
|
||||
addr[5] = (hi_addr >> 8) & 0xff;
|
||||
}
|
||||
296
devices/stmmac/dwmac_lib-6.4-orig.c
Normal file
296
devices/stmmac/dwmac_lib-6.4-orig.c
Normal file
@@ -0,0 +1,296 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*******************************************************************************
|
||||
Copyright (C) 2007-2009 STMicroelectronics Ltd
|
||||
|
||||
|
||||
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include "common.h"
|
||||
#include "dwmac_dma.h"
|
||||
|
||||
#define GMAC_HI_REG_AE 0x80000000
|
||||
|
||||
int dwmac_dma_reset(void __iomem *ioaddr)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||
|
||||
/* DMA SW reset */
|
||||
value |= DMA_BUS_MODE_SFT_RESET;
|
||||
writel(value, ioaddr + DMA_BUS_MODE);
|
||||
|
||||
return readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
|
||||
!(value & DMA_BUS_MODE_SFT_RESET),
|
||||
10000, 200000);
|
||||
}
|
||||
|
||||
/* CSR1 enables the transmit DMA to check for new descriptor */
|
||||
void dwmac_enable_dma_transmission(void __iomem *ioaddr)
|
||||
{
|
||||
writel(1, ioaddr + DMA_XMT_POLL_DEMAND);
|
||||
}
|
||||
|
||||
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
|
||||
if (rx)
|
||||
value |= DMA_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_INTR_ENA);
|
||||
}
|
||||
|
||||
void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value |= DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
void dwmac_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CONTROL);
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CONTROL);
|
||||
}
|
||||
|
||||
#ifdef DWMAC_DMA_DEBUG
|
||||
static void show_tx_process_state(unsigned int status)
|
||||
{
|
||||
unsigned int state;
|
||||
state = (status & DMA_STATUS_TS_MASK) >> DMA_STATUS_TS_SHIFT;
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
pr_debug("- TX (Stopped): Reset or Stop command\n");
|
||||
break;
|
||||
case 1:
|
||||
pr_debug("- TX (Running): Fetching the Tx desc\n");
|
||||
break;
|
||||
case 2:
|
||||
pr_debug("- TX (Running): Waiting for end of tx\n");
|
||||
break;
|
||||
case 3:
|
||||
pr_debug("- TX (Running): Reading the data "
|
||||
"and queuing the data into the Tx buf\n");
|
||||
break;
|
||||
case 6:
|
||||
pr_debug("- TX (Suspended): Tx Buff Underflow "
|
||||
"or an unavailable Transmit descriptor\n");
|
||||
break;
|
||||
case 7:
|
||||
pr_debug("- TX (Running): Closing Tx descriptor\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void show_rx_process_state(unsigned int status)
|
||||
{
|
||||
unsigned int state;
|
||||
state = (status & DMA_STATUS_RS_MASK) >> DMA_STATUS_RS_SHIFT;
|
||||
|
||||
switch (state) {
|
||||
case 0:
|
||||
pr_debug("- RX (Stopped): Reset or Stop command\n");
|
||||
break;
|
||||
case 1:
|
||||
pr_debug("- RX (Running): Fetching the Rx desc\n");
|
||||
break;
|
||||
case 2:
|
||||
pr_debug("- RX (Running): Checking for end of pkt\n");
|
||||
break;
|
||||
case 3:
|
||||
pr_debug("- RX (Running): Waiting for Rx pkt\n");
|
||||
break;
|
||||
case 4:
|
||||
pr_debug("- RX (Suspended): Unavailable Rx buf\n");
|
||||
break;
|
||||
case 5:
|
||||
pr_debug("- RX (Running): Closing Rx descriptor\n");
|
||||
break;
|
||||
case 6:
|
||||
pr_debug("- RX(Running): Flushing the current frame"
|
||||
" from the Rx buf\n");
|
||||
break;
|
||||
case 7:
|
||||
pr_debug("- RX (Running): Queuing the Rx frame"
|
||||
" from the Rx buf into memory\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
int ret = 0;
|
||||
/* read the status register (CSR5) */
|
||||
u32 intr_status = readl(ioaddr + DMA_STATUS);
|
||||
|
||||
#ifdef DWMAC_DMA_DEBUG
|
||||
/* Enable it to monitor DMA rx/tx status in case of critical problems */
|
||||
pr_debug("%s: [CSR5: 0x%08x]\n", __func__, intr_status);
|
||||
show_tx_process_state(intr_status);
|
||||
show_rx_process_state(intr_status);
|
||||
#endif
|
||||
|
||||
if (dir == DMA_DIR_RX)
|
||||
intr_status &= DMA_STATUS_MSK_RX;
|
||||
else if (dir == DMA_DIR_TX)
|
||||
intr_status &= DMA_STATUS_MSK_TX;
|
||||
|
||||
/* ABNORMAL interrupts */
|
||||
if (unlikely(intr_status & DMA_STATUS_AIS)) {
|
||||
if (unlikely(intr_status & DMA_STATUS_UNF)) {
|
||||
ret = tx_hard_error_bump_tc;
|
||||
x->tx_undeflow_irq++;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_TJT))
|
||||
x->tx_jabber_irq++;
|
||||
|
||||
if (unlikely(intr_status & DMA_STATUS_OVF))
|
||||
x->rx_overflow_irq++;
|
||||
|
||||
if (unlikely(intr_status & DMA_STATUS_RU))
|
||||
x->rx_buf_unav_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_RPS))
|
||||
x->rx_process_stopped_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_RWT))
|
||||
x->rx_watchdog_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_ETI))
|
||||
x->tx_early_irq++;
|
||||
if (unlikely(intr_status & DMA_STATUS_TPS)) {
|
||||
x->tx_process_stopped_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_FBI)) {
|
||||
x->fatal_bus_error_irq++;
|
||||
ret = tx_hard_error;
|
||||
}
|
||||
}
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & DMA_STATUS_NIS)) {
|
||||
x->normal_irq_n++;
|
||||
if (likely(intr_status & DMA_STATUS_RI)) {
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
/* to schedule NAPI on real RIE event. */
|
||||
if (likely(value & DMA_INTR_ENA_RIE)) {
|
||||
x->rx_normal_irq_n++;
|
||||
ret |= handle_rx;
|
||||
}
|
||||
}
|
||||
if (likely(intr_status & DMA_STATUS_TI)) {
|
||||
x->tx_normal_irq_n++;
|
||||
ret |= handle_tx;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_ERI))
|
||||
x->rx_early_irq++;
|
||||
}
|
||||
/* Optional hardware blocks, interrupts should be disabled */
|
||||
if (unlikely(intr_status &
|
||||
(DMA_STATUS_GPI | DMA_STATUS_GMI | DMA_STATUS_GLI)))
|
||||
pr_warn("%s: unexpected status %08x\n", __func__, intr_status);
|
||||
|
||||
/* Clear the interrupt by writing a logic 1 to the CSR5[15-0] */
|
||||
writel((intr_status & 0x1ffff), ioaddr + DMA_STATUS);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr)
|
||||
{
|
||||
u32 csr6 = readl(ioaddr + DMA_CONTROL);
|
||||
writel((csr6 | DMA_CONTROL_FTF), ioaddr + DMA_CONTROL);
|
||||
|
||||
do {} while ((readl(ioaddr + DMA_CONTROL) & DMA_CONTROL_FTF));
|
||||
}
|
||||
|
||||
void stmmac_set_mac_addr(void __iomem *ioaddr, const u8 addr[6],
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
data = (addr[5] << 8) | addr[4];
|
||||
/* For MAC Addr registers we have to set the Address Enable (AE)
|
||||
* bit that has no effect on the High Reg 0 where the bit 31 (MO)
|
||||
* is RO.
|
||||
*/
|
||||
writel(data | GMAC_HI_REG_AE, ioaddr + high);
|
||||
data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
|
||||
writel(data, ioaddr + low);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stmmac_set_mac_addr);
|
||||
|
||||
/* Enable disable MAC RX/TX */
|
||||
void stmmac_set_mac(void __iomem *ioaddr, bool enable)
|
||||
{
|
||||
u32 old_val, value;
|
||||
|
||||
old_val = readl(ioaddr + MAC_CTRL_REG);
|
||||
value = old_val;
|
||||
|
||||
if (enable)
|
||||
value |= MAC_ENABLE_RX | MAC_ENABLE_TX;
|
||||
else
|
||||
value &= ~(MAC_ENABLE_TX | MAC_ENABLE_RX);
|
||||
|
||||
if (value != old_val)
|
||||
writel(value, ioaddr + MAC_CTRL_REG);
|
||||
}
|
||||
|
||||
void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
|
||||
unsigned int high, unsigned int low)
|
||||
{
|
||||
unsigned int hi_addr, lo_addr;
|
||||
|
||||
/* Read the MAC address from the hardware */
|
||||
hi_addr = readl(ioaddr + high);
|
||||
lo_addr = readl(ioaddr + low);
|
||||
|
||||
/* Extract the MAC address from the high and low words */
|
||||
addr[0] = lo_addr & 0xff;
|
||||
addr[1] = (lo_addr >> 8) & 0xff;
|
||||
addr[2] = (lo_addr >> 16) & 0xff;
|
||||
addr[3] = (lo_addr >> 24) & 0xff;
|
||||
addr[4] = hi_addr & 0xff;
|
||||
addr[5] = (hi_addr >> 8) & 0xff;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stmmac_get_mac_addr);
|
||||
474
devices/stmmac/dwxgmac2-6.4-ethercat.h
Normal file
474
devices/stmmac/dwxgmac2-6.4-ethercat.h
Normal file
@@ -0,0 +1,474 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Synopsys, Inc. and/or its affiliates.
|
||||
* stmmac XGMAC definitions.
|
||||
*/
|
||||
|
||||
#ifndef __STMMAC_DWXGMAC2_H__
|
||||
#define __STMMAC_DWXGMAC2_H__
|
||||
|
||||
#include "common-6.4-ethercat.h"
|
||||
|
||||
/* Misc */
|
||||
#define XGMAC_JUMBO_LEN 16368
|
||||
|
||||
/* MAC Registers */
|
||||
#define XGMAC_TX_CONFIG 0x00000000
|
||||
#define XGMAC_CONFIG_SS_OFF 29
|
||||
#define XGMAC_CONFIG_SS_MASK GENMASK(31, 29)
|
||||
#define XGMAC_CONFIG_SS_10000 (0x0 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_2500_GMII (0x2 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_1000_GMII (0x3 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_100_MII (0x4 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_5000 (0x5 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_2500 (0x6 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_10_MII (0x7 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SARC GENMASK(22, 20)
|
||||
#define XGMAC_CONFIG_SARC_SHIFT 20
|
||||
#define XGMAC_CONFIG_JD BIT(16)
|
||||
#define XGMAC_CONFIG_TE BIT(0)
|
||||
#define XGMAC_CORE_INIT_TX (XGMAC_CONFIG_JD)
|
||||
#define XGMAC_RX_CONFIG 0x00000004
|
||||
#define XGMAC_CONFIG_ARPEN BIT(31)
|
||||
#define XGMAC_CONFIG_GPSL GENMASK(29, 16)
|
||||
#define XGMAC_CONFIG_GPSL_SHIFT 16
|
||||
#define XGMAC_CONFIG_HDSMS GENMASK(14, 12)
|
||||
#define XGMAC_CONFIG_HDSMS_SHIFT 12
|
||||
#define XGMAC_CONFIG_HDSMS_256 (0x2 << XGMAC_CONFIG_HDSMS_SHIFT)
|
||||
#define XGMAC_CONFIG_S2KP BIT(11)
|
||||
#define XGMAC_CONFIG_LM BIT(10)
|
||||
#define XGMAC_CONFIG_IPC BIT(9)
|
||||
#define XGMAC_CONFIG_JE BIT(8)
|
||||
#define XGMAC_CONFIG_WD BIT(7)
|
||||
#define XGMAC_CONFIG_GPSLCE BIT(6)
|
||||
#define XGMAC_CONFIG_CST BIT(2)
|
||||
#define XGMAC_CONFIG_ACS BIT(1)
|
||||
#define XGMAC_CONFIG_RE BIT(0)
|
||||
#define XGMAC_CORE_INIT_RX (XGMAC_CONFIG_GPSLCE | XGMAC_CONFIG_WD | \
|
||||
(XGMAC_JUMBO_LEN << XGMAC_CONFIG_GPSL_SHIFT))
|
||||
#define XGMAC_PACKET_FILTER 0x00000008
|
||||
#define XGMAC_FILTER_RA BIT(31)
|
||||
#define XGMAC_FILTER_IPFE BIT(20)
|
||||
#define XGMAC_FILTER_VTFE BIT(16)
|
||||
#define XGMAC_FILTER_HPF BIT(10)
|
||||
#define XGMAC_FILTER_PCF BIT(7)
|
||||
#define XGMAC_FILTER_PM BIT(4)
|
||||
#define XGMAC_FILTER_HMC BIT(2)
|
||||
#define XGMAC_FILTER_PR BIT(0)
|
||||
#define XGMAC_HASH_TABLE(x) (0x00000010 + (x) * 4)
|
||||
#define XGMAC_MAX_HASH_TABLE 8
|
||||
#define XGMAC_VLAN_TAG 0x00000050
|
||||
#define XGMAC_VLAN_EDVLP BIT(26)
|
||||
#define XGMAC_VLAN_VTHM BIT(25)
|
||||
#define XGMAC_VLAN_DOVLTC BIT(20)
|
||||
#define XGMAC_VLAN_ESVL BIT(18)
|
||||
#define XGMAC_VLAN_ETV BIT(16)
|
||||
#define XGMAC_VLAN_VID GENMASK(15, 0)
|
||||
#define XGMAC_VLAN_HASH_TABLE 0x00000058
|
||||
#define XGMAC_VLAN_INCL 0x00000060
|
||||
#define XGMAC_VLAN_VLTI BIT(20)
|
||||
#define XGMAC_VLAN_CSVL BIT(19)
|
||||
#define XGMAC_VLAN_VLC GENMASK(17, 16)
|
||||
#define XGMAC_VLAN_VLC_SHIFT 16
|
||||
#define XGMAC_RXQ_CTRL0 0x000000a0
|
||||
#define XGMAC_RXQEN(x) GENMASK((x) * 2 + 1, (x) * 2)
|
||||
#define XGMAC_RXQEN_SHIFT(x) ((x) * 2)
|
||||
#define XGMAC_RXQ_CTRL1 0x000000a4
|
||||
#define XGMAC_RQ GENMASK(7, 4)
|
||||
#define XGMAC_RQ_SHIFT 4
|
||||
#define XGMAC_RXQ_CTRL2 0x000000a8
|
||||
#define XGMAC_RXQ_CTRL3 0x000000ac
|
||||
#define XGMAC_PSRQ(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_PSRQ_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_INT_STATUS 0x000000b0
|
||||
#define XGMAC_LPIIS BIT(5)
|
||||
#define XGMAC_PMTIS BIT(4)
|
||||
#define XGMAC_INT_EN 0x000000b4
|
||||
#define XGMAC_TSIE BIT(12)
|
||||
#define XGMAC_LPIIE BIT(5)
|
||||
#define XGMAC_PMTIE BIT(4)
|
||||
#define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE)
|
||||
#define XGMAC_Qx_TX_FLOW_CTRL(x) (0x00000070 + (x) * 4)
|
||||
#define XGMAC_PT GENMASK(31, 16)
|
||||
#define XGMAC_PT_SHIFT 16
|
||||
#define XGMAC_TFE BIT(1)
|
||||
#define XGMAC_RX_FLOW_CTRL 0x00000090
|
||||
#define XGMAC_RFE BIT(0)
|
||||
#define XGMAC_PMT 0x000000c0
|
||||
#define XGMAC_GLBLUCAST BIT(9)
|
||||
#define XGMAC_RWKPKTEN BIT(2)
|
||||
#define XGMAC_MGKPKTEN BIT(1)
|
||||
#define XGMAC_PWRDWN BIT(0)
|
||||
#define XGMAC_LPI_CTRL 0x000000d0
|
||||
#define XGMAC_TXCGE BIT(21)
|
||||
#define XGMAC_LPITXA BIT(19)
|
||||
#define XGMAC_PLS BIT(17)
|
||||
#define XGMAC_LPITXEN BIT(16)
|
||||
#define XGMAC_RLPIEX BIT(3)
|
||||
#define XGMAC_RLPIEN BIT(2)
|
||||
#define XGMAC_TLPIEX BIT(1)
|
||||
#define XGMAC_TLPIEN BIT(0)
|
||||
#define XGMAC_LPI_TIMER_CTRL 0x000000d4
|
||||
#define XGMAC_HW_FEATURE0 0x0000011c
|
||||
#define XGMAC_HWFEAT_SAVLANINS BIT(27)
|
||||
#define XGMAC_HWFEAT_RXCOESEL BIT(16)
|
||||
#define XGMAC_HWFEAT_TXCOESEL BIT(14)
|
||||
#define XGMAC_HWFEAT_EEESEL BIT(13)
|
||||
#define XGMAC_HWFEAT_TSSEL BIT(12)
|
||||
#define XGMAC_HWFEAT_AVSEL BIT(11)
|
||||
#define XGMAC_HWFEAT_RAVSEL BIT(10)
|
||||
#define XGMAC_HWFEAT_ARPOFFSEL BIT(9)
|
||||
#define XGMAC_HWFEAT_MMCSEL BIT(8)
|
||||
#define XGMAC_HWFEAT_MGKSEL BIT(7)
|
||||
#define XGMAC_HWFEAT_RWKSEL BIT(6)
|
||||
#define XGMAC_HWFEAT_VLHASH BIT(4)
|
||||
#define XGMAC_HWFEAT_GMIISEL BIT(1)
|
||||
#define XGMAC_HW_FEATURE1 0x00000120
|
||||
#define XGMAC_HWFEAT_L3L4FNUM GENMASK(30, 27)
|
||||
#define XGMAC_HWFEAT_HASHTBLSZ GENMASK(25, 24)
|
||||
#define XGMAC_HWFEAT_RSSEN BIT(20)
|
||||
#define XGMAC_HWFEAT_TSOEN BIT(18)
|
||||
#define XGMAC_HWFEAT_SPHEN BIT(17)
|
||||
#define XGMAC_HWFEAT_ADDR64 GENMASK(15, 14)
|
||||
#define XGMAC_HWFEAT_TXFIFOSIZE GENMASK(10, 6)
|
||||
#define XGMAC_HWFEAT_RXFIFOSIZE GENMASK(4, 0)
|
||||
#define XGMAC_HW_FEATURE2 0x00000124
|
||||
#define XGMAC_HWFEAT_PPSOUTNUM GENMASK(26, 24)
|
||||
#define XGMAC_HWFEAT_TXCHCNT GENMASK(21, 18)
|
||||
#define XGMAC_HWFEAT_RXCHCNT GENMASK(15, 12)
|
||||
#define XGMAC_HWFEAT_TXQCNT GENMASK(9, 6)
|
||||
#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)
|
||||
#define XGMAC_HW_FEATURE3 0x00000128
|
||||
#define XGMAC_HWFEAT_TBSSEL BIT(27)
|
||||
#define XGMAC_HWFEAT_FPESEL BIT(26)
|
||||
#define XGMAC_HWFEAT_ESTWID GENMASK(24, 23)
|
||||
#define XGMAC_HWFEAT_ESTDEP GENMASK(22, 20)
|
||||
#define XGMAC_HWFEAT_ESTSEL BIT(19)
|
||||
#define XGMAC_HWFEAT_ASP GENMASK(15, 14)
|
||||
#define XGMAC_HWFEAT_DVLAN BIT(13)
|
||||
#define XGMAC_HWFEAT_FRPES GENMASK(12, 11)
|
||||
#define XGMAC_HWFEAT_FRPPB GENMASK(10, 9)
|
||||
#define XGMAC_HWFEAT_FRPSEL BIT(3)
|
||||
#define XGMAC_MAC_DPP_FSM_INT_STATUS 0x00000150
|
||||
#define XGMAC_MAC_FSM_CONTROL 0x00000158
|
||||
#define XGMAC_PRTYEN BIT(1)
|
||||
#define XGMAC_TMOUTEN BIT(0)
|
||||
#define XGMAC_MDIO_ADDR 0x00000200
|
||||
#define XGMAC_MDIO_DATA 0x00000204
|
||||
#define XGMAC_MDIO_C22P 0x00000220
|
||||
#define XGMAC_FPE_CTRL_STS 0x00000280
|
||||
#define XGMAC_EFPE BIT(0)
|
||||
#define XGMAC_ADDRx_HIGH(x) (0x00000300 + (x) * 0x8)
|
||||
#define XGMAC_ADDR_MAX 32
|
||||
#define XGMAC_AE BIT(31)
|
||||
#define XGMAC_DCS GENMASK(19, 16)
|
||||
#define XGMAC_DCS_SHIFT 16
|
||||
#define XGMAC_ADDRx_LOW(x) (0x00000304 + (x) * 0x8)
|
||||
#define XGMAC_L3L4_ADDR_CTRL 0x00000c00
|
||||
#define XGMAC_IDDR GENMASK(15, 8)
|
||||
#define XGMAC_IDDR_SHIFT 8
|
||||
#define XGMAC_IDDR_FNUM 4
|
||||
#define XGMAC_TT BIT(1)
|
||||
#define XGMAC_XB BIT(0)
|
||||
#define XGMAC_L3L4_DATA 0x00000c04
|
||||
#define XGMAC_L3L4_CTRL 0x0
|
||||
#define XGMAC_L4DPIM0 BIT(21)
|
||||
#define XGMAC_L4DPM0 BIT(20)
|
||||
#define XGMAC_L4SPIM0 BIT(19)
|
||||
#define XGMAC_L4SPM0 BIT(18)
|
||||
#define XGMAC_L4PEN0 BIT(16)
|
||||
#define XGMAC_L3HDBM0 GENMASK(15, 11)
|
||||
#define XGMAC_L3HSBM0 GENMASK(10, 6)
|
||||
#define XGMAC_L3DAIM0 BIT(5)
|
||||
#define XGMAC_L3DAM0 BIT(4)
|
||||
#define XGMAC_L3SAIM0 BIT(3)
|
||||
#define XGMAC_L3SAM0 BIT(2)
|
||||
#define XGMAC_L3PEN0 BIT(0)
|
||||
#define XGMAC_L4_ADDR 0x1
|
||||
#define XGMAC_L4DP0 GENMASK(31, 16)
|
||||
#define XGMAC_L4DP0_SHIFT 16
|
||||
#define XGMAC_L4SP0 GENMASK(15, 0)
|
||||
#define XGMAC_L3_ADDR0 0x4
|
||||
#define XGMAC_L3_ADDR1 0x5
|
||||
#define XGMAC_L3_ADDR2 0x6
|
||||
#define XMGAC_L3_ADDR3 0x7
|
||||
#define XGMAC_ARP_ADDR 0x00000c10
|
||||
#define XGMAC_RSS_CTRL 0x00000c80
|
||||
#define XGMAC_UDP4TE BIT(3)
|
||||
#define XGMAC_TCP4TE BIT(2)
|
||||
#define XGMAC_IP2TE BIT(1)
|
||||
#define XGMAC_RSSE BIT(0)
|
||||
#define XGMAC_RSS_ADDR 0x00000c88
|
||||
#define XGMAC_RSSIA_SHIFT 8
|
||||
#define XGMAC_ADDRT BIT(2)
|
||||
#define XGMAC_CT BIT(1)
|
||||
#define XGMAC_OB BIT(0)
|
||||
#define XGMAC_RSS_DATA 0x00000c8c
|
||||
#define XGMAC_TIMESTAMP_STATUS 0x00000d20
|
||||
#define XGMAC_TXTSC BIT(15)
|
||||
#define XGMAC_TXTIMESTAMP_NSEC 0x00000d30
|
||||
#define XGMAC_TXTSSTSLO GENMASK(30, 0)
|
||||
#define XGMAC_TXTIMESTAMP_SEC 0x00000d34
|
||||
#define XGMAC_PPS_CONTROL 0x00000d70
|
||||
#define XGMAC_PPS_MAXIDX(x) ((((x) + 1) * 8) - 1)
|
||||
#define XGMAC_PPS_MINIDX(x) ((x) * 8)
|
||||
#define XGMAC_PPSx_MASK(x) \
|
||||
GENMASK(XGMAC_PPS_MAXIDX(x), XGMAC_PPS_MINIDX(x))
|
||||
#define XGMAC_TRGTMODSELx(x, val) \
|
||||
GENMASK(XGMAC_PPS_MAXIDX(x) - 1, XGMAC_PPS_MAXIDX(x) - 2) & \
|
||||
((val) << (XGMAC_PPS_MAXIDX(x) - 2))
|
||||
#define XGMAC_PPSCMDx(x, val) \
|
||||
GENMASK(XGMAC_PPS_MINIDX(x) + 3, XGMAC_PPS_MINIDX(x)) & \
|
||||
((val) << XGMAC_PPS_MINIDX(x))
|
||||
#define XGMAC_PPSCMD_START 0x2
|
||||
#define XGMAC_PPSCMD_STOP 0x5
|
||||
#define XGMAC_PPSEN0 BIT(4)
|
||||
#define XGMAC_PPSx_TARGET_TIME_SEC(x) (0x00000d80 + (x) * 0x10)
|
||||
#define XGMAC_PPSx_TARGET_TIME_NSEC(x) (0x00000d84 + (x) * 0x10)
|
||||
#define XGMAC_TRGTBUSY0 BIT(31)
|
||||
#define XGMAC_PPSx_INTERVAL(x) (0x00000d88 + (x) * 0x10)
|
||||
#define XGMAC_PPSx_WIDTH(x) (0x00000d8c + (x) * 0x10)
|
||||
|
||||
/* MTL Registers */
|
||||
#define XGMAC_MTL_OPMODE 0x00001000
|
||||
#define XGMAC_FRPE BIT(15)
|
||||
#define XGMAC_ETSALG GENMASK(6, 5)
|
||||
#define XGMAC_WRR (0x0 << 5)
|
||||
#define XGMAC_WFQ (0x1 << 5)
|
||||
#define XGMAC_DWRR (0x2 << 5)
|
||||
#define XGMAC_RAA BIT(2)
|
||||
#define XGMAC_MTL_INT_STATUS 0x00001020
|
||||
#define XGMAC_MTL_RXQ_DMA_MAP0 0x00001030
|
||||
#define XGMAC_MTL_RXQ_DMA_MAP1 0x00001034
|
||||
#define XGMAC_QxMDMACH(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_QxMDMACH_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_QDDMACH BIT(7)
|
||||
#define XGMAC_TC_PRTY_MAP0 0x00001040
|
||||
#define XGMAC_TC_PRTY_MAP1 0x00001044
|
||||
#define XGMAC_PSTC(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_PSTC_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_MTL_EST_CONTROL 0x00001050
|
||||
#define XGMAC_PTOV GENMASK(31, 23)
|
||||
#define XGMAC_PTOV_SHIFT 23
|
||||
#define XGMAC_SSWL BIT(1)
|
||||
#define XGMAC_EEST BIT(0)
|
||||
#define XGMAC_MTL_EST_GCL_CONTROL 0x00001080
|
||||
#define XGMAC_BTR_LOW 0x0
|
||||
#define XGMAC_BTR_HIGH 0x1
|
||||
#define XGMAC_CTR_LOW 0x2
|
||||
#define XGMAC_CTR_HIGH 0x3
|
||||
#define XGMAC_TER 0x4
|
||||
#define XGMAC_LLR 0x5
|
||||
#define XGMAC_ADDR_SHIFT 8
|
||||
#define XGMAC_GCRR BIT(2)
|
||||
#define XGMAC_SRWO BIT(0)
|
||||
#define XGMAC_MTL_EST_GCL_DATA 0x00001084
|
||||
#define XGMAC_MTL_RXP_CONTROL_STATUS 0x000010a0
|
||||
#define XGMAC_RXPI BIT(31)
|
||||
#define XGMAC_NPE GENMASK(23, 16)
|
||||
#define XGMAC_NVE GENMASK(7, 0)
|
||||
#define XGMAC_MTL_RXP_IACC_CTRL_ST 0x000010b0
|
||||
#define XGMAC_STARTBUSY BIT(31)
|
||||
#define XGMAC_WRRDN BIT(16)
|
||||
#define XGMAC_ADDR GENMASK(9, 0)
|
||||
#define XGMAC_MTL_RXP_IACC_DATA 0x000010b4
|
||||
#define XGMAC_MTL_ECC_CONTROL 0x000010c0
|
||||
#define XGMAC_MTL_SAFETY_INT_STATUS 0x000010c4
|
||||
#define XGMAC_MEUIS BIT(1)
|
||||
#define XGMAC_MECIS BIT(0)
|
||||
#define XGMAC_MTL_ECC_INT_ENABLE 0x000010c8
|
||||
#define XGMAC_RPCEIE BIT(12)
|
||||
#define XGMAC_ECEIE BIT(8)
|
||||
#define XGMAC_RXCEIE BIT(4)
|
||||
#define XGMAC_TXCEIE BIT(0)
|
||||
#define XGMAC_MTL_ECC_INT_STATUS 0x000010cc
|
||||
#define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x)))
|
||||
#define XGMAC_TQS GENMASK(25, 16)
|
||||
#define XGMAC_TQS_SHIFT 16
|
||||
#define XGMAC_Q2TCMAP GENMASK(10, 8)
|
||||
#define XGMAC_Q2TCMAP_SHIFT 8
|
||||
#define XGMAC_TTC GENMASK(6, 4)
|
||||
#define XGMAC_TTC_SHIFT 4
|
||||
#define XGMAC_TXQEN GENMASK(3, 2)
|
||||
#define XGMAC_TXQEN_SHIFT 2
|
||||
#define XGMAC_TSF BIT(1)
|
||||
#define XGMAC_MTL_TCx_ETS_CONTROL(x) (0x00001110 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_QUANTUM_WEIGHT(x) (0x00001118 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_SENDSLOPE(x) (0x0000111c + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_HICREDIT(x) (0x00001120 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_LOCREDIT(x) (0x00001124 + (0x80 * (x)))
|
||||
#define XGMAC_CC BIT(3)
|
||||
#define XGMAC_TSA GENMASK(1, 0)
|
||||
#define XGMAC_SP (0x0 << 0)
|
||||
#define XGMAC_CBS (0x1 << 0)
|
||||
#define XGMAC_ETS (0x2 << 0)
|
||||
#define XGMAC_MTL_RXQ_OPMODE(x) (0x00001140 + (0x80 * (x)))
|
||||
#define XGMAC_RQS GENMASK(25, 16)
|
||||
#define XGMAC_RQS_SHIFT 16
|
||||
#define XGMAC_EHFC BIT(7)
|
||||
#define XGMAC_RSF BIT(5)
|
||||
#define XGMAC_RTC GENMASK(1, 0)
|
||||
#define XGMAC_RTC_SHIFT 0
|
||||
#define XGMAC_MTL_RXQ_FLOW_CONTROL(x) (0x00001150 + (0x80 * (x)))
|
||||
#define XGMAC_RFD GENMASK(31, 17)
|
||||
#define XGMAC_RFD_SHIFT 17
|
||||
#define XGMAC_RFA GENMASK(15, 1)
|
||||
#define XGMAC_RFA_SHIFT 1
|
||||
#define XGMAC_MTL_QINTEN(x) (0x00001170 + (0x80 * (x)))
|
||||
#define XGMAC_RXOIE BIT(16)
|
||||
#define XGMAC_MTL_QINT_STATUS(x) (0x00001174 + (0x80 * (x)))
|
||||
#define XGMAC_RXOVFIS BIT(16)
|
||||
#define XGMAC_ABPSIS BIT(1)
|
||||
#define XGMAC_TXUNFIS BIT(0)
|
||||
#define XGMAC_MAC_REGSIZE (XGMAC_MTL_QINT_STATUS(15) / 4)
|
||||
|
||||
/* DMA Registers */
|
||||
#define XGMAC_DMA_MODE 0x00003000
|
||||
#define XGMAC_SWR BIT(0)
|
||||
#define XGMAC_DMA_SYSBUS_MODE 0x00003004
|
||||
#define XGMAC_WR_OSR_LMT GENMASK(29, 24)
|
||||
#define XGMAC_WR_OSR_LMT_SHIFT 24
|
||||
#define XGMAC_RD_OSR_LMT GENMASK(21, 16)
|
||||
#define XGMAC_RD_OSR_LMT_SHIFT 16
|
||||
#define XGMAC_EN_LPI BIT(15)
|
||||
#define XGMAC_LPI_XIT_PKT BIT(14)
|
||||
#define XGMAC_AAL BIT(12)
|
||||
#define XGMAC_EAME BIT(11)
|
||||
#define XGMAC_BLEN GENMASK(7, 1)
|
||||
#define XGMAC_BLEN256 BIT(7)
|
||||
#define XGMAC_BLEN128 BIT(6)
|
||||
#define XGMAC_BLEN64 BIT(5)
|
||||
#define XGMAC_BLEN32 BIT(4)
|
||||
#define XGMAC_BLEN16 BIT(3)
|
||||
#define XGMAC_BLEN8 BIT(2)
|
||||
#define XGMAC_BLEN4 BIT(1)
|
||||
#define XGMAC_UNDEF BIT(0)
|
||||
#define XGMAC_TX_EDMA_CTRL 0x00003040
|
||||
#define XGMAC_TDPS GENMASK(29, 0)
|
||||
#define XGMAC_RX_EDMA_CTRL 0x00003044
|
||||
#define XGMAC_RDPS GENMASK(29, 0)
|
||||
#define XGMAC_DMA_TBS_CTRL0 0x00003054
|
||||
#define XGMAC_DMA_TBS_CTRL1 0x00003058
|
||||
#define XGMAC_DMA_TBS_CTRL2 0x0000305c
|
||||
#define XGMAC_DMA_TBS_CTRL3 0x00003060
|
||||
#define XGMAC_FTOS GENMASK(31, 8)
|
||||
#define XGMAC_FTOV BIT(0)
|
||||
#define XGMAC_DEF_FTOS (XGMAC_FTOS | XGMAC_FTOV)
|
||||
#define XGMAC_DMA_SAFETY_INT_STATUS 0x00003064
|
||||
#define XGMAC_MCSIS BIT(31)
|
||||
#define XGMAC_MSUIS BIT(29)
|
||||
#define XGMAC_MSCIS BIT(28)
|
||||
#define XGMAC_DEUIS BIT(1)
|
||||
#define XGMAC_DECIS BIT(0)
|
||||
#define XGMAC_DMA_ECC_INT_ENABLE 0x00003068
|
||||
#define XGMAC_DCEIE BIT(1)
|
||||
#define XGMAC_TCEIE BIT(0)
|
||||
#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c
|
||||
#define XGMAC_DMA_CH_CONTROL(x) (0x00003100 + (0x80 * (x)))
|
||||
#define XGMAC_SPH BIT(24)
|
||||
#define XGMAC_PBLx8 BIT(16)
|
||||
#define XGMAC_DMA_CH_TX_CONTROL(x) (0x00003104 + (0x80 * (x)))
|
||||
#define XGMAC_EDSE BIT(28)
|
||||
#define XGMAC_TxPBL GENMASK(21, 16)
|
||||
#define XGMAC_TxPBL_SHIFT 16
|
||||
#define XGMAC_TSE BIT(12)
|
||||
#define XGMAC_OSP BIT(4)
|
||||
#define XGMAC_TXST BIT(0)
|
||||
#define XGMAC_DMA_CH_RX_CONTROL(x) (0x00003108 + (0x80 * (x)))
|
||||
#define XGMAC_RxPBL GENMASK(21, 16)
|
||||
#define XGMAC_RxPBL_SHIFT 16
|
||||
#define XGMAC_RBSZ GENMASK(14, 1)
|
||||
#define XGMAC_RBSZ_SHIFT 1
|
||||
#define XGMAC_RXST BIT(0)
|
||||
#define XGMAC_DMA_CH_TxDESC_HADDR(x) (0x00003110 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_LADDR(x) (0x00003114 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_HADDR(x) (0x00003118 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_LADDR(x) (0x0000311c + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_TAIL_LPTR(x) (0x00003124 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_TAIL_LPTR(x) (0x0000312c + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_RING_LEN(x) (0x00003130 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_RING_LEN(x) (0x00003134 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_INT_EN(x) (0x00003138 + (0x80 * (x)))
|
||||
#define XGMAC_NIE BIT(15)
|
||||
#define XGMAC_AIE BIT(14)
|
||||
#define XGMAC_RBUE BIT(7)
|
||||
#define XGMAC_RIE BIT(6)
|
||||
#define XGMAC_TBUE BIT(2)
|
||||
#define XGMAC_TIE BIT(0)
|
||||
#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \
|
||||
XGMAC_RIE | XGMAC_TIE)
|
||||
#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE)
|
||||
#define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)
|
||||
#define XGMAC_DMA_CH_Rx_WATCHDOG(x) (0x0000313c + (0x80 * (x)))
|
||||
#define XGMAC_RWT GENMASK(7, 0)
|
||||
#define XGMAC_DMA_CH_STATUS(x) (0x00003160 + (0x80 * (x)))
|
||||
#define XGMAC_NIS BIT(15)
|
||||
#define XGMAC_AIS BIT(14)
|
||||
#define XGMAC_FBE BIT(12)
|
||||
#define XGMAC_RBU BIT(7)
|
||||
#define XGMAC_RI BIT(6)
|
||||
#define XGMAC_TBU BIT(2)
|
||||
#define XGMAC_TPS BIT(1)
|
||||
#define XGMAC_TI BIT(0)
|
||||
#define XGMAC_REGSIZE ((0x0000317c + (0x80 * 15)) / 4)
|
||||
|
||||
#define XGMAC_DMA_STATUS_MSK_COMMON (XGMAC_NIS | XGMAC_AIS | XGMAC_FBE)
|
||||
#define XGMAC_DMA_STATUS_MSK_RX (XGMAC_RBU | XGMAC_RI | \
|
||||
XGMAC_DMA_STATUS_MSK_COMMON)
|
||||
#define XGMAC_DMA_STATUS_MSK_TX (XGMAC_TBU | XGMAC_TPS | XGMAC_TI | \
|
||||
XGMAC_DMA_STATUS_MSK_COMMON)
|
||||
|
||||
/* Descriptors */
|
||||
#define XGMAC_TDES0_LTV BIT(31)
|
||||
#define XGMAC_TDES0_LT GENMASK(7, 0)
|
||||
#define XGMAC_TDES1_LT GENMASK(31, 8)
|
||||
#define XGMAC_TDES2_IVT GENMASK(31, 16)
|
||||
#define XGMAC_TDES2_IVT_SHIFT 16
|
||||
#define XGMAC_TDES2_IOC BIT(31)
|
||||
#define XGMAC_TDES2_TTSE BIT(30)
|
||||
#define XGMAC_TDES2_B2L GENMASK(29, 16)
|
||||
#define XGMAC_TDES2_B2L_SHIFT 16
|
||||
#define XGMAC_TDES2_VTIR GENMASK(15, 14)
|
||||
#define XGMAC_TDES2_VTIR_SHIFT 14
|
||||
#define XGMAC_TDES2_B1L GENMASK(13, 0)
|
||||
#define XGMAC_TDES3_OWN BIT(31)
|
||||
#define XGMAC_TDES3_CTXT BIT(30)
|
||||
#define XGMAC_TDES3_FD BIT(29)
|
||||
#define XGMAC_TDES3_LD BIT(28)
|
||||
#define XGMAC_TDES3_CPC GENMASK(27, 26)
|
||||
#define XGMAC_TDES3_CPC_SHIFT 26
|
||||
#define XGMAC_TDES3_TCMSSV BIT(26)
|
||||
#define XGMAC_TDES3_SAIC GENMASK(25, 23)
|
||||
#define XGMAC_TDES3_SAIC_SHIFT 23
|
||||
#define XGMAC_TDES3_TBSV BIT(24)
|
||||
#define XGMAC_TDES3_THL GENMASK(22, 19)
|
||||
#define XGMAC_TDES3_THL_SHIFT 19
|
||||
#define XGMAC_TDES3_IVTIR GENMASK(19, 18)
|
||||
#define XGMAC_TDES3_IVTIR_SHIFT 18
|
||||
#define XGMAC_TDES3_TSE BIT(18)
|
||||
#define XGMAC_TDES3_IVLTV BIT(17)
|
||||
#define XGMAC_TDES3_CIC GENMASK(17, 16)
|
||||
#define XGMAC_TDES3_CIC_SHIFT 16
|
||||
#define XGMAC_TDES3_TPL GENMASK(17, 0)
|
||||
#define XGMAC_TDES3_VLTV BIT(16)
|
||||
#define XGMAC_TDES3_VT GENMASK(15, 0)
|
||||
#define XGMAC_TDES3_FL GENMASK(14, 0)
|
||||
#define XGMAC_RDES2_HL GENMASK(9, 0)
|
||||
#define XGMAC_RDES3_OWN BIT(31)
|
||||
#define XGMAC_RDES3_CTXT BIT(30)
|
||||
#define XGMAC_RDES3_IOC BIT(30)
|
||||
#define XGMAC_RDES3_LD BIT(28)
|
||||
#define XGMAC_RDES3_CDA BIT(27)
|
||||
#define XGMAC_RDES3_RSV BIT(26)
|
||||
#define XGMAC_RDES3_L34T GENMASK(23, 20)
|
||||
#define XGMAC_RDES3_L34T_SHIFT 20
|
||||
#define XGMAC_L34T_IP4TCP 0x1
|
||||
#define XGMAC_L34T_IP4UDP 0x2
|
||||
#define XGMAC_L34T_IP6TCP 0x9
|
||||
#define XGMAC_L34T_IP6UDP 0xA
|
||||
#define XGMAC_RDES3_ES BIT(15)
|
||||
#define XGMAC_RDES3_PL GENMASK(13, 0)
|
||||
#define XGMAC_RDES3_TSD BIT(6)
|
||||
#define XGMAC_RDES3_TSA BIT(4)
|
||||
|
||||
#endif /* __STMMAC_DWXGMAC2_H__ */
|
||||
474
devices/stmmac/dwxgmac2-6.4-orig.h
Normal file
474
devices/stmmac/dwxgmac2-6.4-orig.h
Normal file
@@ -0,0 +1,474 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Synopsys, Inc. and/or its affiliates.
|
||||
* stmmac XGMAC definitions.
|
||||
*/
|
||||
|
||||
#ifndef __STMMAC_DWXGMAC2_H__
|
||||
#define __STMMAC_DWXGMAC2_H__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* Misc */
|
||||
#define XGMAC_JUMBO_LEN 16368
|
||||
|
||||
/* MAC Registers */
|
||||
#define XGMAC_TX_CONFIG 0x00000000
|
||||
#define XGMAC_CONFIG_SS_OFF 29
|
||||
#define XGMAC_CONFIG_SS_MASK GENMASK(31, 29)
|
||||
#define XGMAC_CONFIG_SS_10000 (0x0 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_2500_GMII (0x2 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_1000_GMII (0x3 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_100_MII (0x4 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_5000 (0x5 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_2500 (0x6 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SS_10_MII (0x7 << XGMAC_CONFIG_SS_OFF)
|
||||
#define XGMAC_CONFIG_SARC GENMASK(22, 20)
|
||||
#define XGMAC_CONFIG_SARC_SHIFT 20
|
||||
#define XGMAC_CONFIG_JD BIT(16)
|
||||
#define XGMAC_CONFIG_TE BIT(0)
|
||||
#define XGMAC_CORE_INIT_TX (XGMAC_CONFIG_JD)
|
||||
#define XGMAC_RX_CONFIG 0x00000004
|
||||
#define XGMAC_CONFIG_ARPEN BIT(31)
|
||||
#define XGMAC_CONFIG_GPSL GENMASK(29, 16)
|
||||
#define XGMAC_CONFIG_GPSL_SHIFT 16
|
||||
#define XGMAC_CONFIG_HDSMS GENMASK(14, 12)
|
||||
#define XGMAC_CONFIG_HDSMS_SHIFT 12
|
||||
#define XGMAC_CONFIG_HDSMS_256 (0x2 << XGMAC_CONFIG_HDSMS_SHIFT)
|
||||
#define XGMAC_CONFIG_S2KP BIT(11)
|
||||
#define XGMAC_CONFIG_LM BIT(10)
|
||||
#define XGMAC_CONFIG_IPC BIT(9)
|
||||
#define XGMAC_CONFIG_JE BIT(8)
|
||||
#define XGMAC_CONFIG_WD BIT(7)
|
||||
#define XGMAC_CONFIG_GPSLCE BIT(6)
|
||||
#define XGMAC_CONFIG_CST BIT(2)
|
||||
#define XGMAC_CONFIG_ACS BIT(1)
|
||||
#define XGMAC_CONFIG_RE BIT(0)
|
||||
#define XGMAC_CORE_INIT_RX (XGMAC_CONFIG_GPSLCE | XGMAC_CONFIG_WD | \
|
||||
(XGMAC_JUMBO_LEN << XGMAC_CONFIG_GPSL_SHIFT))
|
||||
#define XGMAC_PACKET_FILTER 0x00000008
|
||||
#define XGMAC_FILTER_RA BIT(31)
|
||||
#define XGMAC_FILTER_IPFE BIT(20)
|
||||
#define XGMAC_FILTER_VTFE BIT(16)
|
||||
#define XGMAC_FILTER_HPF BIT(10)
|
||||
#define XGMAC_FILTER_PCF BIT(7)
|
||||
#define XGMAC_FILTER_PM BIT(4)
|
||||
#define XGMAC_FILTER_HMC BIT(2)
|
||||
#define XGMAC_FILTER_PR BIT(0)
|
||||
#define XGMAC_HASH_TABLE(x) (0x00000010 + (x) * 4)
|
||||
#define XGMAC_MAX_HASH_TABLE 8
|
||||
#define XGMAC_VLAN_TAG 0x00000050
|
||||
#define XGMAC_VLAN_EDVLP BIT(26)
|
||||
#define XGMAC_VLAN_VTHM BIT(25)
|
||||
#define XGMAC_VLAN_DOVLTC BIT(20)
|
||||
#define XGMAC_VLAN_ESVL BIT(18)
|
||||
#define XGMAC_VLAN_ETV BIT(16)
|
||||
#define XGMAC_VLAN_VID GENMASK(15, 0)
|
||||
#define XGMAC_VLAN_HASH_TABLE 0x00000058
|
||||
#define XGMAC_VLAN_INCL 0x00000060
|
||||
#define XGMAC_VLAN_VLTI BIT(20)
|
||||
#define XGMAC_VLAN_CSVL BIT(19)
|
||||
#define XGMAC_VLAN_VLC GENMASK(17, 16)
|
||||
#define XGMAC_VLAN_VLC_SHIFT 16
|
||||
#define XGMAC_RXQ_CTRL0 0x000000a0
|
||||
#define XGMAC_RXQEN(x) GENMASK((x) * 2 + 1, (x) * 2)
|
||||
#define XGMAC_RXQEN_SHIFT(x) ((x) * 2)
|
||||
#define XGMAC_RXQ_CTRL1 0x000000a4
|
||||
#define XGMAC_RQ GENMASK(7, 4)
|
||||
#define XGMAC_RQ_SHIFT 4
|
||||
#define XGMAC_RXQ_CTRL2 0x000000a8
|
||||
#define XGMAC_RXQ_CTRL3 0x000000ac
|
||||
#define XGMAC_PSRQ(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_PSRQ_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_INT_STATUS 0x000000b0
|
||||
#define XGMAC_LPIIS BIT(5)
|
||||
#define XGMAC_PMTIS BIT(4)
|
||||
#define XGMAC_INT_EN 0x000000b4
|
||||
#define XGMAC_TSIE BIT(12)
|
||||
#define XGMAC_LPIIE BIT(5)
|
||||
#define XGMAC_PMTIE BIT(4)
|
||||
#define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE)
|
||||
#define XGMAC_Qx_TX_FLOW_CTRL(x) (0x00000070 + (x) * 4)
|
||||
#define XGMAC_PT GENMASK(31, 16)
|
||||
#define XGMAC_PT_SHIFT 16
|
||||
#define XGMAC_TFE BIT(1)
|
||||
#define XGMAC_RX_FLOW_CTRL 0x00000090
|
||||
#define XGMAC_RFE BIT(0)
|
||||
#define XGMAC_PMT 0x000000c0
|
||||
#define XGMAC_GLBLUCAST BIT(9)
|
||||
#define XGMAC_RWKPKTEN BIT(2)
|
||||
#define XGMAC_MGKPKTEN BIT(1)
|
||||
#define XGMAC_PWRDWN BIT(0)
|
||||
#define XGMAC_LPI_CTRL 0x000000d0
|
||||
#define XGMAC_TXCGE BIT(21)
|
||||
#define XGMAC_LPITXA BIT(19)
|
||||
#define XGMAC_PLS BIT(17)
|
||||
#define XGMAC_LPITXEN BIT(16)
|
||||
#define XGMAC_RLPIEX BIT(3)
|
||||
#define XGMAC_RLPIEN BIT(2)
|
||||
#define XGMAC_TLPIEX BIT(1)
|
||||
#define XGMAC_TLPIEN BIT(0)
|
||||
#define XGMAC_LPI_TIMER_CTRL 0x000000d4
|
||||
#define XGMAC_HW_FEATURE0 0x0000011c
|
||||
#define XGMAC_HWFEAT_SAVLANINS BIT(27)
|
||||
#define XGMAC_HWFEAT_RXCOESEL BIT(16)
|
||||
#define XGMAC_HWFEAT_TXCOESEL BIT(14)
|
||||
#define XGMAC_HWFEAT_EEESEL BIT(13)
|
||||
#define XGMAC_HWFEAT_TSSEL BIT(12)
|
||||
#define XGMAC_HWFEAT_AVSEL BIT(11)
|
||||
#define XGMAC_HWFEAT_RAVSEL BIT(10)
|
||||
#define XGMAC_HWFEAT_ARPOFFSEL BIT(9)
|
||||
#define XGMAC_HWFEAT_MMCSEL BIT(8)
|
||||
#define XGMAC_HWFEAT_MGKSEL BIT(7)
|
||||
#define XGMAC_HWFEAT_RWKSEL BIT(6)
|
||||
#define XGMAC_HWFEAT_VLHASH BIT(4)
|
||||
#define XGMAC_HWFEAT_GMIISEL BIT(1)
|
||||
#define XGMAC_HW_FEATURE1 0x00000120
|
||||
#define XGMAC_HWFEAT_L3L4FNUM GENMASK(30, 27)
|
||||
#define XGMAC_HWFEAT_HASHTBLSZ GENMASK(25, 24)
|
||||
#define XGMAC_HWFEAT_RSSEN BIT(20)
|
||||
#define XGMAC_HWFEAT_TSOEN BIT(18)
|
||||
#define XGMAC_HWFEAT_SPHEN BIT(17)
|
||||
#define XGMAC_HWFEAT_ADDR64 GENMASK(15, 14)
|
||||
#define XGMAC_HWFEAT_TXFIFOSIZE GENMASK(10, 6)
|
||||
#define XGMAC_HWFEAT_RXFIFOSIZE GENMASK(4, 0)
|
||||
#define XGMAC_HW_FEATURE2 0x00000124
|
||||
#define XGMAC_HWFEAT_PPSOUTNUM GENMASK(26, 24)
|
||||
#define XGMAC_HWFEAT_TXCHCNT GENMASK(21, 18)
|
||||
#define XGMAC_HWFEAT_RXCHCNT GENMASK(15, 12)
|
||||
#define XGMAC_HWFEAT_TXQCNT GENMASK(9, 6)
|
||||
#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)
|
||||
#define XGMAC_HW_FEATURE3 0x00000128
|
||||
#define XGMAC_HWFEAT_TBSSEL BIT(27)
|
||||
#define XGMAC_HWFEAT_FPESEL BIT(26)
|
||||
#define XGMAC_HWFEAT_ESTWID GENMASK(24, 23)
|
||||
#define XGMAC_HWFEAT_ESTDEP GENMASK(22, 20)
|
||||
#define XGMAC_HWFEAT_ESTSEL BIT(19)
|
||||
#define XGMAC_HWFEAT_ASP GENMASK(15, 14)
|
||||
#define XGMAC_HWFEAT_DVLAN BIT(13)
|
||||
#define XGMAC_HWFEAT_FRPES GENMASK(12, 11)
|
||||
#define XGMAC_HWFEAT_FRPPB GENMASK(10, 9)
|
||||
#define XGMAC_HWFEAT_FRPSEL BIT(3)
|
||||
#define XGMAC_MAC_DPP_FSM_INT_STATUS 0x00000150
|
||||
#define XGMAC_MAC_FSM_CONTROL 0x00000158
|
||||
#define XGMAC_PRTYEN BIT(1)
|
||||
#define XGMAC_TMOUTEN BIT(0)
|
||||
#define XGMAC_MDIO_ADDR 0x00000200
|
||||
#define XGMAC_MDIO_DATA 0x00000204
|
||||
#define XGMAC_MDIO_C22P 0x00000220
|
||||
#define XGMAC_FPE_CTRL_STS 0x00000280
|
||||
#define XGMAC_EFPE BIT(0)
|
||||
#define XGMAC_ADDRx_HIGH(x) (0x00000300 + (x) * 0x8)
|
||||
#define XGMAC_ADDR_MAX 32
|
||||
#define XGMAC_AE BIT(31)
|
||||
#define XGMAC_DCS GENMASK(19, 16)
|
||||
#define XGMAC_DCS_SHIFT 16
|
||||
#define XGMAC_ADDRx_LOW(x) (0x00000304 + (x) * 0x8)
|
||||
#define XGMAC_L3L4_ADDR_CTRL 0x00000c00
|
||||
#define XGMAC_IDDR GENMASK(15, 8)
|
||||
#define XGMAC_IDDR_SHIFT 8
|
||||
#define XGMAC_IDDR_FNUM 4
|
||||
#define XGMAC_TT BIT(1)
|
||||
#define XGMAC_XB BIT(0)
|
||||
#define XGMAC_L3L4_DATA 0x00000c04
|
||||
#define XGMAC_L3L4_CTRL 0x0
|
||||
#define XGMAC_L4DPIM0 BIT(21)
|
||||
#define XGMAC_L4DPM0 BIT(20)
|
||||
#define XGMAC_L4SPIM0 BIT(19)
|
||||
#define XGMAC_L4SPM0 BIT(18)
|
||||
#define XGMAC_L4PEN0 BIT(16)
|
||||
#define XGMAC_L3HDBM0 GENMASK(15, 11)
|
||||
#define XGMAC_L3HSBM0 GENMASK(10, 6)
|
||||
#define XGMAC_L3DAIM0 BIT(5)
|
||||
#define XGMAC_L3DAM0 BIT(4)
|
||||
#define XGMAC_L3SAIM0 BIT(3)
|
||||
#define XGMAC_L3SAM0 BIT(2)
|
||||
#define XGMAC_L3PEN0 BIT(0)
|
||||
#define XGMAC_L4_ADDR 0x1
|
||||
#define XGMAC_L4DP0 GENMASK(31, 16)
|
||||
#define XGMAC_L4DP0_SHIFT 16
|
||||
#define XGMAC_L4SP0 GENMASK(15, 0)
|
||||
#define XGMAC_L3_ADDR0 0x4
|
||||
#define XGMAC_L3_ADDR1 0x5
|
||||
#define XGMAC_L3_ADDR2 0x6
|
||||
#define XMGAC_L3_ADDR3 0x7
|
||||
#define XGMAC_ARP_ADDR 0x00000c10
|
||||
#define XGMAC_RSS_CTRL 0x00000c80
|
||||
#define XGMAC_UDP4TE BIT(3)
|
||||
#define XGMAC_TCP4TE BIT(2)
|
||||
#define XGMAC_IP2TE BIT(1)
|
||||
#define XGMAC_RSSE BIT(0)
|
||||
#define XGMAC_RSS_ADDR 0x00000c88
|
||||
#define XGMAC_RSSIA_SHIFT 8
|
||||
#define XGMAC_ADDRT BIT(2)
|
||||
#define XGMAC_CT BIT(1)
|
||||
#define XGMAC_OB BIT(0)
|
||||
#define XGMAC_RSS_DATA 0x00000c8c
|
||||
#define XGMAC_TIMESTAMP_STATUS 0x00000d20
|
||||
#define XGMAC_TXTSC BIT(15)
|
||||
#define XGMAC_TXTIMESTAMP_NSEC 0x00000d30
|
||||
#define XGMAC_TXTSSTSLO GENMASK(30, 0)
|
||||
#define XGMAC_TXTIMESTAMP_SEC 0x00000d34
|
||||
#define XGMAC_PPS_CONTROL 0x00000d70
|
||||
#define XGMAC_PPS_MAXIDX(x) ((((x) + 1) * 8) - 1)
|
||||
#define XGMAC_PPS_MINIDX(x) ((x) * 8)
|
||||
#define XGMAC_PPSx_MASK(x) \
|
||||
GENMASK(XGMAC_PPS_MAXIDX(x), XGMAC_PPS_MINIDX(x))
|
||||
#define XGMAC_TRGTMODSELx(x, val) \
|
||||
GENMASK(XGMAC_PPS_MAXIDX(x) - 1, XGMAC_PPS_MAXIDX(x) - 2) & \
|
||||
((val) << (XGMAC_PPS_MAXIDX(x) - 2))
|
||||
#define XGMAC_PPSCMDx(x, val) \
|
||||
GENMASK(XGMAC_PPS_MINIDX(x) + 3, XGMAC_PPS_MINIDX(x)) & \
|
||||
((val) << XGMAC_PPS_MINIDX(x))
|
||||
#define XGMAC_PPSCMD_START 0x2
|
||||
#define XGMAC_PPSCMD_STOP 0x5
|
||||
#define XGMAC_PPSEN0 BIT(4)
|
||||
#define XGMAC_PPSx_TARGET_TIME_SEC(x) (0x00000d80 + (x) * 0x10)
|
||||
#define XGMAC_PPSx_TARGET_TIME_NSEC(x) (0x00000d84 + (x) * 0x10)
|
||||
#define XGMAC_TRGTBUSY0 BIT(31)
|
||||
#define XGMAC_PPSx_INTERVAL(x) (0x00000d88 + (x) * 0x10)
|
||||
#define XGMAC_PPSx_WIDTH(x) (0x00000d8c + (x) * 0x10)
|
||||
|
||||
/* MTL Registers */
|
||||
#define XGMAC_MTL_OPMODE 0x00001000
|
||||
#define XGMAC_FRPE BIT(15)
|
||||
#define XGMAC_ETSALG GENMASK(6, 5)
|
||||
#define XGMAC_WRR (0x0 << 5)
|
||||
#define XGMAC_WFQ (0x1 << 5)
|
||||
#define XGMAC_DWRR (0x2 << 5)
|
||||
#define XGMAC_RAA BIT(2)
|
||||
#define XGMAC_MTL_INT_STATUS 0x00001020
|
||||
#define XGMAC_MTL_RXQ_DMA_MAP0 0x00001030
|
||||
#define XGMAC_MTL_RXQ_DMA_MAP1 0x00001034
|
||||
#define XGMAC_QxMDMACH(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_QxMDMACH_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_QDDMACH BIT(7)
|
||||
#define XGMAC_TC_PRTY_MAP0 0x00001040
|
||||
#define XGMAC_TC_PRTY_MAP1 0x00001044
|
||||
#define XGMAC_PSTC(x) GENMASK((x) * 8 + 7, (x) * 8)
|
||||
#define XGMAC_PSTC_SHIFT(x) ((x) * 8)
|
||||
#define XGMAC_MTL_EST_CONTROL 0x00001050
|
||||
#define XGMAC_PTOV GENMASK(31, 23)
|
||||
#define XGMAC_PTOV_SHIFT 23
|
||||
#define XGMAC_SSWL BIT(1)
|
||||
#define XGMAC_EEST BIT(0)
|
||||
#define XGMAC_MTL_EST_GCL_CONTROL 0x00001080
|
||||
#define XGMAC_BTR_LOW 0x0
|
||||
#define XGMAC_BTR_HIGH 0x1
|
||||
#define XGMAC_CTR_LOW 0x2
|
||||
#define XGMAC_CTR_HIGH 0x3
|
||||
#define XGMAC_TER 0x4
|
||||
#define XGMAC_LLR 0x5
|
||||
#define XGMAC_ADDR_SHIFT 8
|
||||
#define XGMAC_GCRR BIT(2)
|
||||
#define XGMAC_SRWO BIT(0)
|
||||
#define XGMAC_MTL_EST_GCL_DATA 0x00001084
|
||||
#define XGMAC_MTL_RXP_CONTROL_STATUS 0x000010a0
|
||||
#define XGMAC_RXPI BIT(31)
|
||||
#define XGMAC_NPE GENMASK(23, 16)
|
||||
#define XGMAC_NVE GENMASK(7, 0)
|
||||
#define XGMAC_MTL_RXP_IACC_CTRL_ST 0x000010b0
|
||||
#define XGMAC_STARTBUSY BIT(31)
|
||||
#define XGMAC_WRRDN BIT(16)
|
||||
#define XGMAC_ADDR GENMASK(9, 0)
|
||||
#define XGMAC_MTL_RXP_IACC_DATA 0x000010b4
|
||||
#define XGMAC_MTL_ECC_CONTROL 0x000010c0
|
||||
#define XGMAC_MTL_SAFETY_INT_STATUS 0x000010c4
|
||||
#define XGMAC_MEUIS BIT(1)
|
||||
#define XGMAC_MECIS BIT(0)
|
||||
#define XGMAC_MTL_ECC_INT_ENABLE 0x000010c8
|
||||
#define XGMAC_RPCEIE BIT(12)
|
||||
#define XGMAC_ECEIE BIT(8)
|
||||
#define XGMAC_RXCEIE BIT(4)
|
||||
#define XGMAC_TXCEIE BIT(0)
|
||||
#define XGMAC_MTL_ECC_INT_STATUS 0x000010cc
|
||||
#define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x)))
|
||||
#define XGMAC_TQS GENMASK(25, 16)
|
||||
#define XGMAC_TQS_SHIFT 16
|
||||
#define XGMAC_Q2TCMAP GENMASK(10, 8)
|
||||
#define XGMAC_Q2TCMAP_SHIFT 8
|
||||
#define XGMAC_TTC GENMASK(6, 4)
|
||||
#define XGMAC_TTC_SHIFT 4
|
||||
#define XGMAC_TXQEN GENMASK(3, 2)
|
||||
#define XGMAC_TXQEN_SHIFT 2
|
||||
#define XGMAC_TSF BIT(1)
|
||||
#define XGMAC_MTL_TCx_ETS_CONTROL(x) (0x00001110 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_QUANTUM_WEIGHT(x) (0x00001118 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_SENDSLOPE(x) (0x0000111c + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_HICREDIT(x) (0x00001120 + (0x80 * (x)))
|
||||
#define XGMAC_MTL_TCx_LOCREDIT(x) (0x00001124 + (0x80 * (x)))
|
||||
#define XGMAC_CC BIT(3)
|
||||
#define XGMAC_TSA GENMASK(1, 0)
|
||||
#define XGMAC_SP (0x0 << 0)
|
||||
#define XGMAC_CBS (0x1 << 0)
|
||||
#define XGMAC_ETS (0x2 << 0)
|
||||
#define XGMAC_MTL_RXQ_OPMODE(x) (0x00001140 + (0x80 * (x)))
|
||||
#define XGMAC_RQS GENMASK(25, 16)
|
||||
#define XGMAC_RQS_SHIFT 16
|
||||
#define XGMAC_EHFC BIT(7)
|
||||
#define XGMAC_RSF BIT(5)
|
||||
#define XGMAC_RTC GENMASK(1, 0)
|
||||
#define XGMAC_RTC_SHIFT 0
|
||||
#define XGMAC_MTL_RXQ_FLOW_CONTROL(x) (0x00001150 + (0x80 * (x)))
|
||||
#define XGMAC_RFD GENMASK(31, 17)
|
||||
#define XGMAC_RFD_SHIFT 17
|
||||
#define XGMAC_RFA GENMASK(15, 1)
|
||||
#define XGMAC_RFA_SHIFT 1
|
||||
#define XGMAC_MTL_QINTEN(x) (0x00001170 + (0x80 * (x)))
|
||||
#define XGMAC_RXOIE BIT(16)
|
||||
#define XGMAC_MTL_QINT_STATUS(x) (0x00001174 + (0x80 * (x)))
|
||||
#define XGMAC_RXOVFIS BIT(16)
|
||||
#define XGMAC_ABPSIS BIT(1)
|
||||
#define XGMAC_TXUNFIS BIT(0)
|
||||
#define XGMAC_MAC_REGSIZE (XGMAC_MTL_QINT_STATUS(15) / 4)
|
||||
|
||||
/* DMA Registers */
|
||||
#define XGMAC_DMA_MODE 0x00003000
|
||||
#define XGMAC_SWR BIT(0)
|
||||
#define XGMAC_DMA_SYSBUS_MODE 0x00003004
|
||||
#define XGMAC_WR_OSR_LMT GENMASK(29, 24)
|
||||
#define XGMAC_WR_OSR_LMT_SHIFT 24
|
||||
#define XGMAC_RD_OSR_LMT GENMASK(21, 16)
|
||||
#define XGMAC_RD_OSR_LMT_SHIFT 16
|
||||
#define XGMAC_EN_LPI BIT(15)
|
||||
#define XGMAC_LPI_XIT_PKT BIT(14)
|
||||
#define XGMAC_AAL BIT(12)
|
||||
#define XGMAC_EAME BIT(11)
|
||||
#define XGMAC_BLEN GENMASK(7, 1)
|
||||
#define XGMAC_BLEN256 BIT(7)
|
||||
#define XGMAC_BLEN128 BIT(6)
|
||||
#define XGMAC_BLEN64 BIT(5)
|
||||
#define XGMAC_BLEN32 BIT(4)
|
||||
#define XGMAC_BLEN16 BIT(3)
|
||||
#define XGMAC_BLEN8 BIT(2)
|
||||
#define XGMAC_BLEN4 BIT(1)
|
||||
#define XGMAC_UNDEF BIT(0)
|
||||
#define XGMAC_TX_EDMA_CTRL 0x00003040
|
||||
#define XGMAC_TDPS GENMASK(29, 0)
|
||||
#define XGMAC_RX_EDMA_CTRL 0x00003044
|
||||
#define XGMAC_RDPS GENMASK(29, 0)
|
||||
#define XGMAC_DMA_TBS_CTRL0 0x00003054
|
||||
#define XGMAC_DMA_TBS_CTRL1 0x00003058
|
||||
#define XGMAC_DMA_TBS_CTRL2 0x0000305c
|
||||
#define XGMAC_DMA_TBS_CTRL3 0x00003060
|
||||
#define XGMAC_FTOS GENMASK(31, 8)
|
||||
#define XGMAC_FTOV BIT(0)
|
||||
#define XGMAC_DEF_FTOS (XGMAC_FTOS | XGMAC_FTOV)
|
||||
#define XGMAC_DMA_SAFETY_INT_STATUS 0x00003064
|
||||
#define XGMAC_MCSIS BIT(31)
|
||||
#define XGMAC_MSUIS BIT(29)
|
||||
#define XGMAC_MSCIS BIT(28)
|
||||
#define XGMAC_DEUIS BIT(1)
|
||||
#define XGMAC_DECIS BIT(0)
|
||||
#define XGMAC_DMA_ECC_INT_ENABLE 0x00003068
|
||||
#define XGMAC_DCEIE BIT(1)
|
||||
#define XGMAC_TCEIE BIT(0)
|
||||
#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c
|
||||
#define XGMAC_DMA_CH_CONTROL(x) (0x00003100 + (0x80 * (x)))
|
||||
#define XGMAC_SPH BIT(24)
|
||||
#define XGMAC_PBLx8 BIT(16)
|
||||
#define XGMAC_DMA_CH_TX_CONTROL(x) (0x00003104 + (0x80 * (x)))
|
||||
#define XGMAC_EDSE BIT(28)
|
||||
#define XGMAC_TxPBL GENMASK(21, 16)
|
||||
#define XGMAC_TxPBL_SHIFT 16
|
||||
#define XGMAC_TSE BIT(12)
|
||||
#define XGMAC_OSP BIT(4)
|
||||
#define XGMAC_TXST BIT(0)
|
||||
#define XGMAC_DMA_CH_RX_CONTROL(x) (0x00003108 + (0x80 * (x)))
|
||||
#define XGMAC_RxPBL GENMASK(21, 16)
|
||||
#define XGMAC_RxPBL_SHIFT 16
|
||||
#define XGMAC_RBSZ GENMASK(14, 1)
|
||||
#define XGMAC_RBSZ_SHIFT 1
|
||||
#define XGMAC_RXST BIT(0)
|
||||
#define XGMAC_DMA_CH_TxDESC_HADDR(x) (0x00003110 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_LADDR(x) (0x00003114 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_HADDR(x) (0x00003118 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_LADDR(x) (0x0000311c + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_TAIL_LPTR(x) (0x00003124 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_TAIL_LPTR(x) (0x0000312c + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_TxDESC_RING_LEN(x) (0x00003130 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_RxDESC_RING_LEN(x) (0x00003134 + (0x80 * (x)))
|
||||
#define XGMAC_DMA_CH_INT_EN(x) (0x00003138 + (0x80 * (x)))
|
||||
#define XGMAC_NIE BIT(15)
|
||||
#define XGMAC_AIE BIT(14)
|
||||
#define XGMAC_RBUE BIT(7)
|
||||
#define XGMAC_RIE BIT(6)
|
||||
#define XGMAC_TBUE BIT(2)
|
||||
#define XGMAC_TIE BIT(0)
|
||||
#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \
|
||||
XGMAC_RIE | XGMAC_TIE)
|
||||
#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE)
|
||||
#define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)
|
||||
#define XGMAC_DMA_CH_Rx_WATCHDOG(x) (0x0000313c + (0x80 * (x)))
|
||||
#define XGMAC_RWT GENMASK(7, 0)
|
||||
#define XGMAC_DMA_CH_STATUS(x) (0x00003160 + (0x80 * (x)))
|
||||
#define XGMAC_NIS BIT(15)
|
||||
#define XGMAC_AIS BIT(14)
|
||||
#define XGMAC_FBE BIT(12)
|
||||
#define XGMAC_RBU BIT(7)
|
||||
#define XGMAC_RI BIT(6)
|
||||
#define XGMAC_TBU BIT(2)
|
||||
#define XGMAC_TPS BIT(1)
|
||||
#define XGMAC_TI BIT(0)
|
||||
#define XGMAC_REGSIZE ((0x0000317c + (0x80 * 15)) / 4)
|
||||
|
||||
#define XGMAC_DMA_STATUS_MSK_COMMON (XGMAC_NIS | XGMAC_AIS | XGMAC_FBE)
|
||||
#define XGMAC_DMA_STATUS_MSK_RX (XGMAC_RBU | XGMAC_RI | \
|
||||
XGMAC_DMA_STATUS_MSK_COMMON)
|
||||
#define XGMAC_DMA_STATUS_MSK_TX (XGMAC_TBU | XGMAC_TPS | XGMAC_TI | \
|
||||
XGMAC_DMA_STATUS_MSK_COMMON)
|
||||
|
||||
/* Descriptors */
|
||||
#define XGMAC_TDES0_LTV BIT(31)
|
||||
#define XGMAC_TDES0_LT GENMASK(7, 0)
|
||||
#define XGMAC_TDES1_LT GENMASK(31, 8)
|
||||
#define XGMAC_TDES2_IVT GENMASK(31, 16)
|
||||
#define XGMAC_TDES2_IVT_SHIFT 16
|
||||
#define XGMAC_TDES2_IOC BIT(31)
|
||||
#define XGMAC_TDES2_TTSE BIT(30)
|
||||
#define XGMAC_TDES2_B2L GENMASK(29, 16)
|
||||
#define XGMAC_TDES2_B2L_SHIFT 16
|
||||
#define XGMAC_TDES2_VTIR GENMASK(15, 14)
|
||||
#define XGMAC_TDES2_VTIR_SHIFT 14
|
||||
#define XGMAC_TDES2_B1L GENMASK(13, 0)
|
||||
#define XGMAC_TDES3_OWN BIT(31)
|
||||
#define XGMAC_TDES3_CTXT BIT(30)
|
||||
#define XGMAC_TDES3_FD BIT(29)
|
||||
#define XGMAC_TDES3_LD BIT(28)
|
||||
#define XGMAC_TDES3_CPC GENMASK(27, 26)
|
||||
#define XGMAC_TDES3_CPC_SHIFT 26
|
||||
#define XGMAC_TDES3_TCMSSV BIT(26)
|
||||
#define XGMAC_TDES3_SAIC GENMASK(25, 23)
|
||||
#define XGMAC_TDES3_SAIC_SHIFT 23
|
||||
#define XGMAC_TDES3_TBSV BIT(24)
|
||||
#define XGMAC_TDES3_THL GENMASK(22, 19)
|
||||
#define XGMAC_TDES3_THL_SHIFT 19
|
||||
#define XGMAC_TDES3_IVTIR GENMASK(19, 18)
|
||||
#define XGMAC_TDES3_IVTIR_SHIFT 18
|
||||
#define XGMAC_TDES3_TSE BIT(18)
|
||||
#define XGMAC_TDES3_IVLTV BIT(17)
|
||||
#define XGMAC_TDES3_CIC GENMASK(17, 16)
|
||||
#define XGMAC_TDES3_CIC_SHIFT 16
|
||||
#define XGMAC_TDES3_TPL GENMASK(17, 0)
|
||||
#define XGMAC_TDES3_VLTV BIT(16)
|
||||
#define XGMAC_TDES3_VT GENMASK(15, 0)
|
||||
#define XGMAC_TDES3_FL GENMASK(14, 0)
|
||||
#define XGMAC_RDES2_HL GENMASK(9, 0)
|
||||
#define XGMAC_RDES3_OWN BIT(31)
|
||||
#define XGMAC_RDES3_CTXT BIT(30)
|
||||
#define XGMAC_RDES3_IOC BIT(30)
|
||||
#define XGMAC_RDES3_LD BIT(28)
|
||||
#define XGMAC_RDES3_CDA BIT(27)
|
||||
#define XGMAC_RDES3_RSV BIT(26)
|
||||
#define XGMAC_RDES3_L34T GENMASK(23, 20)
|
||||
#define XGMAC_RDES3_L34T_SHIFT 20
|
||||
#define XGMAC_L34T_IP4TCP 0x1
|
||||
#define XGMAC_L34T_IP4UDP 0x2
|
||||
#define XGMAC_L34T_IP6TCP 0x9
|
||||
#define XGMAC_L34T_IP6UDP 0xA
|
||||
#define XGMAC_RDES3_ES BIT(15)
|
||||
#define XGMAC_RDES3_PL GENMASK(13, 0)
|
||||
#define XGMAC_RDES3_TSD BIT(6)
|
||||
#define XGMAC_RDES3_TSA BIT(4)
|
||||
|
||||
#endif /* __STMMAC_DWXGMAC2_H__ */
|
||||
1639
devices/stmmac/dwxgmac2_core-6.4-ethercat.c
Normal file
1639
devices/stmmac/dwxgmac2_core-6.4-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user