You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge tag 'net-6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni:
"Including fixes from bluetooth, bpf and wireless.
Current release - regressions:
- bpf:
- fix wrong last sg check in sk_msg_recvmsg()
- fix kernel BUG in purge_effective_progs()
- mac80211:
- fix possible leak in ieee80211_tx_control_port()
- potential NULL dereference in ieee80211_tx_control_port()
Current release - new code bugs:
- nfp: fix the access to management firmware hanging
Previous releases - regressions:
- ip: fix triggering of 'icmp redirect'
- sched: tbf: don't call qdisc_put() while holding tree lock
- bpf: fix corrupted packets for XDP_SHARED_UMEM
- bluetooth: hci_sync: fix suspend performance regression
- micrel: fix probe failure
Previous releases - always broken:
- tcp: make global challenge ack rate limitation per net-ns and
default disabled
- tg3: fix potential hang-up on system reboot
- mac802154: fix reception for no-daddr packets
Misc:
- r8152: add PID for the lenovo onelink+ dock"
* tag 'net-6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (56 commits)
net/smc: Remove redundant refcount increase
Revert "sch_cake: Return __NET_XMIT_STOLEN when consuming enqueued skb"
tcp: make global challenge ack rate limitation per net-ns and default disabled
tcp: annotate data-race around challenge_timestamp
net: dsa: hellcreek: Print warning only once
ip: fix triggering of 'icmp redirect'
sch_cake: Return __NET_XMIT_STOLEN when consuming enqueued skb
selftests: net: sort .gitignore file
Documentation: networking: correct possessive "its"
kcm: fix strp_init() order and cleanup
mlxbf_gige: compute MDIO period based on i1clk
ethernet: rocker: fix sleep in atomic context bug in neigh_timer_handler
net: lan966x: improve error handle in lan966x_fdma_rx_get_frame()
nfp: fix the access to management firmware hanging
net: phy: micrel: Make the GPIO to be non-exclusive
net: virtio_net: fix notification coalescing comments
net/sched: fix netdevice reference leaks in attach_default_qdiscs()
net: sched: tbf: don't call qdisc_put() while holding tree lock
net: Use u64_stats_fetch_begin_irq() for stats fetch.
net: dsa: xrs700x: Use irqsave variant for u64 stats update
...
This commit is contained in:
@@ -67,7 +67,7 @@ The ``netdevsim`` driver supports rate objects management, which includes:
|
||||
- setting tx_share and tx_max rate values for any rate object type;
|
||||
- setting parent node for any rate object type.
|
||||
|
||||
Rate nodes and it's parameters are exposed in ``netdevsim`` debugfs in RO mode.
|
||||
Rate nodes and their parameters are exposed in ``netdevsim`` debugfs in RO mode.
|
||||
For example created rate node with name ``some_group``:
|
||||
|
||||
.. code:: shell
|
||||
|
||||
@@ -8,7 +8,7 @@ Transmit path guidelines:
|
||||
|
||||
1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under
|
||||
any normal circumstances. It is considered a hard error unless
|
||||
there is no way your device can tell ahead of time when it's
|
||||
there is no way your device can tell ahead of time when its
|
||||
transmit function will become busy.
|
||||
|
||||
Instead it must maintain the queue properly. For example,
|
||||
|
||||
@@ -1035,7 +1035,10 @@ tcp_limit_output_bytes - INTEGER
|
||||
tcp_challenge_ack_limit - INTEGER
|
||||
Limits number of Challenge ACK sent per second, as recommended
|
||||
in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
|
||||
Default: 1000
|
||||
Note that this per netns rate limit can allow some side channel
|
||||
attacks and probably should not be enabled.
|
||||
TCP stack implements per TCP socket limits anyway.
|
||||
Default: INT_MAX (unlimited)
|
||||
|
||||
UDP variables
|
||||
=============
|
||||
|
||||
@@ -11,7 +11,7 @@ Initial Release:
|
||||
================
|
||||
This is conceptually very similar to the macvlan driver with one major
|
||||
exception of using L3 for mux-ing /demux-ing among slaves. This property makes
|
||||
the master device share the L2 with it's slave devices. I have developed this
|
||||
the master device share the L2 with its slave devices. I have developed this
|
||||
driver in conjunction with network namespaces and not sure if there is use case
|
||||
outside of it.
|
||||
|
||||
|
||||
@@ -530,7 +530,7 @@ its tunnel close actions. For L2TPIP sockets, the socket's close
|
||||
handler initiates the same tunnel close actions. All sessions are
|
||||
first closed. Each session drops its tunnel ref. When the tunnel ref
|
||||
reaches zero, the tunnel puts its socket ref. When the socket is
|
||||
eventually destroyed, it's sk_destruct finally frees the L2TP tunnel
|
||||
eventually destroyed, its sk_destruct finally frees the L2TP tunnel
|
||||
context.
|
||||
|
||||
Sessions
|
||||
|
||||
@@ -159,7 +159,7 @@ tools such as iproute2.
|
||||
|
||||
The switchdev driver can know a particular port's position in the topology by
|
||||
monitoring NETDEV_CHANGEUPPER notifications. For example, a port moved into a
|
||||
bond will see it's upper master change. If that bond is moved into a bridge,
|
||||
bond will see its upper master change. If that bond is moved into a bridge,
|
||||
the bond's upper master will change. And so on. The driver will track such
|
||||
movements to know what position a port is in in the overall topology by
|
||||
registering for netdevice events and acting on NETDEV_CHANGEUPPER.
|
||||
|
||||
@@ -109,6 +109,7 @@ static void xrs700x_read_port_counters(struct xrs700x *priv, int port)
|
||||
{
|
||||
struct xrs700x_port *p = &priv->ports[port];
|
||||
struct rtnl_link_stats64 stats;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
memset(&stats, 0, sizeof(stats));
|
||||
@@ -138,9 +139,9 @@ static void xrs700x_read_port_counters(struct xrs700x *priv, int port)
|
||||
*/
|
||||
stats.rx_packets += stats.multicast;
|
||||
|
||||
u64_stats_update_begin(&p->syncp);
|
||||
flags = u64_stats_update_begin_irqsave(&p->syncp);
|
||||
p->stats64 = stats;
|
||||
u64_stats_update_end(&p->syncp);
|
||||
u64_stats_update_end_irqrestore(&p->syncp, flags);
|
||||
|
||||
mutex_unlock(&p->mib_mutex);
|
||||
}
|
||||
|
||||
@@ -18076,16 +18076,20 @@ static void tg3_shutdown(struct pci_dev *pdev)
|
||||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
|
||||
tg3_reset_task_cancel(tp);
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
netif_device_detach(dev);
|
||||
|
||||
if (netif_running(dev))
|
||||
dev_close(dev);
|
||||
|
||||
if (system_state == SYSTEM_POWER_OFF)
|
||||
tg3_power_down(tp);
|
||||
tg3_power_down(tp);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1919,7 +1919,7 @@ static void gmac_get_stats64(struct net_device *netdev,
|
||||
|
||||
/* Racing with RX NAPI */
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&port->rx_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->rx_stats_syncp);
|
||||
|
||||
stats->rx_packets = port->stats.rx_packets;
|
||||
stats->rx_bytes = port->stats.rx_bytes;
|
||||
@@ -1931,11 +1931,11 @@ static void gmac_get_stats64(struct net_device *netdev,
|
||||
stats->rx_crc_errors = port->stats.rx_crc_errors;
|
||||
stats->rx_frame_errors = port->stats.rx_frame_errors;
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->rx_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->rx_stats_syncp, start));
|
||||
|
||||
/* Racing with MIB and TX completion interrupts */
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&port->ir_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->ir_stats_syncp);
|
||||
|
||||
stats->tx_errors = port->stats.tx_errors;
|
||||
stats->tx_packets = port->stats.tx_packets;
|
||||
@@ -1945,15 +1945,15 @@ static void gmac_get_stats64(struct net_device *netdev,
|
||||
stats->rx_missed_errors = port->stats.rx_missed_errors;
|
||||
stats->rx_fifo_errors = port->stats.rx_fifo_errors;
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->ir_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->ir_stats_syncp, start));
|
||||
|
||||
/* Racing with hard_start_xmit */
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&port->tx_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->tx_stats_syncp);
|
||||
|
||||
stats->tx_dropped = port->stats.tx_dropped;
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->tx_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->tx_stats_syncp, start));
|
||||
|
||||
stats->rx_dropped += stats->rx_missed_errors;
|
||||
}
|
||||
@@ -2031,18 +2031,18 @@ static void gmac_get_ethtool_stats(struct net_device *netdev,
|
||||
/* Racing with MIB interrupt */
|
||||
do {
|
||||
p = values;
|
||||
start = u64_stats_fetch_begin(&port->ir_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->ir_stats_syncp);
|
||||
|
||||
for (i = 0; i < RX_STATS_NUM; i++)
|
||||
*p++ = port->hw_stats[i];
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->ir_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->ir_stats_syncp, start));
|
||||
values = p;
|
||||
|
||||
/* Racing with RX NAPI */
|
||||
do {
|
||||
p = values;
|
||||
start = u64_stats_fetch_begin(&port->rx_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->rx_stats_syncp);
|
||||
|
||||
for (i = 0; i < RX_STATUS_NUM; i++)
|
||||
*p++ = port->rx_stats[i];
|
||||
@@ -2050,13 +2050,13 @@ static void gmac_get_ethtool_stats(struct net_device *netdev,
|
||||
*p++ = port->rx_csum_stats[i];
|
||||
*p++ = port->rx_napi_exits;
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->rx_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->rx_stats_syncp, start));
|
||||
values = p;
|
||||
|
||||
/* Racing with TX start_xmit */
|
||||
do {
|
||||
p = values;
|
||||
start = u64_stats_fetch_begin(&port->tx_stats_syncp);
|
||||
start = u64_stats_fetch_begin_irq(&port->tx_stats_syncp);
|
||||
|
||||
for (i = 0; i < TX_MAX_FRAGS; i++) {
|
||||
*values++ = port->tx_frag_stats[i];
|
||||
@@ -2065,7 +2065,7 @@ static void gmac_get_ethtool_stats(struct net_device *netdev,
|
||||
*values++ = port->tx_frags_linearized;
|
||||
*values++ = port->tx_hw_csummed;
|
||||
|
||||
} while (u64_stats_fetch_retry(&port->tx_stats_syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&port->tx_stats_syncp, start));
|
||||
}
|
||||
|
||||
static int gmac_get_ksettings(struct net_device *netdev,
|
||||
|
||||
@@ -206,9 +206,9 @@ struct funeth_rxq {
|
||||
|
||||
#define FUN_QSTAT_READ(q, seq, stats_copy) \
|
||||
do { \
|
||||
seq = u64_stats_fetch_begin(&(q)->syncp); \
|
||||
seq = u64_stats_fetch_begin_irq(&(q)->syncp); \
|
||||
stats_copy = (q)->stats; \
|
||||
} while (u64_stats_fetch_retry(&(q)->syncp, (seq)))
|
||||
} while (u64_stats_fetch_retry_irq(&(q)->syncp, (seq)))
|
||||
|
||||
#define FUN_INT_NAME_LEN (IFNAMSIZ + 16)
|
||||
|
||||
|
||||
@@ -177,14 +177,14 @@ gve_get_ethtool_stats(struct net_device *netdev,
|
||||
struct gve_rx_ring *rx = &priv->rx[ring];
|
||||
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->rx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->rx[ring].statss);
|
||||
tmp_rx_pkts = rx->rpackets;
|
||||
tmp_rx_bytes = rx->rbytes;
|
||||
tmp_rx_skb_alloc_fail = rx->rx_skb_alloc_fail;
|
||||
tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
|
||||
tmp_rx_desc_err_dropped_pkt =
|
||||
rx->rx_desc_err_dropped_pkt;
|
||||
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->rx[ring].statss,
|
||||
start));
|
||||
rx_pkts += tmp_rx_pkts;
|
||||
rx_bytes += tmp_rx_bytes;
|
||||
@@ -198,10 +198,10 @@ gve_get_ethtool_stats(struct net_device *netdev,
|
||||
if (priv->tx) {
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->tx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->tx[ring].statss);
|
||||
tmp_tx_pkts = priv->tx[ring].pkt_done;
|
||||
tmp_tx_bytes = priv->tx[ring].bytes_done;
|
||||
} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->tx[ring].statss,
|
||||
start));
|
||||
tx_pkts += tmp_tx_pkts;
|
||||
tx_bytes += tmp_tx_bytes;
|
||||
@@ -259,13 +259,13 @@ gve_get_ethtool_stats(struct net_device *netdev,
|
||||
data[i++] = rx->fill_cnt - rx->cnt;
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->rx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->rx[ring].statss);
|
||||
tmp_rx_bytes = rx->rbytes;
|
||||
tmp_rx_skb_alloc_fail = rx->rx_skb_alloc_fail;
|
||||
tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
|
||||
tmp_rx_desc_err_dropped_pkt =
|
||||
rx->rx_desc_err_dropped_pkt;
|
||||
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->rx[ring].statss,
|
||||
start));
|
||||
data[i++] = tmp_rx_bytes;
|
||||
data[i++] = rx->rx_cont_packet_cnt;
|
||||
@@ -331,9 +331,9 @@ gve_get_ethtool_stats(struct net_device *netdev,
|
||||
}
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->tx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->tx[ring].statss);
|
||||
tmp_tx_bytes = tx->bytes_done;
|
||||
} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->tx[ring].statss,
|
||||
start));
|
||||
data[i++] = tmp_tx_bytes;
|
||||
data[i++] = tx->wake_queue;
|
||||
|
||||
@@ -51,10 +51,10 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
|
||||
for (ring = 0; ring < priv->rx_cfg.num_queues; ring++) {
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->rx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->rx[ring].statss);
|
||||
packets = priv->rx[ring].rpackets;
|
||||
bytes = priv->rx[ring].rbytes;
|
||||
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->rx[ring].statss,
|
||||
start));
|
||||
s->rx_packets += packets;
|
||||
s->rx_bytes += bytes;
|
||||
@@ -64,10 +64,10 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
|
||||
for (ring = 0; ring < priv->tx_cfg.num_queues; ring++) {
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->tx[ring].statss);
|
||||
u64_stats_fetch_begin_irq(&priv->tx[ring].statss);
|
||||
packets = priv->tx[ring].pkt_done;
|
||||
bytes = priv->tx[ring].bytes_done;
|
||||
} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
|
||||
} while (u64_stats_fetch_retry_irq(&priv->tx[ring].statss,
|
||||
start));
|
||||
s->tx_packets += packets;
|
||||
s->tx_bytes += bytes;
|
||||
@@ -1274,9 +1274,9 @@ void gve_handle_report_stats(struct gve_priv *priv)
|
||||
}
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&priv->tx[idx].statss);
|
||||
start = u64_stats_fetch_begin_irq(&priv->tx[idx].statss);
|
||||
tx_bytes = priv->tx[idx].bytes_done;
|
||||
} while (u64_stats_fetch_retry(&priv->tx[idx].statss, start));
|
||||
} while (u64_stats_fetch_retry_irq(&priv->tx[idx].statss, start));
|
||||
stats[stats_idx++] = (struct stats) {
|
||||
.stat_name = cpu_to_be32(TX_WAKE_CNT),
|
||||
.value = cpu_to_be64(priv->tx[idx].wake_queue),
|
||||
|
||||
@@ -74,14 +74,14 @@ void hinic_rxq_get_stats(struct hinic_rxq *rxq, struct hinic_rxq_stats *stats)
|
||||
unsigned int start;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxq_stats->syncp);
|
||||
start = u64_stats_fetch_begin_irq(&rxq_stats->syncp);
|
||||
stats->pkts = rxq_stats->pkts;
|
||||
stats->bytes = rxq_stats->bytes;
|
||||
stats->errors = rxq_stats->csum_errors +
|
||||
rxq_stats->other_errors;
|
||||
stats->csum_errors = rxq_stats->csum_errors;
|
||||
stats->other_errors = rxq_stats->other_errors;
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&rxq_stats->syncp, start));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -99,14 +99,14 @@ void hinic_txq_get_stats(struct hinic_txq *txq, struct hinic_txq_stats *stats)
|
||||
unsigned int start;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->syncp);
|
||||
start = u64_stats_fetch_begin_irq(&txq_stats->syncp);
|
||||
stats->pkts = txq_stats->pkts;
|
||||
stats->bytes = txq_stats->bytes;
|
||||
stats->tx_busy = txq_stats->tx_busy;
|
||||
stats->tx_wake = txq_stats->tx_wake;
|
||||
stats->tx_dropped = txq_stats->tx_dropped;
|
||||
stats->big_frags_pkts = txq_stats->big_frags_pkts;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->syncp, start));
|
||||
} while (u64_stats_fetch_retry_irq(&txq_stats->syncp, start));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -75,6 +75,7 @@ struct mlxbf_gige {
|
||||
struct net_device *netdev;
|
||||
struct platform_device *pdev;
|
||||
void __iomem *mdio_io;
|
||||
void __iomem *clk_io;
|
||||
struct mii_bus *mdiobus;
|
||||
spinlock_t lock; /* for packet processing indices */
|
||||
u16 rx_q_entries;
|
||||
@@ -137,7 +138,8 @@ enum mlxbf_gige_res {
|
||||
MLXBF_GIGE_RES_MDIO9,
|
||||
MLXBF_GIGE_RES_GPIO0,
|
||||
MLXBF_GIGE_RES_LLU,
|
||||
MLXBF_GIGE_RES_PLU
|
||||
MLXBF_GIGE_RES_PLU,
|
||||
MLXBF_GIGE_RES_CLK
|
||||
};
|
||||
|
||||
/* Version of register data returned by mlxbf_gige_get_regs() */
|
||||
|
||||
@@ -22,10 +22,23 @@
|
||||
#include <linux/property.h>
|
||||
|
||||
#include "mlxbf_gige.h"
|
||||
#include "mlxbf_gige_regs.h"
|
||||
|
||||
#define MLXBF_GIGE_MDIO_GW_OFFSET 0x0
|
||||
#define MLXBF_GIGE_MDIO_CFG_OFFSET 0x4
|
||||
|
||||
#define MLXBF_GIGE_MDIO_FREQ_REFERENCE 156250000ULL
|
||||
#define MLXBF_GIGE_MDIO_COREPLL_CONST 16384ULL
|
||||
#define MLXBF_GIGE_MDC_CLK_NS 400
|
||||
#define MLXBF_GIGE_MDIO_PLL_I1CLK_REG1 0x4
|
||||
#define MLXBF_GIGE_MDIO_PLL_I1CLK_REG2 0x8
|
||||
#define MLXBF_GIGE_MDIO_CORE_F_SHIFT 0
|
||||
#define MLXBF_GIGE_MDIO_CORE_F_MASK GENMASK(25, 0)
|
||||
#define MLXBF_GIGE_MDIO_CORE_R_SHIFT 26
|
||||
#define MLXBF_GIGE_MDIO_CORE_R_MASK GENMASK(31, 26)
|
||||
#define MLXBF_GIGE_MDIO_CORE_OD_SHIFT 0
|
||||
#define MLXBF_GIGE_MDIO_CORE_OD_MASK GENMASK(3, 0)
|
||||
|
||||
/* Support clause 22 */
|
||||
#define MLXBF_GIGE_MDIO_CL22_ST1 0x1
|
||||
#define MLXBF_GIGE_MDIO_CL22_WRITE 0x1
|
||||
@@ -50,28 +63,77 @@
|
||||
#define MLXBF_GIGE_MDIO_CFG_MDIO_IN_SAMP_MASK GENMASK(23, 16)
|
||||
#define MLXBF_GIGE_MDIO_CFG_MDIO_OUT_SAMP_MASK GENMASK(31, 24)
|
||||
|
||||
/* Formula for encoding the MDIO period. The encoded value is
|
||||
* passed to the MDIO config register.
|
||||
*
|
||||
* mdc_clk = 2*(val + 1)*i1clk
|
||||
*
|
||||
* 400 ns = 2*(val + 1)*(((1/430)*1000) ns)
|
||||
*
|
||||
* val = (((400 * 430 / 1000) / 2) - 1)
|
||||
*/
|
||||
#define MLXBF_GIGE_I1CLK_MHZ 430
|
||||
#define MLXBF_GIGE_MDC_CLK_NS 400
|
||||
|
||||
#define MLXBF_GIGE_MDIO_PERIOD (((MLXBF_GIGE_MDC_CLK_NS * MLXBF_GIGE_I1CLK_MHZ / 1000) / 2) - 1)
|
||||
|
||||
#define MLXBF_GIGE_MDIO_CFG_VAL (FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDIO_MODE_MASK, 1) | \
|
||||
FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDIO3_3_MASK, 1) | \
|
||||
FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDIO_FULL_DRIVE_MASK, 1) | \
|
||||
FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDC_PERIOD_MASK, \
|
||||
MLXBF_GIGE_MDIO_PERIOD) | \
|
||||
FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDIO_IN_SAMP_MASK, 6) | \
|
||||
FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDIO_OUT_SAMP_MASK, 13))
|
||||
|
||||
#define MLXBF_GIGE_BF2_COREPLL_ADDR 0x02800c30
|
||||
#define MLXBF_GIGE_BF2_COREPLL_SIZE 0x0000000c
|
||||
|
||||
static struct resource corepll_params[] = {
|
||||
[MLXBF_GIGE_VERSION_BF2] = {
|
||||
.start = MLXBF_GIGE_BF2_COREPLL_ADDR,
|
||||
.end = MLXBF_GIGE_BF2_COREPLL_ADDR + MLXBF_GIGE_BF2_COREPLL_SIZE - 1,
|
||||
.name = "COREPLL_RES"
|
||||
},
|
||||
};
|
||||
|
||||
/* Returns core clock i1clk in Hz */
|
||||
static u64 calculate_i1clk(struct mlxbf_gige *priv)
|
||||
{
|
||||
u8 core_od, core_r;
|
||||
u64 freq_output;
|
||||
u32 reg1, reg2;
|
||||
u32 core_f;
|
||||
|
||||
reg1 = readl(priv->clk_io + MLXBF_GIGE_MDIO_PLL_I1CLK_REG1);
|
||||
reg2 = readl(priv->clk_io + MLXBF_GIGE_MDIO_PLL_I1CLK_REG2);
|
||||
|
||||
core_f = (reg1 & MLXBF_GIGE_MDIO_CORE_F_MASK) >>
|
||||
MLXBF_GIGE_MDIO_CORE_F_SHIFT;
|
||||
core_r = (reg1 & MLXBF_GIGE_MDIO_CORE_R_MASK) >>
|
||||
MLXBF_GIGE_MDIO_CORE_R_SHIFT;
|
||||
core_od = (reg2 & MLXBF_GIGE_MDIO_CORE_OD_MASK) >>
|
||||
MLXBF_GIGE_MDIO_CORE_OD_SHIFT;
|
||||
|
||||
/* Compute PLL output frequency as follow:
|
||||
*
|
||||
* CORE_F / 16384
|
||||
* freq_output = freq_reference * ----------------------------
|
||||
* (CORE_R + 1) * (CORE_OD + 1)
|
||||
*/
|
||||
freq_output = div_u64((MLXBF_GIGE_MDIO_FREQ_REFERENCE * core_f),
|
||||
MLXBF_GIGE_MDIO_COREPLL_CONST);
|
||||
freq_output = div_u64(freq_output, (core_r + 1) * (core_od + 1));
|
||||
|
||||
return freq_output;
|
||||
}
|
||||
|
||||
/* Formula for encoding the MDIO period. The encoded value is
|
||||
* passed to the MDIO config register.
|
||||
*
|
||||
* mdc_clk = 2*(val + 1)*(core clock in sec)
|
||||
*
|
||||
* i1clk is in Hz:
|
||||
* 400 ns = 2*(val + 1)*(1/i1clk)
|
||||
*
|
||||
* val = (((400/10^9) / (1/i1clk) / 2) - 1)
|
||||
* val = (400/2 * i1clk)/10^9 - 1
|
||||
*/
|
||||
static u8 mdio_period_map(struct mlxbf_gige *priv)
|
||||
{
|
||||
u8 mdio_period;
|
||||
u64 i1clk;
|
||||
|
||||
i1clk = calculate_i1clk(priv);
|
||||
|
||||
mdio_period = div_u64((MLXBF_GIGE_MDC_CLK_NS >> 1) * i1clk, 1000000000) - 1;
|
||||
|
||||
return mdio_period;
|
||||
}
|
||||
|
||||
static u32 mlxbf_gige_mdio_create_cmd(u16 data, int phy_add,
|
||||
int phy_reg, u32 opcode)
|
||||
{
|
||||
@@ -124,9 +186,9 @@ static int mlxbf_gige_mdio_write(struct mii_bus *bus, int phy_add,
|
||||
int phy_reg, u16 val)
|
||||
{
|
||||
struct mlxbf_gige *priv = bus->priv;
|
||||
u32 temp;
|
||||
u32 cmd;
|
||||
int ret;
|
||||
u32 temp;
|
||||
|
||||
if (phy_reg & MII_ADDR_C45)
|
||||
return -EOPNOTSUPP;
|
||||
@@ -144,18 +206,44 @@ static int mlxbf_gige_mdio_write(struct mii_bus *bus, int phy_add,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mlxbf_gige_mdio_cfg(struct mlxbf_gige *priv)
|
||||
{
|
||||
u8 mdio_period;
|
||||
u32 val;
|
||||
|
||||
mdio_period = mdio_period_map(priv);
|
||||
|
||||
val = MLXBF_GIGE_MDIO_CFG_VAL;
|
||||
val |= FIELD_PREP(MLXBF_GIGE_MDIO_CFG_MDC_PERIOD_MASK, mdio_period);
|
||||
writel(val, priv->mdio_io + MLXBF_GIGE_MDIO_CFG_OFFSET);
|
||||
}
|
||||
|
||||
int mlxbf_gige_mdio_probe(struct platform_device *pdev, struct mlxbf_gige *priv)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
priv->mdio_io = devm_platform_ioremap_resource(pdev, MLXBF_GIGE_RES_MDIO9);
|
||||
if (IS_ERR(priv->mdio_io))
|
||||
return PTR_ERR(priv->mdio_io);
|
||||
|
||||
/* Configure mdio parameters */
|
||||
writel(MLXBF_GIGE_MDIO_CFG_VAL,
|
||||
priv->mdio_io + MLXBF_GIGE_MDIO_CFG_OFFSET);
|
||||
/* clk resource shared with other drivers so cannot use
|
||||
* devm_platform_ioremap_resource
|
||||
*/
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, MLXBF_GIGE_RES_CLK);
|
||||
if (!res) {
|
||||
/* For backward compatibility with older ACPI tables, also keep
|
||||
* CLK resource internal to the driver.
|
||||
*/
|
||||
res = &corepll_params[MLXBF_GIGE_VERSION_BF2];
|
||||
}
|
||||
|
||||
priv->clk_io = devm_ioremap(dev, res->start, resource_size(res));
|
||||
if (IS_ERR(priv->clk_io))
|
||||
return PTR_ERR(priv->clk_io);
|
||||
|
||||
mlxbf_gige_mdio_cfg(priv);
|
||||
|
||||
priv->mdiobus = devm_mdiobus_alloc(dev);
|
||||
if (!priv->mdiobus) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef __MLXBF_GIGE_REGS_H__
|
||||
#define __MLXBF_GIGE_REGS_H__
|
||||
|
||||
#define MLXBF_GIGE_VERSION 0x0000
|
||||
#define MLXBF_GIGE_VERSION_BF2 0x0
|
||||
#define MLXBF_GIGE_STATUS 0x0010
|
||||
#define MLXBF_GIGE_STATUS_READY BIT(0)
|
||||
#define MLXBF_GIGE_INT_STATUS 0x0028
|
||||
|
||||
@@ -423,7 +423,8 @@ mlxsw_sp_span_gretap4_route(const struct net_device *to_dev,
|
||||
|
||||
parms = mlxsw_sp_ipip_netdev_parms4(to_dev);
|
||||
ip_tunnel_init_flow(&fl4, parms.iph.protocol, *daddrp, *saddrp,
|
||||
0, 0, dev_net(to_dev), parms.link, tun->fwmark, 0);
|
||||
0, 0, dev_net(to_dev), parms.link, tun->fwmark, 0,
|
||||
0);
|
||||
|
||||
rt = ip_route_output_key(tun->net, &fl4);
|
||||
if (IS_ERR(rt))
|
||||
|
||||
@@ -425,7 +425,8 @@ static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx)
|
||||
lan966x_ifh_get_src_port(skb->data, &src_port);
|
||||
lan966x_ifh_get_timestamp(skb->data, ×tamp);
|
||||
|
||||
WARN_ON(src_port >= lan966x->num_phys_ports);
|
||||
if (WARN_ON(src_port >= lan966x->num_phys_ports))
|
||||
goto free_skb;
|
||||
|
||||
skb->dev = lan966x->ports[src_port]->dev;
|
||||
skb_pull(skb, IFH_LEN * sizeof(u32));
|
||||
@@ -449,6 +450,8 @@ static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx)
|
||||
|
||||
return skb;
|
||||
|
||||
free_skb:
|
||||
kfree_skb(skb);
|
||||
unmap_page:
|
||||
dma_unmap_page(lan966x->dev, (dma_addr_t)db->dataptr,
|
||||
FDMA_DCB_STATUS_BLOCKL(db->status),
|
||||
|
||||
@@ -113,6 +113,8 @@ static void sparx5_xtr_grp(struct sparx5 *sparx5, u8 grp, bool byte_swap)
|
||||
/* This assumes STATUS_WORD_POS == 1, Status
|
||||
* just after last data
|
||||
*/
|
||||
if (!byte_swap)
|
||||
val = ntohl((__force __be32)val);
|
||||
byte_cnt -= (4 - XTR_VALID_BYTES(val));
|
||||
eof_flag = true;
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user