mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-05 19:39:50 +08:00
Add dwmac_intel and stmmac_pci v6.1.81
This commit is contained in:
76
configure.ac
76
configure.ac
@@ -633,6 +633,80 @@ fi
|
||||
|
||||
AC_SUBST(KERNEL_R8169,[$kernel_r8169])
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# stmmac-pci and dwmac-intel driver
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
enablestmmac=0
|
||||
|
||||
AC_ARG_ENABLE([stmmac-pci],
|
||||
AS_HELP_STRING([--enable-stmmac-pci],
|
||||
[Enable stmmac driver]),
|
||||
[
|
||||
case "${enableval}" in
|
||||
yes) enablestmmacpci=1
|
||||
enablestmmac=1
|
||||
;;
|
||||
no) enablestmmacpci=0
|
||||
;;
|
||||
*) AC_MSG_ERROR([Invalid value for --enable-stmmac])
|
||||
;;
|
||||
esac
|
||||
],
|
||||
[enablestmmacpci=0] # disabled by default
|
||||
)
|
||||
|
||||
AM_CONDITIONAL(ENABLE_STMMACPCI, test "x$enablestmmacpci" = "x1")
|
||||
AC_SUBST(ENABLE_STMMACPCI,[$enablestmmacpci])
|
||||
|
||||
AC_ARG_ENABLE([dwmac-intel],
|
||||
AS_HELP_STRING([--enable-dwmac-intel],
|
||||
[Enable stmmac driver]),
|
||||
[
|
||||
case "${enableval}" in
|
||||
yes) enabledwmacintel=1
|
||||
enablestmmac=1
|
||||
;;
|
||||
no) enabledwmacintel=0
|
||||
;;
|
||||
*) AC_MSG_ERROR([Invalid value for --enable-stmmac])
|
||||
;;
|
||||
esac
|
||||
],
|
||||
[enabledwmacintel=0] # disabled by default
|
||||
)
|
||||
|
||||
AM_CONDITIONAL(ENABLE_DWMACINTEL, test "x$enabledwmacintel" = "x1")
|
||||
AC_SUBST(ENABLE_DWMACINTEL,[$enabledwmacintel])
|
||||
|
||||
AM_CONDITIONAL(ENABLE_STMMAC, test "x$enablestmmac" = "x1")
|
||||
AC_SUBST(ENABLE_STMMAC, [$enablestmmac])
|
||||
|
||||
AC_ARG_WITH([stmmac-kernel],
|
||||
AC_HELP_STRING(
|
||||
[--with-stmmac-kernel=<X.Y.Z>],
|
||||
[stmmac kernel (only if differing)]
|
||||
),
|
||||
[
|
||||
kernelstmmac=[$withval]
|
||||
],
|
||||
[
|
||||
kernelstmmac=$linuxversion
|
||||
]
|
||||
)
|
||||
|
||||
if test "x${enablestmmac}" = "x1"; then
|
||||
AC_MSG_CHECKING([for kernel for stmmac driver])
|
||||
|
||||
if test ! -f "${srcdir}/devices/stmmac/stmmac-${kernelstmmac}-orig.h"; then
|
||||
AC_MSG_ERROR([kernel $kernelstmmac not available for stmmac driver!])
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT([$kernelstmmac])
|
||||
fi
|
||||
|
||||
AC_SUBST(KERNEL_STMMAC,[$kernelstmmac])
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# CCAT driver
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -1265,6 +1339,8 @@ AC_CONFIG_FILES([
|
||||
devices/igc/Makefile
|
||||
devices/r8169/Kbuild
|
||||
devices/r8169/Makefile
|
||||
devices/stmmac/Kbuild
|
||||
devices/stmmac/Makefile
|
||||
ethercat.spec
|
||||
examples/Kbuild
|
||||
examples/Makefile
|
||||
|
||||
@@ -88,6 +88,10 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq (@ENABLE_STMMAC@,1)
|
||||
obj-m += stmmac/
|
||||
endif
|
||||
|
||||
KBUILD_EXTRA_SYMBOLS := \
|
||||
@abs_top_builddir@/$(LINUX_SYMVERS) \
|
||||
@abs_top_builddir@/master/$(LINUX_SYMVERS)
|
||||
|
||||
@@ -28,7 +28,8 @@ SUBDIRS = \
|
||||
genet \
|
||||
igb \
|
||||
igc \
|
||||
r8169
|
||||
r8169 \
|
||||
stmmac
|
||||
|
||||
# using HEADERS to enable tags target
|
||||
noinst_HEADERS = \
|
||||
|
||||
@@ -28,6 +28,7 @@ from re import compile
|
||||
DRIVER_MAP=(
|
||||
# (subdir, driver name, file prefix)
|
||||
(".", "8139too", "8139too"),
|
||||
("stmmac", "dwmac_intel", "dwmac-intel"),
|
||||
(".", "e100", "e100"),
|
||||
("e1000", "e1000", "e1000_main"),
|
||||
("e1000e", "e1000e", "netdev"),
|
||||
@@ -36,6 +37,7 @@ DRIVER_MAP=(
|
||||
("igc", "igc", "igc_main"),
|
||||
(".", "r8169", "r8169"),
|
||||
("r8169", "r8169", "r8169_main"),
|
||||
("stmmac", "stmmac_pci", "stmmac_pci"),
|
||||
)
|
||||
|
||||
|
||||
|
||||
95
devices/stmmac/Kbuild.in
Normal file
95
devices/stmmac/Kbuild.in
Normal file
@@ -0,0 +1,95 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
#
|
||||
# This file is part of the IgH EtherCAT Master.
|
||||
#
|
||||
# The IgH EtherCAT Master is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 2, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# The IgH EtherCAT Master is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with the IgH EtherCAT Master; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# ---
|
||||
#
|
||||
# The license mentioned above concerns the source code only. Using the
|
||||
# EtherCAT technology and brand is only permitted in compliance with the
|
||||
# industrial property and similar rights of Beckhoff Automation GmbH.
|
||||
#
|
||||
# ---
|
||||
#
|
||||
# vim: syntax=make
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
TOPDIR := $(src)/../..
|
||||
|
||||
REV := $(shell if test -s $(TOPDIR)/revision; then \
|
||||
cat $(TOPDIR)/revision; \
|
||||
else \
|
||||
git -C $(TOPDIR) describe 2>/dev/null || echo "unknown"; \
|
||||
fi)
|
||||
|
||||
|
||||
ifeq (@ENABLE_STMMAC@,1)
|
||||
EC_STMMAC_OBJS := \
|
||||
chain_mode-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac1000_core-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac1000_dma-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac100_core-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac100_dma-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac4_core-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac4_descs-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac4_dma-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac4_lib-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac5-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwmac_lib-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwxgmac2_core-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwxgmac2_descs-@KERNEL_STMMAC@-ethercat.o \
|
||||
dwxgmac2_dma-@KERNEL_STMMAC@-ethercat.o \
|
||||
enh_desc-@KERNEL_STMMAC@-ethercat.o \
|
||||
hwif-@KERNEL_STMMAC@-ethercat.o \
|
||||
mmc_core-@KERNEL_STMMAC@-ethercat.o \
|
||||
norm_desc-@KERNEL_STMMAC@-ethercat.o \
|
||||
ring_mode-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_ethtool-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_hwtstamp-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_main-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_mdio-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_ptp-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_tc-@KERNEL_STMMAC@-ethercat.o \
|
||||
stmmac_xdp-@KERNEL_STMMAC@-ethercat.o \
|
||||
$(ec_stmmac-y)
|
||||
|
||||
ec_stmmac-$(CONFIG_STMMAC_SELFTESTS) = \
|
||||
stmmac_selftests-@KERNEL_STMMAC@-ethercat.o
|
||||
|
||||
ifeq (@ENABLE_DWMACINTEL@,1)
|
||||
obj-m += ec_dwmac-intel.o
|
||||
ec_dwmac-intel-objs := \
|
||||
$(EC_STMMAC_OBJS) \
|
||||
dwmac-intel-@KERNEL_STMMAC@-ethercat.o
|
||||
endif
|
||||
|
||||
ifeq (@ENABLE_STMMACPCI@,1)
|
||||
obj-m += ec_stmmac-pci.o
|
||||
ec_stmmac-pci-objs := \
|
||||
$(EC_STMMAC_OBJS) \
|
||||
stmmac_pci-@KERNEL_STMMAC@-ethercat.o
|
||||
endif
|
||||
endif
|
||||
|
||||
KBUILD_EXTRA_SYMBOLS := \
|
||||
@abs_top_builddir@/$(LINUX_SYMVERS) \
|
||||
@abs_top_builddir@/master/$(LINUX_SYMVERS)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
120
devices/stmmac/Makefile.am
Normal file
120
devices/stmmac/Makefile.am
Normal file
@@ -0,0 +1,120 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (C) 2006-2021 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
#
|
||||
# This file is part of the IgH EtherCAT Master.
|
||||
#
|
||||
# The IgH EtherCAT Master is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 2, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# The IgH EtherCAT Master is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with the IgH EtherCAT Master; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
include $(top_srcdir)/Makefile.kbuild
|
||||
|
||||
EXTRA_DIST = \
|
||||
chain_mode-6.1-ethercat.c \
|
||||
chain_mode-6.1-orig.c \
|
||||
common-6.1-ethercat.h \
|
||||
common-6.1-orig.h \
|
||||
descs-6.1-ethercat.h \
|
||||
descs-6.1-orig.h \
|
||||
descs_com-6.1-ethercat.h \
|
||||
descs_com-6.1-orig.h \
|
||||
dwmac1000-6.1-ethercat.h \
|
||||
dwmac1000-6.1-orig.h \
|
||||
dwmac1000_core-6.1-ethercat.c \
|
||||
dwmac1000_core-6.1-orig.c \
|
||||
dwmac1000_dma-6.1-ethercat.c \
|
||||
dwmac1000_dma-6.1-orig.c \
|
||||
dwmac100-6.1-ethercat.h \
|
||||
dwmac100-6.1-orig.h \
|
||||
dwmac100_core-6.1-ethercat.c \
|
||||
dwmac100_core-6.1-orig.c \
|
||||
dwmac100_dma-6.1-ethercat.c \
|
||||
dwmac100_dma-6.1-orig.c \
|
||||
dwmac4-6.1-ethercat.h \
|
||||
dwmac4-6.1-orig.h \
|
||||
dwmac4_core-6.1-ethercat.c \
|
||||
dwmac4_core-6.1-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_dma-6.1-ethercat.c \
|
||||
dwmac4_dma-6.1-ethercat.h \
|
||||
dwmac4_dma-6.1-orig.c \
|
||||
dwmac4_dma-6.1-orig.h \
|
||||
dwmac4_lib-6.1-ethercat.c \
|
||||
dwmac4_lib-6.1-orig.c \
|
||||
dwmac5-6.1-ethercat.c \
|
||||
dwmac5-6.1-ethercat.h \
|
||||
dwmac5-6.1-orig.c \
|
||||
dwmac5-6.1-orig.h \
|
||||
dwmac_dma-6.1-ethercat.h \
|
||||
dwmac_dma-6.1-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_lib-6.1-ethercat.c \
|
||||
dwmac_lib-6.1-orig.c \
|
||||
dwxgmac2-6.1-ethercat.h \
|
||||
dwxgmac2-6.1-orig.h \
|
||||
dwxgmac2_core-6.1-ethercat.c \
|
||||
dwxgmac2_core-6.1-orig.c \
|
||||
dwxgmac2_descs-6.1-ethercat.c \
|
||||
dwxgmac2_descs-6.1-orig.c \
|
||||
dwxgmac2_dma-6.1-ethercat.c \
|
||||
dwxgmac2_dma-6.1-orig.c \
|
||||
dwxlgmac2-6.1-ethercat.h \
|
||||
dwxlgmac2-6.1-orig.h \
|
||||
enh_desc-6.1-ethercat.c \
|
||||
enh_desc-6.1-orig.c \
|
||||
hwif-6.1-ethercat.c \
|
||||
hwif-6.1-ethercat.h \
|
||||
hwif-6.1-orig.c \
|
||||
hwif-6.1-orig.h \
|
||||
mmc-6.1-ethercat.h \
|
||||
mmc-6.1-orig.h \
|
||||
mmc_core-6.1-ethercat.c \
|
||||
mmc_core-6.1-orig.c \
|
||||
norm_desc-6.1-ethercat.c \
|
||||
norm_desc-6.1-orig.c \
|
||||
ring_mode-6.1-ethercat.c \
|
||||
ring_mode-6.1-orig.c \
|
||||
stmmac-6.1-ethercat.h \
|
||||
stmmac-6.1-orig.h \
|
||||
stmmac_ethtool-6.1-ethercat.c \
|
||||
stmmac_ethtool-6.1-orig.c \
|
||||
stmmac_hwtstamp-6.1-ethercat.c \
|
||||
stmmac_hwtstamp-6.1-orig.c \
|
||||
stmmac_main-6.1-ethercat.c \
|
||||
stmmac_main-6.1-orig.c \
|
||||
stmmac_mdio-6.1-ethercat.c \
|
||||
stmmac_mdio-6.1-orig.c \
|
||||
stmmac_pci-6.1-ethercat.c \
|
||||
stmmac_pci-6.1-orig.c \
|
||||
stmmac_pcs-6.1-ethercat.h \
|
||||
stmmac_pcs-6.1-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_tc-6.1-ethercat.c \
|
||||
stmmac_tc-6.1-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
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
168
devices/stmmac/chain_mode-6.1-ethercat.c
Normal file
168
devices/stmmac/chain_mode-6.1-ethercat.c
Normal file
@@ -0,0 +1,168 @@
|
||||
// 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.1-ethercat.h"
|
||||
|
||||
static int jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
{
|
||||
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;
|
||||
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(void *priv_ptr, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)priv_ptr;
|
||||
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(void *priv_ptr, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;
|
||||
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,
|
||||
};
|
||||
168
devices/stmmac/chain_mode-6.1-orig.c
Normal file
168
devices/stmmac/chain_mode-6.1-orig.c
Normal file
@@ -0,0 +1,168 @@
|
||||
// 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(void *p, struct sk_buff *skb, int csum)
|
||||
{
|
||||
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)p;
|
||||
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(void *priv_ptr, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)priv_ptr;
|
||||
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(void *priv_ptr, struct dma_desc *p)
|
||||
{
|
||||
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)priv_ptr;
|
||||
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,
|
||||
};
|
||||
568
devices/stmmac/common-6.1-ethercat.h
Normal file
568
devices/stmmac/common-6.1-ethercat.h
Normal file
File diff suppressed because it is too large
Load Diff
569
devices/stmmac/common-6.1-orig.h
Normal file
569
devices/stmmac/common-6.1-orig.h
Normal file
File diff suppressed because it is too large
Load Diff
186
devices/stmmac/descs-6.1-ethercat.h
Normal file
186
devices/stmmac/descs-6.1-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.1-orig.h
Normal file
186
devices/stmmac/descs-6.1-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.1-ethercat.h
Normal file
121
devices/stmmac/descs_com-6.1-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.1-orig.h
Normal file
121
devices/stmmac/descs_com-6.1-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.1-ethercat.c
Normal file
1262
devices/stmmac/dwmac-intel-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
53
devices/stmmac/dwmac-intel-6.1-ethercat.h
Normal file
53
devices/stmmac/dwmac-intel-6.1-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.1-orig.c
Normal file
1241
devices/stmmac/dwmac-intel-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
53
devices/stmmac/dwmac-intel-6.1-orig.h
Normal file
53
devices/stmmac/dwmac-intel-6.1-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.1-ethercat.h
Normal file
111
devices/stmmac/dwmac100-6.1-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.1-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.1-orig.h
Normal file
111
devices/stmmac/dwmac100-6.1-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.1-ethercat.h
Normal file
333
devices/stmmac/dwmac1000-6.1-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.1-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.1-orig.h
Normal file
333
devices/stmmac/dwmac1000-6.1-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__ */
|
||||
556
devices/stmmac/dwmac1000_core-6.1-ethercat.c
Normal file
556
devices/stmmac/dwmac1000_core-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
556
devices/stmmac/dwmac1000_core-6.1-orig.c
Normal file
556
devices/stmmac/dwmac1000_core-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
291
devices/stmmac/dwmac1000_dma-6.1-ethercat.c
Normal file
291
devices/stmmac/dwmac1000_dma-6.1-ethercat.c
Normal file
@@ -0,0 +1,291 @@
|
||||
// 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.1-ethercat.h"
|
||||
#include "dwmac_dma-6.1-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(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(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(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(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(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(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,
|
||||
};
|
||||
291
devices/stmmac/dwmac1000_dma-6.1-orig.c
Normal file
291
devices/stmmac/dwmac1000_dma-6.1-orig.c
Normal file
@@ -0,0 +1,291 @@
|
||||
// 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(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(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(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(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(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(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.1-ethercat.c
Normal file
193
devices/stmmac/dwmac100_core-6.1-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.1-ethercat.h"
|
||||
#include "dwmac100-6.1-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.1-orig.c
Normal file
193
devices/stmmac/dwmac100_core-6.1-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;
|
||||
}
|
||||
127
devices/stmmac/dwmac100_dma-6.1-ethercat.c
Normal file
127
devices/stmmac/dwmac100_dma-6.1-ethercat.c
Normal file
@@ -0,0 +1,127 @@
|
||||
// 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.1-ethercat.h"
|
||||
#include "dwmac_dma-6.1-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(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(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(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(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(void *data, struct stmmac_extra_stats *x,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
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,
|
||||
};
|
||||
127
devices/stmmac/dwmac100_dma-6.1-orig.c
Normal file
127
devices/stmmac/dwmac100_dma-6.1-orig.c
Normal file
@@ -0,0 +1,127 @@
|
||||
// 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(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(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(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(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(void *data, struct stmmac_extra_stats *x,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
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,
|
||||
};
|
||||
520
devices/stmmac/dwmac4-6.1-ethercat.h
Normal file
520
devices/stmmac/dwmac4-6.1-ethercat.h
Normal file
File diff suppressed because it is too large
Load Diff
520
devices/stmmac/dwmac4-6.1-orig.h
Normal file
520
devices/stmmac/dwmac4-6.1-orig.h
Normal file
File diff suppressed because it is too large
Load Diff
1334
devices/stmmac/dwmac4_core-6.1-ethercat.c
Normal file
1334
devices/stmmac/dwmac4_core-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
1334
devices/stmmac/dwmac4_core-6.1-orig.c
Normal file
1334
devices/stmmac/dwmac4_core-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
585
devices/stmmac/dwmac4_descs-6.1-ethercat.c
Normal file
585
devices/stmmac/dwmac4_descs-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
147
devices/stmmac/dwmac4_descs-6.1-ethercat.h
Normal file
147
devices/stmmac/dwmac4_descs-6.1-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.1-orig.c
Normal file
585
devices/stmmac/dwmac4_descs-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
147
devices/stmmac/dwmac4_descs-6.1-orig.h
Normal file
147
devices/stmmac/dwmac4_descs-6.1-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__ */
|
||||
577
devices/stmmac/dwmac4_dma-6.1-ethercat.c
Normal file
577
devices/stmmac/dwmac4_dma-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
238
devices/stmmac/dwmac4_dma-6.1-ethercat.h
Normal file
238
devices/stmmac/dwmac4_dma-6.1-ethercat.h
Normal file
@@ -0,0 +1,238 @@
|
||||
/* 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
|
||||
#define DMA_CHANX_BASE_ADDR(x) (DMA_CHAN_BASE_ADDR + \
|
||||
(x * DMA_CHAN_BASE_OFFSET))
|
||||
#define DMA_CHAN_REG_NUMBER 17
|
||||
|
||||
#define DMA_CHAN_CONTROL(x) DMA_CHANX_BASE_ADDR(x)
|
||||
#define DMA_CHAN_TX_CONTROL(x) (DMA_CHANX_BASE_ADDR(x) + 0x4)
|
||||
#define DMA_CHAN_RX_CONTROL(x) (DMA_CHANX_BASE_ADDR(x) + 0x8)
|
||||
#define DMA_CHAN_TX_BASE_ADDR_HI(x) (DMA_CHANX_BASE_ADDR(x) + 0x10)
|
||||
#define DMA_CHAN_TX_BASE_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x14)
|
||||
#define DMA_CHAN_RX_BASE_ADDR_HI(x) (DMA_CHANX_BASE_ADDR(x) + 0x18)
|
||||
#define DMA_CHAN_RX_BASE_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x1c)
|
||||
#define DMA_CHAN_TX_END_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x20)
|
||||
#define DMA_CHAN_RX_END_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x28)
|
||||
#define DMA_CHAN_TX_RING_LEN(x) (DMA_CHANX_BASE_ADDR(x) + 0x2c)
|
||||
#define DMA_CHAN_RX_RING_LEN(x) (DMA_CHANX_BASE_ADDR(x) + 0x30)
|
||||
#define DMA_CHAN_INTR_ENA(x) (DMA_CHANX_BASE_ADDR(x) + 0x34)
|
||||
#define DMA_CHAN_RX_WATCHDOG(x) (DMA_CHANX_BASE_ADDR(x) + 0x38)
|
||||
#define DMA_CHAN_SLOT_CTRL_STATUS(x) (DMA_CHANX_BASE_ADDR(x) + 0x3c)
|
||||
#define DMA_CHAN_CUR_TX_DESC(x) (DMA_CHANX_BASE_ADDR(x) + 0x44)
|
||||
#define DMA_CHAN_CUR_RX_DESC(x) (DMA_CHANX_BASE_ADDR(x) + 0x4c)
|
||||
#define DMA_CHAN_CUR_TX_BUF_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x54)
|
||||
#define DMA_CHAN_CUR_RX_BUF_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x5c)
|
||||
#define DMA_CHAN_STATUS(x) (DMA_CHANX_BASE_ADDR(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(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac410_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac4_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac410_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac4_dma_start_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan);
|
||||
int dwmac4_dma_interrupt(void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
|
||||
void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
|
||||
void dwmac4_set_rx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
|
||||
void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
|
||||
|
||||
#endif /* __DWMAC4_DMA_H__ */
|
||||
577
devices/stmmac/dwmac4_dma-6.1-orig.c
Normal file
577
devices/stmmac/dwmac4_dma-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
238
devices/stmmac/dwmac4_dma-6.1-orig.h
Normal file
238
devices/stmmac/dwmac4_dma-6.1-orig.h
Normal file
@@ -0,0 +1,238 @@
|
||||
/* 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
|
||||
#define DMA_CHANX_BASE_ADDR(x) (DMA_CHAN_BASE_ADDR + \
|
||||
(x * DMA_CHAN_BASE_OFFSET))
|
||||
#define DMA_CHAN_REG_NUMBER 17
|
||||
|
||||
#define DMA_CHAN_CONTROL(x) DMA_CHANX_BASE_ADDR(x)
|
||||
#define DMA_CHAN_TX_CONTROL(x) (DMA_CHANX_BASE_ADDR(x) + 0x4)
|
||||
#define DMA_CHAN_RX_CONTROL(x) (DMA_CHANX_BASE_ADDR(x) + 0x8)
|
||||
#define DMA_CHAN_TX_BASE_ADDR_HI(x) (DMA_CHANX_BASE_ADDR(x) + 0x10)
|
||||
#define DMA_CHAN_TX_BASE_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x14)
|
||||
#define DMA_CHAN_RX_BASE_ADDR_HI(x) (DMA_CHANX_BASE_ADDR(x) + 0x18)
|
||||
#define DMA_CHAN_RX_BASE_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x1c)
|
||||
#define DMA_CHAN_TX_END_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x20)
|
||||
#define DMA_CHAN_RX_END_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x28)
|
||||
#define DMA_CHAN_TX_RING_LEN(x) (DMA_CHANX_BASE_ADDR(x) + 0x2c)
|
||||
#define DMA_CHAN_RX_RING_LEN(x) (DMA_CHANX_BASE_ADDR(x) + 0x30)
|
||||
#define DMA_CHAN_INTR_ENA(x) (DMA_CHANX_BASE_ADDR(x) + 0x34)
|
||||
#define DMA_CHAN_RX_WATCHDOG(x) (DMA_CHANX_BASE_ADDR(x) + 0x38)
|
||||
#define DMA_CHAN_SLOT_CTRL_STATUS(x) (DMA_CHANX_BASE_ADDR(x) + 0x3c)
|
||||
#define DMA_CHAN_CUR_TX_DESC(x) (DMA_CHANX_BASE_ADDR(x) + 0x44)
|
||||
#define DMA_CHAN_CUR_RX_DESC(x) (DMA_CHANX_BASE_ADDR(x) + 0x4c)
|
||||
#define DMA_CHAN_CUR_TX_BUF_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x54)
|
||||
#define DMA_CHAN_CUR_RX_BUF_ADDR(x) (DMA_CHANX_BASE_ADDR(x) + 0x5c)
|
||||
#define DMA_CHAN_STATUS(x) (DMA_CHANX_BASE_ADDR(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(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac410_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac4_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac410_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac4_dma_start_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan);
|
||||
int dwmac4_dma_interrupt(void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir);
|
||||
void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
|
||||
void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
|
||||
void dwmac4_set_rx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
|
||||
void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
|
||||
|
||||
#endif /* __DWMAC4_DMA_H__ */
|
||||
237
devices/stmmac/dwmac4_lib-6.1-ethercat.c
Normal file
237
devices/stmmac/dwmac4_lib-6.1-ethercat.c
Normal file
@@ -0,0 +1,237 @@
|
||||
// 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.1-ethercat.h"
|
||||
#include "dwmac4_dma-6.1-ethercat.h"
|
||||
#include "dwmac4-6.1-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(void __iomem *ioaddr, u32 tail_ptr, u32 chan)
|
||||
{
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan)
|
||||
{
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_tx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_TE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value |= DMA_CONTROL_SR;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_RE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
|
||||
{
|
||||
writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
|
||||
{
|
||||
writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(chan));
|
||||
}
|
||||
|
||||
void dwmac4_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
}
|
||||
|
||||
void dwmac410_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(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(chan));
|
||||
}
|
||||
|
||||
void dwmac4_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
}
|
||||
|
||||
void dwmac410_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(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(chan));
|
||||
}
|
||||
|
||||
int dwmac4_dma_interrupt(void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(chan));
|
||||
u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(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(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);
|
||||
u32 old_val = value;
|
||||
|
||||
if (enable)
|
||||
value |= GMAC_CONFIG_RE | GMAC_CONFIG_TE;
|
||||
else
|
||||
value &= ~(GMAC_CONFIG_TE | GMAC_CONFIG_RE);
|
||||
|
||||
if (value != old_val)
|
||||
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;
|
||||
}
|
||||
237
devices/stmmac/dwmac4_lib-6.1-orig.c
Normal file
237
devices/stmmac/dwmac4_lib-6.1-orig.c
Normal file
@@ -0,0 +1,237 @@
|
||||
// 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"
|
||||
|
||||
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(void __iomem *ioaddr, u32 tail_ptr, u32 chan)
|
||||
{
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan)
|
||||
{
|
||||
writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_tx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value |= DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_TE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
|
||||
value &= ~DMA_CONTROL_ST;
|
||||
writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
|
||||
}
|
||||
|
||||
void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value |= DMA_CONTROL_SR;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value = readl(ioaddr + GMAC_CONFIG);
|
||||
value |= GMAC_CONFIG_RE;
|
||||
writel(value, ioaddr + GMAC_CONFIG);
|
||||
}
|
||||
|
||||
void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
|
||||
value &= ~DMA_CONTROL_SR;
|
||||
writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
|
||||
{
|
||||
writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(chan));
|
||||
}
|
||||
|
||||
void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
|
||||
{
|
||||
writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(chan));
|
||||
}
|
||||
|
||||
void dwmac4_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
|
||||
if (rx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value |= DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
}
|
||||
|
||||
void dwmac410_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(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(chan));
|
||||
}
|
||||
|
||||
void dwmac4_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
|
||||
if (rx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_RX;
|
||||
if (tx)
|
||||
value &= ~DMA_CHAN_INTR_DEFAULT_TX;
|
||||
|
||||
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
|
||||
}
|
||||
|
||||
void dwmac410_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx)
|
||||
{
|
||||
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(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(chan));
|
||||
}
|
||||
|
||||
int dwmac4_dma_interrupt(void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(chan));
|
||||
u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(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(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);
|
||||
u32 old_val = value;
|
||||
|
||||
if (enable)
|
||||
value |= GMAC_CONFIG_RE | GMAC_CONFIG_TE;
|
||||
else
|
||||
value &= ~(GMAC_CONFIG_TE | GMAC_CONFIG_RE);
|
||||
|
||||
if (value != old_val)
|
||||
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;
|
||||
}
|
||||
777
devices/stmmac/dwmac5-6.1-ethercat.c
Normal file
777
devices/stmmac/dwmac5-6.1-ethercat.c
Normal file
File diff suppressed because it is too large
Load Diff
164
devices/stmmac/dwmac5-6.1-ethercat.h
Normal file
164
devices/stmmac/dwmac5-6.1-ethercat.h
Normal file
@@ -0,0 +1,164 @@
|
||||
/* 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, struct stmmac_fpe_cfg *cfg,
|
||||
u32 num_txq, u32 num_rxq,
|
||||
bool enable);
|
||||
void dwmac5_fpe_send_mpacket(void __iomem *ioaddr,
|
||||
struct stmmac_fpe_cfg *cfg,
|
||||
enum stmmac_mpacket_type type);
|
||||
int dwmac5_fpe_irq_status(void __iomem *ioaddr, struct net_device *dev);
|
||||
|
||||
#endif /* __DWMAC5_H__ */
|
||||
777
devices/stmmac/dwmac5-6.1-orig.c
Normal file
777
devices/stmmac/dwmac5-6.1-orig.c
Normal file
File diff suppressed because it is too large
Load Diff
164
devices/stmmac/dwmac5-6.1-orig.h
Normal file
164
devices/stmmac/dwmac5-6.1-orig.h
Normal file
@@ -0,0 +1,164 @@
|
||||
/* 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, struct stmmac_fpe_cfg *cfg,
|
||||
u32 num_txq, u32 num_rxq,
|
||||
bool enable);
|
||||
void dwmac5_fpe_send_mpacket(void __iomem *ioaddr,
|
||||
struct stmmac_fpe_cfg *cfg,
|
||||
enum stmmac_mpacket_type type);
|
||||
int dwmac5_fpe_irq_status(void __iomem *ioaddr, struct net_device *dev);
|
||||
|
||||
#endif /* __DWMAC5_H__ */
|
||||
166
devices/stmmac/dwmac_dma-6.1-ethercat.h
Normal file
166
devices/stmmac/dwmac_dma-6.1-ethercat.h
Normal file
@@ -0,0 +1,166 @@
|
||||
/* 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(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac_dma_start_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_stop_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_start_rx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_stop_rx(void __iomem *ioaddr, u32 chan);
|
||||
int dwmac_dma_interrupt(void __iomem *ioaddr, struct stmmac_extra_stats *x,
|
||||
u32 chan, u32 dir);
|
||||
int dwmac_dma_reset(void __iomem *ioaddr);
|
||||
|
||||
#endif /* __DWMAC_DMA_H__ */
|
||||
166
devices/stmmac/dwmac_dma-6.1-orig.h
Normal file
166
devices/stmmac/dwmac_dma-6.1-orig.h
Normal file
@@ -0,0 +1,166 @@
|
||||
/* 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(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx);
|
||||
void dwmac_dma_start_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_stop_tx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_start_rx(void __iomem *ioaddr, u32 chan);
|
||||
void dwmac_dma_stop_rx(void __iomem *ioaddr, u32 chan);
|
||||
int dwmac_dma_interrupt(void __iomem *ioaddr, struct stmmac_extra_stats *x,
|
||||
u32 chan, u32 dir);
|
||||
int dwmac_dma_reset(void __iomem *ioaddr);
|
||||
|
||||
#endif /* __DWMAC_DMA_H__ */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user