aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-02-27 11:40:04 -0500
committerDavid S. Miller <davem@davemloft.net>2018-02-27 11:40:04 -0500
commitb17db8c0a1c4fc4f488745ff3e14ff1928715852 (patch)
tree98f54d7c26d724c725f95927c2459f5870537097
parentafdd6ae352527b83a3e13c040b22f455fe6537db (diff)
parentc893238e5d9b279be4c73d7fdf0dc8986a6c118f (diff)
Merge branch 'DPAA-Ethernet-fixes'
Madalin Bucur says: ==================== DPAA Ethernet fixes Fixed an issue on the Tx path that was visible in netperf TCP_SENDFILE tests. Addressed another issue with Rx errors not being always counted. Adding control for allmulti. v2: rephrased commit message, reduced changes in the SG mapping fix ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/dpaa/dpaa_eth.c63
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_dtsec.c19
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_dtsec.h1
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_memac.c32
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_memac.h1
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_tgec.c33
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_tgec.h1
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.c3
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.h2
9 files changed, 124 insertions, 31 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index a998c36c5e61..159dc2df878d 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -454,6 +454,16 @@ static void dpaa_set_rx_mode(struct net_device *net_dev)
454 err); 454 err);
455 } 455 }
456 456
457 if (!!(net_dev->flags & IFF_ALLMULTI) != priv->mac_dev->allmulti) {
458 priv->mac_dev->allmulti = !priv->mac_dev->allmulti;
459 err = priv->mac_dev->set_allmulti(priv->mac_dev->fman_mac,
460 priv->mac_dev->allmulti);
461 if (err < 0)
462 netif_err(priv, drv, net_dev,
463 "mac_dev->set_allmulti() = %d\n",
464 err);
465 }
466
457 err = priv->mac_dev->set_multi(net_dev, priv->mac_dev); 467 err = priv->mac_dev->set_multi(net_dev, priv->mac_dev);
458 if (err < 0) 468 if (err < 0)
459 netif_err(priv, drv, net_dev, "mac_dev->set_multi() = %d\n", 469 netif_err(priv, drv, net_dev, "mac_dev->set_multi() = %d\n",
@@ -1916,8 +1926,10 @@ static int skb_to_sg_fd(struct dpaa_priv *priv,
1916 goto csum_failed; 1926 goto csum_failed;
1917 } 1927 }
1918 1928
1929 /* SGT[0] is used by the linear part */
1919 sgt = (struct qm_sg_entry *)(sgt_buf + priv->tx_headroom); 1930 sgt = (struct qm_sg_entry *)(sgt_buf + priv->tx_headroom);
1920 qm_sg_entry_set_len(&sgt[0], skb_headlen(skb)); 1931 frag_len = skb_headlen(skb);
1932 qm_sg_entry_set_len(&sgt[0], frag_len);
1921 sgt[0].bpid = FSL_DPAA_BPID_INV; 1933 sgt[0].bpid = FSL_DPAA_BPID_INV;
1922 sgt[0].offset = 0; 1934 sgt[0].offset = 0;
1923 addr = dma_map_single(dev, skb->data, 1935 addr = dma_map_single(dev, skb->data,
@@ -1930,9 +1942,9 @@ static int skb_to_sg_fd(struct dpaa_priv *priv,
1930 qm_sg_entry_set64(&sgt[0], addr); 1942 qm_sg_entry_set64(&sgt[0], addr);
1931 1943
1932 /* populate the rest of SGT entries */ 1944 /* populate the rest of SGT entries */
1933 frag = &skb_shinfo(skb)->frags[0]; 1945 for (i = 0; i < nr_frags; i++) {
1934 frag_len = frag->size; 1946 frag = &skb_shinfo(skb)->frags[i];
1935 for (i = 1; i <= nr_frags; i++, frag++) { 1947 frag_len = frag->size;
1936 WARN_ON(!skb_frag_page(frag)); 1948 WARN_ON(!skb_frag_page(frag));
1937 addr = skb_frag_dma_map(dev, frag, 0, 1949 addr = skb_frag_dma_map(dev, frag, 0,
1938 frag_len, dma_dir); 1950 frag_len, dma_dir);
@@ -1942,15 +1954,16 @@ static int skb_to_sg_fd(struct dpaa_priv *priv,
1942 goto sg_map_failed; 1954 goto sg_map_failed;
1943 } 1955 }
1944 1956
1945 qm_sg_entry_set_len(&sgt[i], frag_len); 1957 qm_sg_entry_set_len(&sgt[i + 1], frag_len);
1946 sgt[i].bpid = FSL_DPAA_BPID_INV; 1958 sgt[i + 1].bpid = FSL_DPAA_BPID_INV;
1947 sgt[i].offset = 0; 1959 sgt[i + 1].offset = 0;
1948 1960
1949 /* keep the offset in the address */ 1961 /* keep the offset in the address */
1950 qm_sg_entry_set64(&sgt[i], addr); 1962 qm_sg_entry_set64(&sgt[i + 1], addr);
1951 frag_len = frag->size;
1952 } 1963 }
1953 qm_sg_entry_set_f(&sgt[i - 1], frag_len); 1964
1965 /* Set the final bit in the last used entry of the SGT */
1966 qm_sg_entry_set_f(&sgt[nr_frags], frag_len);
1954 1967
1955 qm_fd_set_sg(fd, priv->tx_headroom, skb->len); 1968 qm_fd_set_sg(fd, priv->tx_headroom, skb->len);
1956 1969
@@ -2052,19 +2065,23 @@ static int dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
2052 /* MAX_SKB_FRAGS is equal or larger than our dpaa_SGT_MAX_ENTRIES; 2065 /* MAX_SKB_FRAGS is equal or larger than our dpaa_SGT_MAX_ENTRIES;
2053 * make sure we don't feed FMan with more fragments than it supports. 2066 * make sure we don't feed FMan with more fragments than it supports.
2054 */ 2067 */
2055 if (nonlinear && 2068 if (unlikely(nonlinear &&
2056 likely(skb_shinfo(skb)->nr_frags < DPAA_SGT_MAX_ENTRIES)) { 2069 (skb_shinfo(skb)->nr_frags >= DPAA_SGT_MAX_ENTRIES))) {
2057 /* Just create a S/G fd based on the skb */
2058 err = skb_to_sg_fd(priv, skb, &fd);
2059 percpu_priv->tx_frag_skbuffs++;
2060 } else {
2061 /* If the egress skb contains more fragments than we support 2070 /* If the egress skb contains more fragments than we support
2062 * we have no choice but to linearize it ourselves. 2071 * we have no choice but to linearize it ourselves.
2063 */ 2072 */
2064 if (unlikely(nonlinear) && __skb_linearize(skb)) 2073 if (__skb_linearize(skb))
2065 goto enomem; 2074 goto enomem;
2066 2075
2067 /* Finally, create a contig FD from this skb */ 2076 nonlinear = skb_is_nonlinear(skb);
2077 }
2078
2079 if (nonlinear) {
2080 /* Just create a S/G fd based on the skb */
2081 err = skb_to_sg_fd(priv, skb, &fd);
2082 percpu_priv->tx_frag_skbuffs++;
2083 } else {
2084 /* Create a contig FD from this skb */
2068 err = skb_to_contig_fd(priv, skb, &fd, &offset); 2085 err = skb_to_contig_fd(priv, skb, &fd, &offset);
2069 } 2086 }
2070 if (unlikely(err < 0)) 2087 if (unlikely(err < 0))
@@ -2201,14 +2218,8 @@ static enum qman_cb_dqrr_result rx_error_dqrr(struct qman_portal *portal,
2201 if (dpaa_eth_napi_schedule(percpu_priv, portal)) 2218 if (dpaa_eth_napi_schedule(percpu_priv, portal))
2202 return qman_cb_dqrr_stop; 2219 return qman_cb_dqrr_stop;
2203 2220
2204 if (dpaa_eth_refill_bpools(priv)) 2221 dpaa_eth_refill_bpools(priv);
2205 /* Unable to refill the buffer pool due to insufficient 2222 dpaa_rx_error(net_dev, priv, percpu_priv, &dq->fd, fq->fqid);
2206 * system memory. Just release the frame back into the pool,
2207 * otherwise we'll soon end up with an empty buffer pool.
2208 */
2209 dpaa_fd_release(net_dev, &dq->fd);
2210 else
2211 dpaa_rx_error(net_dev, priv, percpu_priv, &dq->fd, fq->fqid);
2212 2223
2213 return qman_cb_dqrr_consume; 2224 return qman_cb_dqrr_consume;
2214} 2225}
diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
index ea43b4974149..9a581faaa742 100644
--- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
@@ -1117,6 +1117,25 @@ int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
1117 return 0; 1117 return 0;
1118} 1118}
1119 1119
1120int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable)
1121{
1122 u32 tmp;
1123 struct dtsec_regs __iomem *regs = dtsec->regs;
1124
1125 if (!is_init_done(dtsec->dtsec_drv_param))
1126 return -EINVAL;
1127
1128 tmp = ioread32be(&regs->rctrl);
1129 if (enable)
1130 tmp |= RCTRL_MPROM;
1131 else
1132 tmp &= ~RCTRL_MPROM;
1133
1134 iowrite32be(tmp, &regs->rctrl);
1135
1136 return 0;
1137}
1138
1120int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr) 1139int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
1121{ 1140{
1122 struct dtsec_regs __iomem *regs = dtsec->regs; 1141 struct dtsec_regs __iomem *regs = dtsec->regs;
diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.h b/drivers/net/ethernet/freescale/fman/fman_dtsec.h
index c4467c072058..1a689adf5a22 100644
--- a/drivers/net/ethernet/freescale/fman/fman_dtsec.h
+++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.h
@@ -55,5 +55,6 @@ int dtsec_set_exception(struct fman_mac *dtsec,
55int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr); 55int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
56int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr); 56int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
57int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version); 57int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version);
58int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable);
58 59
59#endif /* __DTSEC_H */ 60#endif /* __DTSEC_H */
diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index c0296880feba..446a97b792e3 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -350,6 +350,7 @@ struct fman_mac {
350 struct fman_rev_info fm_rev_info; 350 struct fman_rev_info fm_rev_info;
351 bool basex_if; 351 bool basex_if;
352 struct phy_device *pcsphy; 352 struct phy_device *pcsphy;
353 bool allmulti_enabled;
353}; 354};
354 355
355static void add_addr_in_paddr(struct memac_regs __iomem *regs, u8 *adr, 356static void add_addr_in_paddr(struct memac_regs __iomem *regs, u8 *adr,
@@ -940,6 +941,29 @@ int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
940 return 0; 941 return 0;
941} 942}
942 943
944int memac_set_allmulti(struct fman_mac *memac, bool enable)
945{
946 u32 entry;
947 struct memac_regs __iomem *regs = memac->regs;
948
949 if (!is_init_done(memac->memac_drv_param))
950 return -EINVAL;
951
952 if (enable) {
953 for (entry = 0; entry < HASH_TABLE_SIZE; entry++)
954 iowrite32be(entry | HASH_CTRL_MCAST_EN,
955 &regs->hashtable_ctrl);
956 } else {
957 for (entry = 0; entry < HASH_TABLE_SIZE; entry++)
958 iowrite32be(entry & ~HASH_CTRL_MCAST_EN,
959 &regs->hashtable_ctrl);
960 }
961
962 memac->allmulti_enabled = enable;
963
964 return 0;
965}
966
943int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr) 967int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
944{ 968{
945 struct memac_regs __iomem *regs = memac->regs; 969 struct memac_regs __iomem *regs = memac->regs;
@@ -963,8 +987,12 @@ int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
963 break; 987 break;
964 } 988 }
965 } 989 }
966 if (list_empty(&memac->multicast_addr_hash->lsts[hash])) 990
967 iowrite32be(hash & ~HASH_CTRL_MCAST_EN, &regs->hashtable_ctrl); 991 if (!memac->allmulti_enabled) {
992 if (list_empty(&memac->multicast_addr_hash->lsts[hash]))
993 iowrite32be(hash & ~HASH_CTRL_MCAST_EN,
994 &regs->hashtable_ctrl);
995 }
968 996
969 return 0; 997 return 0;
970} 998}
diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.h b/drivers/net/ethernet/freescale/fman/fman_memac.h
index c4a66469a907..b5a50338ed9a 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.h
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.h
@@ -57,5 +57,6 @@ int memac_set_exception(struct fman_mac *memac,
57 enum fman_mac_exceptions exception, bool enable); 57 enum fman_mac_exceptions exception, bool enable);
58int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr); 58int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
59int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr); 59int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
60int memac_set_allmulti(struct fman_mac *memac, bool enable);
60 61
61#endif /* __MEMAC_H */ 62#endif /* __MEMAC_H */
diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.c b/drivers/net/ethernet/freescale/fman/fman_tgec.c
index 4b0f3a50b293..284735d4ebe9 100644
--- a/drivers/net/ethernet/freescale/fman/fman_tgec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_tgec.c
@@ -217,6 +217,7 @@ struct fman_mac {
217 struct tgec_cfg *cfg; 217 struct tgec_cfg *cfg;
218 void *fm; 218 void *fm;
219 struct fman_rev_info fm_rev_info; 219 struct fman_rev_info fm_rev_info;
220 bool allmulti_enabled;
220}; 221};
221 222
222static void set_mac_address(struct tgec_regs __iomem *regs, u8 *adr) 223static void set_mac_address(struct tgec_regs __iomem *regs, u8 *adr)
@@ -564,6 +565,29 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
564 return 0; 565 return 0;
565} 566}
566 567
568int tgec_set_allmulti(struct fman_mac *tgec, bool enable)
569{
570 u32 entry;
571 struct tgec_regs __iomem *regs = tgec->regs;
572
573 if (!is_init_done(tgec->cfg))
574 return -EINVAL;
575
576 if (enable) {
577 for (entry = 0; entry < TGEC_HASH_TABLE_SIZE; entry++)
578 iowrite32be(entry | TGEC_HASH_MCAST_EN,
579 &regs->hashtable_ctrl);
580 } else {
581 for (entry = 0; entry < TGEC_HASH_TABLE_SIZE; entry++)
582 iowrite32be(entry & ~TGEC_HASH_MCAST_EN,
583 &regs->hashtable_ctrl);
584 }
585
586 tgec->allmulti_enabled = enable;
587
588 return 0;
589}
590
567int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr) 591int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
568{ 592{
569 struct tgec_regs __iomem *regs = tgec->regs; 593 struct tgec_regs __iomem *regs = tgec->regs;
@@ -591,9 +615,12 @@ int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
591 break; 615 break;
592 } 616 }
593 } 617 }
594 if (list_empty(&tgec->multicast_addr_hash->lsts[hash])) 618
595 iowrite32be((hash & ~TGEC_HASH_MCAST_EN), 619 if (!tgec->allmulti_enabled) {
596 &regs->hashtable_ctrl); 620 if (list_empty(&tgec->multicast_addr_hash->lsts[hash]))
621 iowrite32be((hash & ~TGEC_HASH_MCAST_EN),
622 &regs->hashtable_ctrl);
623 }
597 624
598 return 0; 625 return 0;
599} 626}
diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.h b/drivers/net/ethernet/freescale/fman/fman_tgec.h
index 514bba9f47ce..cbbd3b422a98 100644
--- a/drivers/net/ethernet/freescale/fman/fman_tgec.h
+++ b/drivers/net/ethernet/freescale/fman/fman_tgec.h
@@ -51,5 +51,6 @@ int tgec_set_exception(struct fman_mac *tgec,
51int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr); 51int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
52int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr); 52int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
53int tgec_get_version(struct fman_mac *tgec, u32 *mac_version); 53int tgec_get_version(struct fman_mac *tgec, u32 *mac_version);
54int tgec_set_allmulti(struct fman_mac *tgec, bool enable);
54 55
55#endif /* __TGEC_H */ 56#endif /* __TGEC_H */
diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c
index 88c0a0636b44..4829dcd9e077 100644
--- a/drivers/net/ethernet/freescale/fman/mac.c
+++ b/drivers/net/ethernet/freescale/fman/mac.c
@@ -470,6 +470,7 @@ static void setup_dtsec(struct mac_device *mac_dev)
470 mac_dev->set_tx_pause = dtsec_set_tx_pause_frames; 470 mac_dev->set_tx_pause = dtsec_set_tx_pause_frames;
471 mac_dev->set_rx_pause = dtsec_accept_rx_pause_frames; 471 mac_dev->set_rx_pause = dtsec_accept_rx_pause_frames;
472 mac_dev->set_exception = dtsec_set_exception; 472 mac_dev->set_exception = dtsec_set_exception;
473 mac_dev->set_allmulti = dtsec_set_allmulti;
473 mac_dev->set_multi = set_multi; 474 mac_dev->set_multi = set_multi;
474 mac_dev->start = start; 475 mac_dev->start = start;
475 mac_dev->stop = stop; 476 mac_dev->stop = stop;
@@ -488,6 +489,7 @@ static void setup_tgec(struct mac_device *mac_dev)
488 mac_dev->set_tx_pause = tgec_set_tx_pause_frames; 489 mac_dev->set_tx_pause = tgec_set_tx_pause_frames;
489 mac_dev->set_rx_pause = tgec_accept_rx_pause_frames; 490 mac_dev->set_rx_pause = tgec_accept_rx_pause_frames;
490 mac_dev->set_exception = tgec_set_exception; 491 mac_dev->set_exception = tgec_set_exception;
492 mac_dev->set_allmulti = tgec_set_allmulti;
491 mac_dev->set_multi = set_multi; 493 mac_dev->set_multi = set_multi;
492 mac_dev->start = start; 494 mac_dev->start = start;
493 mac_dev->stop = stop; 495 mac_dev->stop = stop;
@@ -506,6 +508,7 @@ static void setup_memac(struct mac_device *mac_dev)
506 mac_dev->set_tx_pause = memac_set_tx_pause_frames; 508 mac_dev->set_tx_pause = memac_set_tx_pause_frames;
507 mac_dev->set_rx_pause = memac_accept_rx_pause_frames; 509 mac_dev->set_rx_pause = memac_accept_rx_pause_frames;
508 mac_dev->set_exception = memac_set_exception; 510 mac_dev->set_exception = memac_set_exception;
511 mac_dev->set_allmulti = memac_set_allmulti;
509 mac_dev->set_multi = set_multi; 512 mac_dev->set_multi = set_multi;
510 mac_dev->start = start; 513 mac_dev->start = start;
511 mac_dev->stop = stop; 514 mac_dev->stop = stop;
diff --git a/drivers/net/ethernet/freescale/fman/mac.h b/drivers/net/ethernet/freescale/fman/mac.h
index eefb3357e304..b520cec120ee 100644
--- a/drivers/net/ethernet/freescale/fman/mac.h
+++ b/drivers/net/ethernet/freescale/fman/mac.h
@@ -59,6 +59,7 @@ struct mac_device {
59 bool rx_pause_active; 59 bool rx_pause_active;
60 bool tx_pause_active; 60 bool tx_pause_active;
61 bool promisc; 61 bool promisc;
62 bool allmulti;
62 63
63 int (*init)(struct mac_device *mac_dev); 64 int (*init)(struct mac_device *mac_dev);
64 int (*start)(struct mac_device *mac_dev); 65 int (*start)(struct mac_device *mac_dev);
@@ -66,6 +67,7 @@ struct mac_device {
66 void (*adjust_link)(struct mac_device *mac_dev); 67 void (*adjust_link)(struct mac_device *mac_dev);
67 int (*set_promisc)(struct fman_mac *mac_dev, bool enable); 68 int (*set_promisc)(struct fman_mac *mac_dev, bool enable);
68 int (*change_addr)(struct fman_mac *mac_dev, enet_addr_t *enet_addr); 69 int (*change_addr)(struct fman_mac *mac_dev, enet_addr_t *enet_addr);
70 int (*set_allmulti)(struct fman_mac *mac_dev, bool enable);
69 int (*set_multi)(struct net_device *net_dev, 71 int (*set_multi)(struct net_device *net_dev,
70 struct mac_device *mac_dev); 72 struct mac_device *mac_dev);
71 int (*set_rx_pause)(struct fman_mac *mac_dev, bool en); 73 int (*set_rx_pause)(struct fman_mac *mac_dev, bool en);