mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
Merge branch 'net-ethernet-ti-am65-cpsw-nuss-introduce-support-for-am64x-cpsw3g'
Grygorii Strashko says: ==================== net: ethernet: ti: am65-cpsw-nuss: introduce support for am64x cpsw3g This series introduces basic support for recently introduced TI K3 AM642x SoC [1] which contains 3 port (2 external ports) CPSW3g module. The CPSW3g integrated in MAIN domain and can be configured in multi port or switch modes. In this series only multi port mode is enabled. The initial version of switchdev support was introduced by Vignesh Raghavendra [2] and work is in progress. The overall functionality and DT bindings are similar to other K3 CPSWxg versions, so DT binding changes are minimal and driver is mostly re-used for TI K3 AM642x CPSW3g. The main difference is that TI K3 AM642x SoC is not fully DMA coherent and instead DMA coherency is supported per DMA channel. Patches 1-2 - DT bindings update Patches 3-4 - Update driver to support changed DMA coherency model Patches 5-6 - adds TI K3 AM642x SoC platform data and so enable CPSW3g [1] https://www.ti.com/lit/pdf/spruim2 [2] https://patchwork.ozlabs.org/project/netdev/cover/20201130082046.16292-1-vigneshr@ti.com/ ==================== Link: https://lore.kernel.org/r/20210115192853.5469-1-grygorii.strashko@ti.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
719fc6b75f
@ -4,7 +4,7 @@
|
||||
$id: http://devicetree.org/schemas/net/ti,k3-am654-cpsw-nuss.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: The TI AM654x/J721E SoC Gigabit Ethernet MAC (Media Access Controller) Device Tree Bindings
|
||||
title: The TI AM654x/J721E/AM642x SoC Gigabit Ethernet MAC (Media Access Controller) Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Grygorii Strashko <grygorii.strashko@ti.com>
|
||||
@ -13,19 +13,16 @@ maintainers:
|
||||
description:
|
||||
The TI AM654x/J721E SoC Gigabit Ethernet MAC (CPSW2G NUSS) has two ports
|
||||
(one external) and provides Ethernet packet communication for the device.
|
||||
CPSW2G NUSS features - the Reduced Gigabit Media Independent Interface (RGMII),
|
||||
Reduced Media Independent Interface (RMII), the Management Data
|
||||
Input/Output (MDIO) interface for physical layer device (PHY) management,
|
||||
new version of Common Platform Time Sync (CPTS), updated Address Lookup
|
||||
Engine (ALE).
|
||||
One external Ethernet port (port 1) with selectable RGMII/RMII interfaces and
|
||||
an internal Communications Port Programming Interface (CPPI5) (Host port 0).
|
||||
Host Port 0 CPPI Packet Streaming Interface interface supports 8 TX channels
|
||||
and one RX channels and operating by TI AM654x/J721E NAVSS Unified DMA
|
||||
Peripheral Root Complex (UDMA-P) controller.
|
||||
The CPSW2G NUSS is integrated into device MCU domain named MCU_CPSW0.
|
||||
The TI AM642x SoC Gigabit Ethernet MAC (CPSW3G NUSS) has three ports
|
||||
(two external) and provides Ethernet packet communication and switching.
|
||||
|
||||
Additional features
|
||||
The internal Communications Port Programming Interface (CPPI5) (Host port 0).
|
||||
Host Port 0 CPPI Packet Streaming Interface interface supports 8 TX channels
|
||||
and one RX channels and operating by NAVSS Unified DMA Peripheral Root
|
||||
Complex (UDMA-P) controller.
|
||||
|
||||
CPSWxG features
|
||||
updated Address Lookup Engine (ALE).
|
||||
priority level Quality Of Service (QOS) support (802.1p)
|
||||
Support for Audio/Video Bridging (P802.1Qav/D6.0)
|
||||
Support for IEEE 1588 Clock Synchronization (2008 Annex D, Annex E and Annex F)
|
||||
@ -38,10 +35,18 @@ description:
|
||||
VLAN support, 802.1Q compliant, Auto add port VLAN for untagged frames on
|
||||
ingress, Auto VLAN removal on egress and auto pad to minimum frame size.
|
||||
RX/TX csum offload
|
||||
Management Data Input/Output (MDIO) interface for PHYs management
|
||||
RMII/RGMII Interfaces support
|
||||
new version of Common Platform Time Sync (CPTS)
|
||||
|
||||
The CPSWxG NUSS is integrated into
|
||||
device MCU domain named MCU_CPSW0 on AM654x/J721E SoC.
|
||||
device MAIN domain named CPSW0 on AM642x SoC.
|
||||
|
||||
Specifications can be found at
|
||||
http://www.ti.com/lit/ug/spruid7e/spruid7e.pdf
|
||||
http://www.ti.com/lit/ug/spruil1a/spruil1a.pdf
|
||||
https://www.ti.com/lit/pdf/spruid7
|
||||
https://www.ti.com/lit/zip/spruil1
|
||||
https://www.ti.com/lit/pdf/spruim2
|
||||
|
||||
properties:
|
||||
"#address-cells": true
|
||||
@ -51,11 +56,12 @@ properties:
|
||||
oneOf:
|
||||
- const: ti,am654-cpsw-nuss
|
||||
- const: ti,j721e-cpsw-nuss
|
||||
- const: ti,am642-cpsw-nuss
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description:
|
||||
The physical base address and size of full the CPSW2G NUSS IO range
|
||||
The physical base address and size of full the CPSWxG NUSS IO range
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
@ -66,12 +72,16 @@ properties:
|
||||
dma-coherent: true
|
||||
|
||||
clocks:
|
||||
description: CPSW2G NUSS functional clock
|
||||
description: CPSWxG NUSS functional clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: fck
|
||||
|
||||
assigned-clock-parents: true
|
||||
|
||||
assigned-clocks: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
@ -99,16 +109,16 @@ properties:
|
||||
const: 0
|
||||
|
||||
patternProperties:
|
||||
port@1:
|
||||
port@[1-2]:
|
||||
type: object
|
||||
description: CPSW2G NUSS external ports
|
||||
description: CPSWxG NUSS external ports
|
||||
|
||||
$ref: ethernet-controller.yaml#
|
||||
|
||||
properties:
|
||||
reg:
|
||||
items:
|
||||
- const: 1
|
||||
minimum: 1
|
||||
maximum: 2
|
||||
description: CPSW port number
|
||||
|
||||
phys:
|
||||
|
@ -73,6 +73,13 @@ properties:
|
||||
items:
|
||||
- const: cpts
|
||||
|
||||
assigned-clock-parents: true
|
||||
|
||||
assigned-clocks: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
ti,cpts-ext-ts-inputs:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
maximum: 8
|
||||
|
@ -366,8 +366,9 @@ static int am65_cpsw_nuss_rx_push(struct am65_cpsw_common *common,
|
||||
}
|
||||
desc_dma = k3_cppi_desc_pool_virt2dma(rx_chn->desc_pool, desc_rx);
|
||||
|
||||
buf_dma = dma_map_single(dev, skb->data, pkt_len, DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(dev, buf_dma))) {
|
||||
buf_dma = dma_map_single(rx_chn->dma_dev, skb->data, pkt_len,
|
||||
DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(rx_chn->dma_dev, buf_dma))) {
|
||||
k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx);
|
||||
dev_err(dev, "Failed to map rx skb buffer\n");
|
||||
return -EINVAL;
|
||||
@ -375,6 +376,7 @@ static int am65_cpsw_nuss_rx_push(struct am65_cpsw_common *common,
|
||||
|
||||
cppi5_hdesc_init(desc_rx, CPPI5_INFO0_HDESC_EPIB_PRESENT,
|
||||
AM65_CPSW_NAV_PS_DATA_SIZE);
|
||||
k3_udma_glue_rx_dma_to_cppi5_addr(rx_chn->rx_chn, &buf_dma);
|
||||
cppi5_hdesc_attach_buf(desc_rx, buf_dma, skb_tailroom(skb), buf_dma, skb_tailroom(skb));
|
||||
swdata = cppi5_hdesc_get_swdata(desc_rx);
|
||||
*((void **)swdata) = skb;
|
||||
@ -691,8 +693,9 @@ static void am65_cpsw_nuss_rx_cleanup(void *data, dma_addr_t desc_dma)
|
||||
swdata = cppi5_hdesc_get_swdata(desc_rx);
|
||||
skb = *swdata;
|
||||
cppi5_hdesc_get_obuf(desc_rx, &buf_dma, &buf_dma_len);
|
||||
k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma);
|
||||
|
||||
dma_unmap_single(rx_chn->dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
|
||||
dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
|
||||
k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx);
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
@ -779,6 +782,7 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_common *common,
|
||||
swdata = cppi5_hdesc_get_swdata(desc_rx);
|
||||
skb = *swdata;
|
||||
cppi5_hdesc_get_obuf(desc_rx, &buf_dma, &buf_dma_len);
|
||||
k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma);
|
||||
pkt_len = cppi5_hdesc_get_pktlen(desc_rx);
|
||||
cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL);
|
||||
dev_dbg(dev, "%s rx port_id:%d\n", __func__, port_id);
|
||||
@ -793,7 +797,7 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_common *common,
|
||||
csum_info = psdata[2];
|
||||
dev_dbg(dev, "%s rx csum_info:%#x\n", __func__, csum_info);
|
||||
|
||||
dma_unmap_single(dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
|
||||
dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE);
|
||||
|
||||
k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx);
|
||||
|
||||
@ -864,7 +868,6 @@ static int am65_cpsw_nuss_rx_poll(struct napi_struct *napi_rx, int budget)
|
||||
}
|
||||
|
||||
static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
|
||||
struct device *dev,
|
||||
struct cppi5_host_desc_t *desc)
|
||||
{
|
||||
struct cppi5_host_desc_t *first_desc, *next_desc;
|
||||
@ -875,20 +878,23 @@ static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
|
||||
next_desc = first_desc;
|
||||
|
||||
cppi5_hdesc_get_obuf(first_desc, &buf_dma, &buf_dma_len);
|
||||
k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma);
|
||||
|
||||
dma_unmap_single(dev, buf_dma, buf_dma_len,
|
||||
DMA_TO_DEVICE);
|
||||
dma_unmap_single(tx_chn->dma_dev, buf_dma, buf_dma_len, DMA_TO_DEVICE);
|
||||
|
||||
next_desc_dma = cppi5_hdesc_get_next_hbdesc(first_desc);
|
||||
k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma);
|
||||
while (next_desc_dma) {
|
||||
next_desc = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool,
|
||||
next_desc_dma);
|
||||
cppi5_hdesc_get_obuf(next_desc, &buf_dma, &buf_dma_len);
|
||||
k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma);
|
||||
|
||||
dma_unmap_page(dev, buf_dma, buf_dma_len,
|
||||
dma_unmap_page(tx_chn->dma_dev, buf_dma, buf_dma_len,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
next_desc_dma = cppi5_hdesc_get_next_hbdesc(next_desc);
|
||||
k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma);
|
||||
|
||||
k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc);
|
||||
}
|
||||
@ -906,7 +912,7 @@ static void am65_cpsw_nuss_tx_cleanup(void *data, dma_addr_t desc_dma)
|
||||
desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma);
|
||||
swdata = cppi5_hdesc_get_swdata(desc_tx);
|
||||
skb = *(swdata);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, tx_chn->common->dev, desc_tx);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
@ -926,7 +932,7 @@ am65_cpsw_nuss_tx_compl_packet(struct am65_cpsw_tx_chn *tx_chn,
|
||||
desc_dma);
|
||||
swdata = cppi5_hdesc_get_swdata(desc_tx);
|
||||
skb = *(swdata);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, tx_chn->common->dev, desc_tx);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
|
||||
|
||||
ndev = skb->dev;
|
||||
|
||||
@ -1119,9 +1125,9 @@ static netdev_tx_t am65_cpsw_nuss_ndo_slave_xmit(struct sk_buff *skb,
|
||||
netif_txq = netdev_get_tx_queue(ndev, q_idx);
|
||||
|
||||
/* Map the linear buffer */
|
||||
buf_dma = dma_map_single(dev, skb->data, pkt_len,
|
||||
buf_dma = dma_map_single(tx_chn->dma_dev, skb->data, pkt_len,
|
||||
DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(dev, buf_dma))) {
|
||||
if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) {
|
||||
dev_err(dev, "Failed to map tx skb buffer\n");
|
||||
ndev->stats.tx_errors++;
|
||||
goto err_free_skb;
|
||||
@ -1130,7 +1136,8 @@ static netdev_tx_t am65_cpsw_nuss_ndo_slave_xmit(struct sk_buff *skb,
|
||||
first_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool);
|
||||
if (!first_desc) {
|
||||
dev_dbg(dev, "Failed to allocate descriptor\n");
|
||||
dma_unmap_single(dev, buf_dma, pkt_len, DMA_TO_DEVICE);
|
||||
dma_unmap_single(tx_chn->dma_dev, buf_dma, pkt_len,
|
||||
DMA_TO_DEVICE);
|
||||
goto busy_stop_q;
|
||||
}
|
||||
|
||||
@ -1140,6 +1147,7 @@ static netdev_tx_t am65_cpsw_nuss_ndo_slave_xmit(struct sk_buff *skb,
|
||||
cppi5_hdesc_set_pkttype(first_desc, 0x7);
|
||||
cppi5_desc_set_tags_ids(&first_desc->hdr, 0, port->port_id);
|
||||
|
||||
k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma);
|
||||
cppi5_hdesc_attach_buf(first_desc, buf_dma, pkt_len, buf_dma, pkt_len);
|
||||
swdata = cppi5_hdesc_get_swdata(first_desc);
|
||||
*(swdata) = skb;
|
||||
@ -1175,9 +1183,9 @@ static netdev_tx_t am65_cpsw_nuss_ndo_slave_xmit(struct sk_buff *skb,
|
||||
goto busy_free_descs;
|
||||
}
|
||||
|
||||
buf_dma = skb_frag_dma_map(dev, frag, 0, frag_size,
|
||||
buf_dma = skb_frag_dma_map(tx_chn->dma_dev, frag, 0, frag_size,
|
||||
DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(dev, buf_dma))) {
|
||||
if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) {
|
||||
dev_err(dev, "Failed to map tx skb page\n");
|
||||
k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc);
|
||||
ndev->stats.tx_errors++;
|
||||
@ -1185,11 +1193,13 @@ static netdev_tx_t am65_cpsw_nuss_ndo_slave_xmit(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
cppi5_hdesc_reset_hbdesc(next_desc);
|
||||
k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma);
|
||||
cppi5_hdesc_attach_buf(next_desc,
|
||||
buf_dma, frag_size, buf_dma, frag_size);
|
||||
|
||||
desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool,
|
||||
next_desc);
|
||||
k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &desc_dma);
|
||||
cppi5_hdesc_link_hbdesc(cur_desc, desc_dma);
|
||||
|
||||
pkt_len += frag_size;
|
||||
@ -1237,14 +1247,14 @@ done_tx:
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
err_free_descs:
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, dev, first_desc);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, first_desc);
|
||||
err_free_skb:
|
||||
ndev->stats.tx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
busy_free_descs:
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, dev, first_desc);
|
||||
am65_cpsw_nuss_xmit_free(tx_chn, first_desc);
|
||||
busy_stop_q:
|
||||
netif_tx_stop_queue(netif_txq);
|
||||
return NETDEV_TX_BUSY;
|
||||
@ -1545,16 +1555,6 @@ static int am65_cpsw_nuss_init_tx_chns(struct am65_cpsw_common *common)
|
||||
tx_chn->common = common;
|
||||
tx_chn->id = i;
|
||||
tx_chn->descs_num = max_desc_num;
|
||||
tx_chn->desc_pool =
|
||||
k3_cppi_desc_pool_create_name(dev,
|
||||
tx_chn->descs_num,
|
||||
hdesc_size,
|
||||
tx_chn->tx_chn_name);
|
||||
if (IS_ERR(tx_chn->desc_pool)) {
|
||||
ret = PTR_ERR(tx_chn->desc_pool);
|
||||
dev_err(dev, "Failed to create poll %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
tx_chn->tx_chn =
|
||||
k3_udma_glue_request_tx_chn(dev,
|
||||
@ -1565,6 +1565,17 @@ static int am65_cpsw_nuss_init_tx_chns(struct am65_cpsw_common *common)
|
||||
"Failed to request tx dma channel\n");
|
||||
goto err;
|
||||
}
|
||||
tx_chn->dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn->tx_chn);
|
||||
|
||||
tx_chn->desc_pool = k3_cppi_desc_pool_create_name(tx_chn->dma_dev,
|
||||
tx_chn->descs_num,
|
||||
hdesc_size,
|
||||
tx_chn->tx_chn_name);
|
||||
if (IS_ERR(tx_chn->desc_pool)) {
|
||||
ret = PTR_ERR(tx_chn->desc_pool);
|
||||
dev_err(dev, "Failed to create poll %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
tx_chn->irq = k3_udma_glue_tx_get_irq(tx_chn->tx_chn);
|
||||
if (tx_chn->irq <= 0) {
|
||||
@ -1622,14 +1633,6 @@ static int am65_cpsw_nuss_init_rx_chns(struct am65_cpsw_common *common)
|
||||
/* init all flows */
|
||||
rx_chn->dev = dev;
|
||||
rx_chn->descs_num = max_desc_num;
|
||||
rx_chn->desc_pool = k3_cppi_desc_pool_create_name(dev,
|
||||
rx_chn->descs_num,
|
||||
hdesc_size, "rx");
|
||||
if (IS_ERR(rx_chn->desc_pool)) {
|
||||
ret = PTR_ERR(rx_chn->desc_pool);
|
||||
dev_err(dev, "Failed to create rx poll %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
rx_chn->rx_chn = k3_udma_glue_request_rx_chn(dev, "rx", &rx_cfg);
|
||||
if (IS_ERR(rx_chn->rx_chn)) {
|
||||
@ -1637,6 +1640,16 @@ static int am65_cpsw_nuss_init_rx_chns(struct am65_cpsw_common *common)
|
||||
"Failed to request rx dma channel\n");
|
||||
goto err;
|
||||
}
|
||||
rx_chn->dma_dev = k3_udma_glue_rx_get_dma_device(rx_chn->rx_chn);
|
||||
|
||||
rx_chn->desc_pool = k3_cppi_desc_pool_create_name(rx_chn->dma_dev,
|
||||
rx_chn->descs_num,
|
||||
hdesc_size, "rx");
|
||||
if (IS_ERR(rx_chn->desc_pool)) {
|
||||
ret = PTR_ERR(rx_chn->desc_pool);
|
||||
dev_err(dev, "Failed to create rx poll %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
common->rx_flow_id_base =
|
||||
k3_udma_glue_rx_get_flow_id_base(rx_chn->rx_chn);
|
||||
@ -2102,9 +2115,16 @@ static const struct am65_cpsw_pdata j721e_pdata = {
|
||||
.fdqring_mode = K3_RINGACC_RING_MODE_MESSAGE,
|
||||
};
|
||||
|
||||
static const struct am65_cpsw_pdata am64x_cpswxg_pdata = {
|
||||
.quirks = 0,
|
||||
.ale_dev_id = "am64-cpswxg",
|
||||
.fdqring_mode = K3_RINGACC_RING_MODE_RING,
|
||||
};
|
||||
|
||||
static const struct of_device_id am65_cpsw_nuss_of_mtable[] = {
|
||||
{ .compatible = "ti,am654-cpsw-nuss", .data = &am65x_sr1_0},
|
||||
{ .compatible = "ti,j721e-cpsw-nuss", .data = &j721e_pdata},
|
||||
{ .compatible = "ti,am642-cpsw-nuss", .data = &am64x_cpswxg_pdata},
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, am65_cpsw_nuss_of_mtable);
|
||||
@ -2164,12 +2184,6 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
|
||||
common->tx_ch_num = 1;
|
||||
common->pf_p0_rx_ptype_rrobin = false;
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(48));
|
||||
if (ret) {
|
||||
dev_err(dev, "error setting dma mask: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
common->ports = devm_kcalloc(dev, common->port_num,
|
||||
sizeof(*common->ports),
|
||||
GFP_KERNEL);
|
||||
|
@ -56,6 +56,7 @@ struct am65_cpsw_host {
|
||||
};
|
||||
|
||||
struct am65_cpsw_tx_chn {
|
||||
struct device *dma_dev;
|
||||
struct napi_struct napi_tx;
|
||||
struct am65_cpsw_common *common;
|
||||
struct k3_cppi_desc_pool *desc_pool;
|
||||
@ -69,6 +70,7 @@ struct am65_cpsw_tx_chn {
|
||||
|
||||
struct am65_cpsw_rx_chn {
|
||||
struct device *dev;
|
||||
struct device *dma_dev;
|
||||
struct k3_cppi_desc_pool *desc_pool;
|
||||
struct k3_udma_glue_rx_channel *rx_chn;
|
||||
u32 descs_num;
|
||||
|
@ -1256,6 +1256,13 @@ static const struct cpsw_ale_dev_id cpsw_ale_id_match[] = {
|
||||
.major_ver_mask = 0x7,
|
||||
.vlan_entry_tbl = vlan_entry_k3_cpswxg,
|
||||
},
|
||||
{
|
||||
.dev_id = "am64-cpswxg",
|
||||
.features = CPSW_ALE_F_STATUS_REG | CPSW_ALE_F_HW_AUTOAGING,
|
||||
.major_ver_mask = 0x7,
|
||||
.vlan_entry_tbl = vlan_entry_k3_cpswxg,
|
||||
.tbl_entries = 512,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user