mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'net-5.19-final' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from bluetooth and netfilter, no known blockers for
the release.
Current release - regressions:
- wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop(), fix
taking the lock before its initialized
- Bluetooth: mgmt: fix double free on error path
Current release - new code bugs:
- eth: ice: fix tunnel checksum offload with fragmented traffic
Previous releases - regressions:
- tcp: md5: fix IPv4-mapped support after refactoring, don't take the
pure v6 path
- Revert "tcp: change pingpong threshold to 3", improving detection
of interactive sessions
- mld: fix netdev refcount leak in mld_{query | report}_work() due to
a race
- Bluetooth:
- always set event mask on suspend, avoid early wake ups
- L2CAP: fix use-after-free caused by l2cap_chan_put
- bridge: do not send empty IFLA_AF_SPEC attribute
Previous releases - always broken:
- ping6: fix memleak in ipv6_renew_options()
- sctp: prevent null-deref caused by over-eager error paths
- virtio-net: fix the race between refill work and close, resulting
in NAPI scheduled after close and a BUG()
- macsec:
- fix three netlink parsing bugs
- avoid breaking the device state on invalid change requests
- fix a memleak in another error path
Misc:
- dt-bindings: net: ethernet-controller: rework 'fixed-link' schema
- two more batches of sysctl data race adornment"
* tag 'net-5.19-final' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (67 commits)
stmmac: dwmac-mediatek: fix resource leak in probe
ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr
net: ping6: Fix memleak in ipv6_renew_options().
net/funeth: Fix fun_xdp_tx() and XDP packet reclaim
sctp: leave the err path free in sctp_stream_init to sctp_stream_free
sfc: disable softirqs for ptp TX
ptp: ocp: Select CRC16 in the Kconfig.
tcp: md5: fix IPv4-mapped support
virtio-net: fix the race between refill work and close
mptcp: Do not return EINPROGRESS when subflow creation succeeds
Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put
Bluetooth: Always set event mask on suspend
Bluetooth: mgmt: Fix double free on error path
wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop()
ice: do not setup vlan for loopback VSI
ice: check (DD | EOF) bits on Rx descriptor rather than (EOP | RS)
ice: Fix VSIs unable to share unicast MAC
ice: Fix tunnel checksum offload with fragmented traffic
ice: Fix max VLANs available for VF
netfilter: nft_queue: only allow supported familes and hooks
...
This commit is contained in:
@@ -167,70 +167,65 @@ properties:
|
||||
- in-band-status
|
||||
|
||||
fixed-link:
|
||||
allOf:
|
||||
- if:
|
||||
type: array
|
||||
then:
|
||||
deprecated: true
|
||||
items:
|
||||
- minimum: 0
|
||||
maximum: 31
|
||||
description:
|
||||
Emulated PHY ID, choose any but unique to the all
|
||||
specified fixed-links
|
||||
oneOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
deprecated: true
|
||||
items:
|
||||
- minimum: 0
|
||||
maximum: 31
|
||||
description:
|
||||
Emulated PHY ID, choose any but unique to the all
|
||||
specified fixed-links
|
||||
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Duplex configuration. 0 for half duplex or 1 for
|
||||
full duplex
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Duplex configuration. 0 for half duplex or 1 for
|
||||
full duplex
|
||||
|
||||
- enum: [10, 100, 1000, 2500, 10000]
|
||||
description:
|
||||
Link speed in Mbits/sec.
|
||||
- enum: [10, 100, 1000, 2500, 10000]
|
||||
description:
|
||||
Link speed in Mbits/sec.
|
||||
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Pause configuration. 0 for no pause, 1 for pause
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Pause configuration. 0 for no pause, 1 for pause
|
||||
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Asymmetric pause configuration. 0 for no asymmetric
|
||||
pause, 1 for asymmetric pause
|
||||
- enum: [0, 1]
|
||||
description:
|
||||
Asymmetric pause configuration. 0 for no asymmetric
|
||||
pause, 1 for asymmetric pause
|
||||
- type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
speed:
|
||||
description:
|
||||
Link speed.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [10, 100, 1000, 2500, 10000]
|
||||
|
||||
full-duplex:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
Indicates that full-duplex is used. When absent, half
|
||||
duplex is assumed.
|
||||
|
||||
- if:
|
||||
type: object
|
||||
then:
|
||||
properties:
|
||||
speed:
|
||||
description:
|
||||
Link speed.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [10, 100, 1000, 2500, 10000]
|
||||
pause:
|
||||
$ref: /schemas/types.yaml#definitions/flag
|
||||
description:
|
||||
Indicates that pause should be enabled.
|
||||
|
||||
full-duplex:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
Indicates that full-duplex is used. When absent, half
|
||||
duplex is assumed.
|
||||
asym-pause:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
Indicates that asym_pause should be enabled.
|
||||
|
||||
pause:
|
||||
$ref: /schemas/types.yaml#definitions/flag
|
||||
description:
|
||||
Indicates that pause should be enabled.
|
||||
link-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO to determine if the link is up
|
||||
|
||||
asym-pause:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description:
|
||||
Indicates that asym_pause should be enabled.
|
||||
|
||||
link-gpios:
|
||||
maxItems: 1
|
||||
description:
|
||||
GPIO to determine if the link is up
|
||||
|
||||
required:
|
||||
- speed
|
||||
required:
|
||||
- speed
|
||||
|
||||
additionalProperties: true
|
||||
|
||||
|
||||
@@ -183,6 +183,7 @@ properties:
|
||||
Should specify the gpio for phy reset.
|
||||
|
||||
phy-reset-duration:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
deprecated: true
|
||||
description:
|
||||
Reset duration in milliseconds. Should present only if property
|
||||
@@ -191,12 +192,14 @@ properties:
|
||||
and 1 millisecond will be used instead.
|
||||
|
||||
phy-reset-active-high:
|
||||
type: boolean
|
||||
deprecated: true
|
||||
description:
|
||||
If present then the reset sequence using the GPIO specified in the
|
||||
"phy-reset-gpios" property is reversed (H=reset state, L=operation state).
|
||||
|
||||
phy-reset-post-delay:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
deprecated: true
|
||||
description:
|
||||
Post reset delay in milliseconds. If present then a delay of phy-reset-post-delay
|
||||
|
||||
@@ -2866,7 +2866,14 @@ sctp_rmem - vector of 3 INTEGERs: min, default, max
|
||||
Default: 4K
|
||||
|
||||
sctp_wmem - vector of 3 INTEGERs: min, default, max
|
||||
Currently this tunable has no effect.
|
||||
Only the first value ("min") is used, "default" and "max" are
|
||||
ignored.
|
||||
|
||||
min: Minimum size of send buffer that can be used by SCTP sockets.
|
||||
It is guaranteed to each SCTP socket (but not association) even
|
||||
under moderate memory pressure.
|
||||
|
||||
Default: 4K
|
||||
|
||||
addr_scope_policy - INTEGER
|
||||
Control IPv4 address scoping - draft-stewart-tsvwg-sctp-ipv4-00
|
||||
|
||||
@@ -142,6 +142,7 @@ static void *fun_run_xdp(struct funeth_rxq *q, skb_frag_t *frags, void *buf_va,
|
||||
int ref_ok, struct funeth_txq *xdp_q)
|
||||
{
|
||||
struct bpf_prog *xdp_prog;
|
||||
struct xdp_frame *xdpf;
|
||||
struct xdp_buff xdp;
|
||||
u32 act;
|
||||
|
||||
@@ -163,7 +164,9 @@ static void *fun_run_xdp(struct funeth_rxq *q, skb_frag_t *frags, void *buf_va,
|
||||
case XDP_TX:
|
||||
if (unlikely(!ref_ok))
|
||||
goto pass;
|
||||
if (!fun_xdp_tx(xdp_q, xdp.data, xdp.data_end - xdp.data))
|
||||
|
||||
xdpf = xdp_convert_buff_to_frame(&xdp);
|
||||
if (!xdpf || !fun_xdp_tx(xdp_q, xdpf))
|
||||
goto xdp_error;
|
||||
FUN_QSTAT_INC(q, xdp_tx);
|
||||
q->xdp_flush |= FUN_XDP_FLUSH_TX;
|
||||
|
||||
@@ -466,7 +466,7 @@ static unsigned int fun_xdpq_clean(struct funeth_txq *q, unsigned int budget)
|
||||
|
||||
do {
|
||||
fun_xdp_unmap(q, reclaim_idx);
|
||||
page_frag_free(q->info[reclaim_idx].vaddr);
|
||||
xdp_return_frame(q->info[reclaim_idx].xdpf);
|
||||
|
||||
trace_funeth_tx_free(q, reclaim_idx, 1, head);
|
||||
|
||||
@@ -479,11 +479,11 @@ static unsigned int fun_xdpq_clean(struct funeth_txq *q, unsigned int budget)
|
||||
return npkts;
|
||||
}
|
||||
|
||||
bool fun_xdp_tx(struct funeth_txq *q, void *data, unsigned int len)
|
||||
bool fun_xdp_tx(struct funeth_txq *q, struct xdp_frame *xdpf)
|
||||
{
|
||||
struct fun_eth_tx_req *req;
|
||||
struct fun_dataop_gl *gle;
|
||||
unsigned int idx;
|
||||
unsigned int idx, len;
|
||||
dma_addr_t dma;
|
||||
|
||||
if (fun_txq_avail(q) < FUN_XDP_CLEAN_THRES)
|
||||
@@ -494,7 +494,8 @@ bool fun_xdp_tx(struct funeth_txq *q, void *data, unsigned int len)
|
||||
return false;
|
||||
}
|
||||
|
||||
dma = dma_map_single(q->dma_dev, data, len, DMA_TO_DEVICE);
|
||||
len = xdpf->len;
|
||||
dma = dma_map_single(q->dma_dev, xdpf->data, len, DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(q->dma_dev, dma))) {
|
||||
FUN_QSTAT_INC(q, tx_map_err);
|
||||
return false;
|
||||
@@ -514,7 +515,7 @@ bool fun_xdp_tx(struct funeth_txq *q, void *data, unsigned int len)
|
||||
gle = (struct fun_dataop_gl *)req->dataop.imm;
|
||||
fun_dataop_gl_init(gle, 0, 0, len, dma);
|
||||
|
||||
q->info[idx].vaddr = data;
|
||||
q->info[idx].xdpf = xdpf;
|
||||
|
||||
u64_stats_update_begin(&q->syncp);
|
||||
q->stats.tx_bytes += len;
|
||||
@@ -545,12 +546,9 @@ int fun_xdp_xmit_frames(struct net_device *dev, int n,
|
||||
if (unlikely(q_idx >= fp->num_xdpqs))
|
||||
return -ENXIO;
|
||||
|
||||
for (q = xdpqs[q_idx], i = 0; i < n; i++) {
|
||||
const struct xdp_frame *xdpf = frames[i];
|
||||
|
||||
if (!fun_xdp_tx(q, xdpf->data, xdpf->len))
|
||||
for (q = xdpqs[q_idx], i = 0; i < n; i++)
|
||||
if (!fun_xdp_tx(q, frames[i]))
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(flags & XDP_XMIT_FLUSH))
|
||||
fun_txq_wr_db(q);
|
||||
@@ -577,7 +575,7 @@ static void fun_xdpq_purge(struct funeth_txq *q)
|
||||
unsigned int idx = q->cons_cnt & q->mask;
|
||||
|
||||
fun_xdp_unmap(q, idx);
|
||||
page_frag_free(q->info[idx].vaddr);
|
||||
xdp_return_frame(q->info[idx].xdpf);
|
||||
q->cons_cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,8 +95,8 @@ struct funeth_txq_stats { /* per Tx queue SW counters */
|
||||
|
||||
struct funeth_tx_info { /* per Tx descriptor state */
|
||||
union {
|
||||
struct sk_buff *skb; /* associated packet */
|
||||
void *vaddr; /* start address for XDP */
|
||||
struct sk_buff *skb; /* associated packet (sk_buff path) */
|
||||
struct xdp_frame *xdpf; /* associated XDP frame (XDP path) */
|
||||
};
|
||||
};
|
||||
|
||||
@@ -245,7 +245,7 @@ static inline int fun_irq_node(const struct fun_irq *p)
|
||||
int fun_rxq_napi_poll(struct napi_struct *napi, int budget);
|
||||
int fun_txq_napi_poll(struct napi_struct *napi, int budget);
|
||||
netdev_tx_t fun_start_xmit(struct sk_buff *skb, struct net_device *netdev);
|
||||
bool fun_xdp_tx(struct funeth_txq *q, void *data, unsigned int len);
|
||||
bool fun_xdp_tx(struct funeth_txq *q, struct xdp_frame *xdpf);
|
||||
int fun_xdp_xmit_frames(struct net_device *dev, int n,
|
||||
struct xdp_frame **frames, u32 flags);
|
||||
|
||||
|
||||
@@ -1925,11 +1925,15 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
|
||||
* non-zero req_queue_pairs says that user requested a new
|
||||
* queue count via ethtool's set_channels, so use this
|
||||
* value for queues distribution across traffic classes
|
||||
* We need at least one queue pair for the interface
|
||||
* to be usable as we see in else statement.
|
||||
*/
|
||||
if (vsi->req_queue_pairs > 0)
|
||||
vsi->num_queue_pairs = vsi->req_queue_pairs;
|
||||
else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
|
||||
vsi->num_queue_pairs = pf->num_lan_msix;
|
||||
else
|
||||
vsi->num_queue_pairs = 1;
|
||||
}
|
||||
|
||||
/* Number of queues per enabled TC */
|
||||
|
||||
@@ -658,7 +658,8 @@ static int ice_lbtest_receive_frames(struct ice_rx_ring *rx_ring)
|
||||
rx_desc = ICE_RX_DESC(rx_ring, i);
|
||||
|
||||
if (!(rx_desc->wb.status_error0 &
|
||||
cpu_to_le16(ICE_TX_DESC_CMD_EOP | ICE_TX_DESC_CMD_RS)))
|
||||
(cpu_to_le16(BIT(ICE_RX_FLEX_DESC_STATUS0_DD_S)) |
|
||||
cpu_to_le16(BIT(ICE_RX_FLEX_DESC_STATUS0_EOF_S)))))
|
||||
continue;
|
||||
|
||||
rx_buf = &rx_ring->rx_buf[i];
|
||||
|
||||
@@ -4656,6 +4656,8 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
|
||||
ice_set_safe_mode_caps(hw);
|
||||
}
|
||||
|
||||
hw->ucast_shared = true;
|
||||
|
||||
err = ice_init_pf(pf);
|
||||
if (err) {
|
||||
dev_err(dev, "ice_init_pf failed: %d\n", err);
|
||||
@@ -6011,10 +6013,12 @@ int ice_vsi_cfg(struct ice_vsi *vsi)
|
||||
if (vsi->netdev) {
|
||||
ice_set_rx_mode(vsi->netdev);
|
||||
|
||||
err = ice_vsi_vlan_setup(vsi);
|
||||
if (vsi->type != ICE_VSI_LB) {
|
||||
err = ice_vsi_vlan_setup(vsi);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
ice_vsi_cfg_dcb_rings(vsi);
|
||||
|
||||
|
||||
@@ -1309,39 +1309,6 @@ out_put_vf:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_unicast_mac_exists - check if the unicast MAC exists on the PF's switch
|
||||
* @pf: PF used to reference the switch's rules
|
||||
* @umac: unicast MAC to compare against existing switch rules
|
||||
*
|
||||
* Return true on the first/any match, else return false
|
||||
*/
|
||||
static bool ice_unicast_mac_exists(struct ice_pf *pf, u8 *umac)
|
||||
{
|
||||
struct ice_sw_recipe *mac_recipe_list =
|
||||
&pf->hw.switch_info->recp_list[ICE_SW_LKUP_MAC];
|
||||
struct ice_fltr_mgmt_list_entry *list_itr;
|
||||
struct list_head *rule_head;
|
||||
struct mutex *rule_lock; /* protect MAC filter list access */
|
||||
|
||||
rule_head = &mac_recipe_list->filt_rules;
|
||||
rule_lock = &mac_recipe_list->filt_rule_lock;
|
||||
|
||||
mutex_lock(rule_lock);
|
||||
list_for_each_entry(list_itr, rule_head, list_entry) {
|
||||
u8 *existing_mac = &list_itr->fltr_info.l_data.mac.mac_addr[0];
|
||||
|
||||
if (ether_addr_equal(existing_mac, umac)) {
|
||||
mutex_unlock(rule_lock);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(rule_lock);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_set_vf_mac
|
||||
* @netdev: network interface device structure
|
||||
@@ -1376,13 +1343,6 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
|
||||
if (ret)
|
||||
goto out_put_vf;
|
||||
|
||||
if (ice_unicast_mac_exists(pf, mac)) {
|
||||
netdev_err(netdev, "Unicast MAC %pM already exists on this PF. Preventing setting VF %u unicast MAC address to %pM\n",
|
||||
mac, vf_id, mac);
|
||||
ret = -EINVAL;
|
||||
goto out_put_vf;
|
||||
}
|
||||
|
||||
mutex_lock(&vf->cfg_lock);
|
||||
|
||||
/* VF is notified of its new MAC via the PF's response to the
|
||||
|
||||
@@ -1751,11 +1751,13 @@ int ice_tx_csum(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
|
||||
|
||||
protocol = vlan_get_protocol(skb);
|
||||
|
||||
if (eth_p_mpls(protocol))
|
||||
if (eth_p_mpls(protocol)) {
|
||||
ip.hdr = skb_inner_network_header(skb);
|
||||
else
|
||||
l4.hdr = skb_checksum_start(skb);
|
||||
} else {
|
||||
ip.hdr = skb_network_header(skb);
|
||||
l4.hdr = skb_checksum_start(skb);
|
||||
l4.hdr = skb_transport_header(skb);
|
||||
}
|
||||
|
||||
/* compute outer L2 header size */
|
||||
l2_len = ip.hdr - skb->data;
|
||||
|
||||
@@ -2948,7 +2948,8 @@ ice_vc_validate_add_vlan_filter_list(struct ice_vsi *vsi,
|
||||
struct virtchnl_vlan_filtering_caps *vfc,
|
||||
struct virtchnl_vlan_filter_list_v2 *vfl)
|
||||
{
|
||||
u16 num_requested_filters = vsi->num_vlan + vfl->num_elements;
|
||||
u16 num_requested_filters = ice_vsi_num_non_zero_vlans(vsi) +
|
||||
vfl->num_elements;
|
||||
|
||||
if (num_requested_filters > vfc->max_filters)
|
||||
return false;
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
#define MAX_RATE_EXPONENT 0x0FULL
|
||||
#define MAX_RATE_MANTISSA 0xFFULL
|
||||
|
||||
#define CN10K_MAX_BURST_MANTISSA 0x7FFFULL
|
||||
#define CN10K_MAX_BURST_SIZE 8453888ULL
|
||||
|
||||
/* Bitfields in NIX_TLX_PIR register */
|
||||
#define TLX_RATE_MANTISSA GENMASK_ULL(8, 1)
|
||||
#define TLX_RATE_EXPONENT GENMASK_ULL(12, 9)
|
||||
@@ -35,6 +38,9 @@
|
||||
#define TLX_BURST_MANTISSA GENMASK_ULL(36, 29)
|
||||
#define TLX_BURST_EXPONENT GENMASK_ULL(40, 37)
|
||||
|
||||
#define CN10K_TLX_BURST_MANTISSA GENMASK_ULL(43, 29)
|
||||
#define CN10K_TLX_BURST_EXPONENT GENMASK_ULL(47, 44)
|
||||
|
||||
struct otx2_tc_flow_stats {
|
||||
u64 bytes;
|
||||
u64 pkts;
|
||||
@@ -77,33 +83,42 @@ int otx2_tc_alloc_ent_bitmap(struct otx2_nic *nic)
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_tc_alloc_ent_bitmap);
|
||||
|
||||
static void otx2_get_egress_burst_cfg(u32 burst, u32 *burst_exp,
|
||||
u32 *burst_mantissa)
|
||||
static void otx2_get_egress_burst_cfg(struct otx2_nic *nic, u32 burst,
|
||||
u32 *burst_exp, u32 *burst_mantissa)
|
||||
{
|
||||
int max_burst, max_mantissa;
|
||||
unsigned int tmp;
|
||||
|
||||
if (is_dev_otx2(nic->pdev)) {
|
||||
max_burst = MAX_BURST_SIZE;
|
||||
max_mantissa = MAX_BURST_MANTISSA;
|
||||
} else {
|
||||
max_burst = CN10K_MAX_BURST_SIZE;
|
||||
max_mantissa = CN10K_MAX_BURST_MANTISSA;
|
||||
}
|
||||
|
||||
/* Burst is calculated as
|
||||
* ((256 + BURST_MANTISSA) << (1 + BURST_EXPONENT)) / 256
|
||||
* Max supported burst size is 130,816 bytes.
|
||||
*/
|
||||
burst = min_t(u32, burst, MAX_BURST_SIZE);
|
||||
burst = min_t(u32, burst, max_burst);
|
||||
if (burst) {
|
||||
*burst_exp = ilog2(burst) ? ilog2(burst) - 1 : 0;
|
||||
tmp = burst - rounddown_pow_of_two(burst);
|
||||
if (burst < MAX_BURST_MANTISSA)
|
||||
if (burst < max_mantissa)
|
||||
*burst_mantissa = tmp * 2;
|
||||
else
|
||||
*burst_mantissa = tmp / (1ULL << (*burst_exp - 7));
|
||||
} else {
|
||||
*burst_exp = MAX_BURST_EXPONENT;
|
||||
*burst_mantissa = MAX_BURST_MANTISSA;
|
||||
*burst_mantissa = max_mantissa;
|
||||
}
|
||||
}
|
||||
|
||||
static void otx2_get_egress_rate_cfg(u32 maxrate, u32 *exp,
|
||||
static void otx2_get_egress_rate_cfg(u64 maxrate, u32 *exp,
|
||||
u32 *mantissa, u32 *div_exp)
|
||||
{
|
||||
unsigned int tmp;
|
||||
u64 tmp;
|
||||
|
||||
/* Rate calculation by hardware
|
||||
*
|
||||
@@ -132,21 +147,44 @@ static void otx2_get_egress_rate_cfg(u32 maxrate, u32 *exp,
|
||||
}
|
||||
}
|
||||
|
||||
static int otx2_set_matchall_egress_rate(struct otx2_nic *nic, u32 burst, u32 maxrate)
|
||||
static u64 otx2_get_txschq_rate_regval(struct otx2_nic *nic,
|
||||
u64 maxrate, u32 burst)
|
||||
{
|
||||
u32 burst_exp, burst_mantissa;
|
||||
u32 exp, mantissa, div_exp;
|
||||
u64 regval = 0;
|
||||
|
||||
/* Get exponent and mantissa values from the desired rate */
|
||||
otx2_get_egress_burst_cfg(nic, burst, &burst_exp, &burst_mantissa);
|
||||
otx2_get_egress_rate_cfg(maxrate, &exp, &mantissa, &div_exp);
|
||||
|
||||
if (is_dev_otx2(nic->pdev)) {
|
||||
regval = FIELD_PREP(TLX_BURST_EXPONENT, (u64)burst_exp) |
|
||||
FIELD_PREP(TLX_BURST_MANTISSA, (u64)burst_mantissa) |
|
||||
FIELD_PREP(TLX_RATE_DIVIDER_EXPONENT, div_exp) |
|
||||
FIELD_PREP(TLX_RATE_EXPONENT, exp) |
|
||||
FIELD_PREP(TLX_RATE_MANTISSA, mantissa) | BIT_ULL(0);
|
||||
} else {
|
||||
regval = FIELD_PREP(CN10K_TLX_BURST_EXPONENT, (u64)burst_exp) |
|
||||
FIELD_PREP(CN10K_TLX_BURST_MANTISSA, (u64)burst_mantissa) |
|
||||
FIELD_PREP(TLX_RATE_DIVIDER_EXPONENT, div_exp) |
|
||||
FIELD_PREP(TLX_RATE_EXPONENT, exp) |
|
||||
FIELD_PREP(TLX_RATE_MANTISSA, mantissa) | BIT_ULL(0);
|
||||
}
|
||||
|
||||
return regval;
|
||||
}
|
||||
|
||||
static int otx2_set_matchall_egress_rate(struct otx2_nic *nic,
|
||||
u32 burst, u64 maxrate)
|
||||
{
|
||||
struct otx2_hw *hw = &nic->hw;
|
||||
struct nix_txschq_config *req;
|
||||
u32 burst_exp, burst_mantissa;
|
||||
u32 exp, mantissa, div_exp;
|
||||
int txschq, err;
|
||||
|
||||
/* All SQs share the same TL4, so pick the first scheduler */
|
||||
txschq = hw->txschq_list[NIX_TXSCH_LVL_TL4][0];
|
||||
|
||||
/* Get exponent and mantissa values from the desired rate */
|
||||
otx2_get_egress_burst_cfg(burst, &burst_exp, &burst_mantissa);
|
||||
otx2_get_egress_rate_cfg(maxrate, &exp, &mantissa, &div_exp);
|
||||
|
||||
mutex_lock(&nic->mbox.lock);
|
||||
req = otx2_mbox_alloc_msg_nix_txschq_cfg(&nic->mbox);
|
||||
if (!req) {
|
||||
@@ -157,11 +195,7 @@ static int otx2_set_matchall_egress_rate(struct otx2_nic *nic, u32 burst, u32 ma
|
||||
req->lvl = NIX_TXSCH_LVL_TL4;
|
||||
req->num_regs = 1;
|
||||
req->reg[0] = NIX_AF_TL4X_PIR(txschq);
|
||||
req->regval[0] = FIELD_PREP(TLX_BURST_EXPONENT, burst_exp) |
|
||||
FIELD_PREP(TLX_BURST_MANTISSA, burst_mantissa) |
|
||||
FIELD_PREP(TLX_RATE_DIVIDER_EXPONENT, div_exp) |
|
||||
FIELD_PREP(TLX_RATE_EXPONENT, exp) |
|
||||
FIELD_PREP(TLX_RATE_MANTISSA, mantissa) | BIT_ULL(0);
|
||||
req->regval[0] = otx2_get_txschq_rate_regval(nic, maxrate, burst);
|
||||
|
||||
err = otx2_sync_mbox_msg(&nic->mbox);
|
||||
mutex_unlock(&nic->mbox.lock);
|
||||
@@ -230,7 +264,7 @@ static int otx2_tc_egress_matchall_install(struct otx2_nic *nic,
|
||||
struct netlink_ext_ack *extack = cls->common.extack;
|
||||
struct flow_action *actions = &cls->rule->action;
|
||||
struct flow_action_entry *entry;
|
||||
u32 rate;
|
||||
u64 rate;
|
||||
int err;
|
||||
|
||||
err = otx2_tc_validate_flow(nic, actions, extack);
|
||||
@@ -256,7 +290,7 @@ static int otx2_tc_egress_matchall_install(struct otx2_nic *nic,
|
||||
}
|
||||
/* Convert bytes per second to Mbps */
|
||||
rate = entry->police.rate_bytes_ps * 8;
|
||||
rate = max_t(u32, rate / 1000000, 1);
|
||||
rate = max_t(u64, rate / 1000000, 1);
|
||||
err = otx2_set_matchall_egress_rate(nic, entry->police.burst, rate);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -614,21 +648,27 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node,
|
||||
|
||||
flow_spec->dport = match.key->dst;
|
||||
flow_mask->dport = match.mask->dst;
|
||||
if (ip_proto == IPPROTO_UDP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_UDP);
|
||||
else if (ip_proto == IPPROTO_TCP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_TCP);
|
||||
else if (ip_proto == IPPROTO_SCTP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_SCTP);
|
||||
|
||||
if (flow_mask->dport) {
|
||||
if (ip_proto == IPPROTO_UDP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_UDP);
|
||||
else if (ip_proto == IPPROTO_TCP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_TCP);
|
||||
else if (ip_proto == IPPROTO_SCTP)
|
||||
req->features |= BIT_ULL(NPC_DPORT_SCTP);
|
||||
}
|
||||
|
||||
flow_spec->sport = match.key->src;
|
||||
flow_mask->sport = match.mask->src;
|
||||
if (ip_proto == IPPROTO_UDP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_UDP);
|
||||
else if (ip_proto == IPPROTO_TCP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_TCP);
|
||||
else if (ip_proto == IPPROTO_SCTP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_SCTP);
|
||||
|
||||
if (flow_mask->sport) {
|
||||
if (ip_proto == IPPROTO_UDP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_UDP);
|
||||
else if (ip_proto == IPPROTO_TCP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_TCP);
|
||||
else if (ip_proto == IPPROTO_SCTP)
|
||||
req->features |= BIT_ULL(NPC_SPORT_SCTP);
|
||||
}
|
||||
}
|
||||
|
||||
return otx2_tc_parse_actions(nic, &rule->action, req, f, node);
|
||||
|
||||
@@ -4233,7 +4233,7 @@ static void nfp_bpf_opt_ldst_gather(struct nfp_prog *nfp_prog)
|
||||
}
|
||||
|
||||
/* If the chain is ended by an load/store pair then this
|
||||
* could serve as the new head of the the next chain.
|
||||
* could serve as the new head of the next chain.
|
||||
*/
|
||||
if (curr_pair_is_memcpy(meta1, meta2)) {
|
||||
head_ld_meta = meta1;
|
||||
|
||||
@@ -1100,7 +1100,29 @@ static void efx_ptp_xmit_skb_queue(struct efx_nic *efx, struct sk_buff *skb)
|
||||
|
||||
tx_queue = efx_channel_get_tx_queue(ptp_data->channel, type);
|
||||
if (tx_queue && tx_queue->timestamping) {
|
||||
/* This code invokes normal driver TX code which is always
|
||||
* protected from softirqs when called from generic TX code,
|
||||
* which in turn disables preemption. Look at __dev_queue_xmit
|
||||
* which uses rcu_read_lock_bh disabling preemption for RCU
|
||||
* plus disabling softirqs. We do not need RCU reader
|
||||
* protection here.
|
||||
*
|
||||
* Although it is theoretically safe for current PTP TX/RX code
|
||||
* running without disabling softirqs, there are three good
|
||||
* reasond for doing so:
|
||||
*
|
||||
* 1) The code invoked is mainly implemented for non-PTP
|
||||
* packets and it is always executed with softirqs
|
||||
* disabled.
|
||||
* 2) This being a single PTP packet, better to not
|
||||
* interrupt its processing by softirqs which can lead
|
||||
* to high latencies.
|
||||
* 3) netdev_xmit_more checks preemption is disabled and
|
||||
* triggers a BUG_ON if not.
|
||||
*/
|
||||
local_bh_disable();
|
||||
efx_enqueue_skb(tx_queue, skb);
|
||||
local_bh_enable();
|
||||
} else {
|
||||
WARN_ONCE(1, "PTP channel has no timestamped tx queue\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
@@ -688,18 +688,19 @@ static int mediatek_dwmac_probe(struct platform_device *pdev)
|
||||
|
||||
ret = mediatek_dwmac_clks_config(priv_plat, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_remove_config_dt;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret) {
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
if (ret)
|
||||
goto err_drv_probe;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_drv_probe:
|
||||
mediatek_dwmac_clks_config(priv_plat, false);
|
||||
err_remove_config_dt:
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@ struct ipa_init_modem_driver_req {
|
||||
|
||||
/* The response to a IPA_QMI_INIT_DRIVER request begins with a standard
|
||||
* QMI response, but contains other information as well. Currently we
|
||||
* simply wait for the the INIT_DRIVER transaction to complete and
|
||||
* simply wait for the INIT_DRIVER transaction to complete and
|
||||
* ignore any other data that might be returned.
|
||||
*/
|
||||
struct ipa_init_modem_driver_rsp {
|
||||
|
||||
+21
-12
@@ -243,6 +243,7 @@ static struct macsec_cb *macsec_skb_cb(struct sk_buff *skb)
|
||||
#define DEFAULT_SEND_SCI true
|
||||
#define DEFAULT_ENCRYPT false
|
||||
#define DEFAULT_ENCODING_SA 0
|
||||
#define MACSEC_XPN_MAX_REPLAY_WINDOW (((1 << 30) - 1))
|
||||
|
||||
static bool send_sci(const struct macsec_secy *secy)
|
||||
{
|
||||
@@ -1697,7 +1698,7 @@ static bool validate_add_rxsa(struct nlattr **attrs)
|
||||
return false;
|
||||
|
||||
if (attrs[MACSEC_SA_ATTR_PN] &&
|
||||
*(u64 *)nla_data(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
return false;
|
||||
|
||||
if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
|
||||
@@ -1753,7 +1754,8 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
pn_len = secy->xpn ? MACSEC_XPN_PN_LEN : MACSEC_DEFAULT_PN_LEN;
|
||||
if (nla_len(tb_sa[MACSEC_SA_ATTR_PN]) != pn_len) {
|
||||
if (tb_sa[MACSEC_SA_ATTR_PN] &&
|
||||
nla_len(tb_sa[MACSEC_SA_ATTR_PN]) != pn_len) {
|
||||
pr_notice("macsec: nl: add_rxsa: bad pn length: %d != %d\n",
|
||||
nla_len(tb_sa[MACSEC_SA_ATTR_PN]), pn_len);
|
||||
rtnl_unlock();
|
||||
@@ -1769,7 +1771,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)
|
||||
if (nla_len(tb_sa[MACSEC_SA_ATTR_SALT]) != MACSEC_SALT_LEN) {
|
||||
pr_notice("macsec: nl: add_rxsa: bad salt length: %d != %d\n",
|
||||
nla_len(tb_sa[MACSEC_SA_ATTR_SALT]),
|
||||
MACSEC_SA_ATTR_SALT);
|
||||
MACSEC_SALT_LEN);
|
||||
rtnl_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1842,7 +1844,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
kfree(rx_sa);
|
||||
macsec_rxsa_put(rx_sa);
|
||||
rtnl_unlock();
|
||||
return err;
|
||||
}
|
||||
@@ -1939,7 +1941,7 @@ static bool validate_add_txsa(struct nlattr **attrs)
|
||||
if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN)
|
||||
return false;
|
||||
|
||||
if (nla_get_u32(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
if (nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
return false;
|
||||
|
||||
if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
|
||||
@@ -2011,7 +2013,7 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info)
|
||||
if (nla_len(tb_sa[MACSEC_SA_ATTR_SALT]) != MACSEC_SALT_LEN) {
|
||||
pr_notice("macsec: nl: add_txsa: bad salt length: %d != %d\n",
|
||||
nla_len(tb_sa[MACSEC_SA_ATTR_SALT]),
|
||||
MACSEC_SA_ATTR_SALT);
|
||||
MACSEC_SALT_LEN);
|
||||
rtnl_unlock();
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2085,7 +2087,7 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
cleanup:
|
||||
secy->operational = was_operational;
|
||||
kfree(tx_sa);
|
||||
macsec_txsa_put(tx_sa);
|
||||
rtnl_unlock();
|
||||
return err;
|
||||
}
|
||||
@@ -2293,7 +2295,7 @@ static bool validate_upd_sa(struct nlattr **attrs)
|
||||
if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN)
|
||||
return false;
|
||||
|
||||
if (attrs[MACSEC_SA_ATTR_PN] && nla_get_u32(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
if (attrs[MACSEC_SA_ATTR_PN] && nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
|
||||
return false;
|
||||
|
||||
if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
|
||||
@@ -3745,9 +3747,6 @@ static int macsec_changelink_common(struct net_device *dev,
|
||||
secy->operational = tx_sa && tx_sa->active;
|
||||
}
|
||||
|
||||
if (data[IFLA_MACSEC_WINDOW])
|
||||
secy->replay_window = nla_get_u32(data[IFLA_MACSEC_WINDOW]);
|
||||
|
||||
if (data[IFLA_MACSEC_ENCRYPT])
|
||||
tx_sc->encrypt = !!nla_get_u8(data[IFLA_MACSEC_ENCRYPT]);
|
||||
|
||||
@@ -3793,6 +3792,16 @@ static int macsec_changelink_common(struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
if (data[IFLA_MACSEC_WINDOW]) {
|
||||
secy->replay_window = nla_get_u32(data[IFLA_MACSEC_WINDOW]);
|
||||
|
||||
/* IEEE 802.1AEbw-2013 10.7.8 - maximum replay window
|
||||
* for XPN cipher suites */
|
||||
if (secy->xpn &&
|
||||
secy->replay_window > MACSEC_XPN_MAX_REPLAY_WINDOW)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3822,7 +3831,7 @@ static int macsec_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
|
||||
ret = macsec_changelink_common(dev, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto cleanup;
|
||||
|
||||
/* If h/w offloading is available, propagate to the device */
|
||||
if (macsec_is_offloaded(macsec)) {
|
||||
|
||||
@@ -896,7 +896,7 @@ static int xpcs_get_state_c37_sgmii(struct dw_xpcs *xpcs,
|
||||
*/
|
||||
ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS);
|
||||
if (ret < 0)
|
||||
return false;
|
||||
return ret;
|
||||
|
||||
if (ret & DW_VR_MII_C37_ANSGM_SP_LNKSTS) {
|
||||
int speed_value;
|
||||
|
||||
@@ -450,6 +450,7 @@ static int bcm5421_init(struct mii_phy* phy)
|
||||
int can_low_power = 1;
|
||||
if (np == NULL || of_get_property(np, "no-autolowpower", NULL))
|
||||
can_low_power = 0;
|
||||
of_node_put(np);
|
||||
if (can_low_power) {
|
||||
/* Enable automatic low-power */
|
||||
sungem_phy_write(phy, 0x1c, 0x9002);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user