mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'net-6.3-rc6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from wireless and can.
Current release - regressions:
- wifi: mac80211:
- fix potential null pointer dereference
- fix receiving mesh packets in forwarding=0 networks
- fix mesh forwarding
Current release - new code bugs:
- virtio/vsock: fix leaks due to missing skb owner
Previous releases - regressions:
- raw: fix NULL deref in raw_get_next().
- sctp: check send stream number after wait_for_sndbuf
- qrtr:
- fix a refcount bug in qrtr_recvmsg()
- do not do DEL_SERVER broadcast after DEL_CLIENT
- wifi: brcmfmac: fix SDIO suspend/resume regression
- wifi: mt76: fix use-after-free in fw features query.
- can: fix race between isotp_sendsmg() and isotp_release()
- eth: mtk_eth_soc: fix remaining throughput regression
- eth: ice: reset FDIR counter in FDIR init stage
Previous releases - always broken:
- core: don't let netpoll invoke NAPI if in xmit context
- icmp: guard against too small mtu
- ipv6: fix an uninit variable access bug in __ip6_make_skb()
- wifi: mac80211: fix the size calculation of
ieee80211_ie_len_eht_cap()
- can: fix poll() to not report false EPOLLOUT events
- eth: gve: secure enough bytes in the first TX desc for all TCP
pkts"
* tag 'net-6.3-rc6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (47 commits)
net: stmmac: check fwnode for phy device before scanning for phy
net: stmmac: Add queue reset into stmmac_xdp_open() function
selftests: net: rps_default_mask.sh: delete veth link specifically
net: fec: make use of MDIO C45 quirk
can: isotp: fix race between isotp_sendsmg() and isotp_release()
can: isotp: isotp_ops: fix poll() to not report false EPOLLOUT events
can: isotp: isotp_recvmsg(): use sock_recv_cmsgs() to get SOCK_RXQ_OVFL infos
can: j1939: j1939_tp_tx_dat_new(): fix out-of-bounds memory access
gve: Secure enough bytes in the first TX desc for all TCP pkts
netlink: annotate lockless accesses to nlk->max_recvmsg_len
ethtool: reset #lanes when lanes is omitted
ping: Fix potentail NULL deref for /proc/net/icmp.
raw: Fix NULL deref in raw_get_next().
ice: Reset FDIR counter in FDIR init stage
ice: fix wrong fallback logic for FDIR
net: stmmac: fix up RX flow hash indirection table when setting channels
net: ethernet: ti: am65-cpsw: Fix mdio cleanup in probe
wifi: mt76: ignore key disable commands
wifi: ath11k: reduce the MHI timeout to 20s
ipv6: Fix an uninit variable access bug in __ip6_make_skb()
...
This commit is contained in:
@@ -5601,7 +5601,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = {
|
||||
* .port_set_upstream_port method.
|
||||
*/
|
||||
.set_egress_port = mv88e6393x_set_egress_port,
|
||||
.watchdog_ops = &mv88e6390_watchdog_ops,
|
||||
.watchdog_ops = &mv88e6393x_watchdog_ops,
|
||||
.mgmt_rsvd2cpu = mv88e6393x_port_mgmt_rsvd2cpu,
|
||||
.pot_clear = mv88e6xxx_g2_pot_clear,
|
||||
.reset = mv88e6352_g1_reset,
|
||||
|
||||
@@ -943,6 +943,26 @@ const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops = {
|
||||
.irq_free = mv88e6390_watchdog_free,
|
||||
};
|
||||
|
||||
static int mv88e6393x_watchdog_action(struct mv88e6xxx_chip *chip, int irq)
|
||||
{
|
||||
mv88e6390_watchdog_action(chip, irq);
|
||||
|
||||
/* Fix for clearing the force WD event bit.
|
||||
* Unreleased erratum on mv88e6393x.
|
||||
*/
|
||||
mv88e6xxx_g2_write(chip, MV88E6390_G2_WDOG_CTL,
|
||||
MV88E6390_G2_WDOG_CTL_UPDATE |
|
||||
MV88E6390_G2_WDOG_CTL_PTR_EVENT);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
const struct mv88e6xxx_irq_ops mv88e6393x_watchdog_ops = {
|
||||
.irq_action = mv88e6393x_watchdog_action,
|
||||
.irq_setup = mv88e6390_watchdog_setup,
|
||||
.irq_free = mv88e6390_watchdog_free,
|
||||
};
|
||||
|
||||
static irqreturn_t mv88e6xxx_g2_watchdog_thread_fn(int irq, void *dev_id)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = dev_id;
|
||||
|
||||
@@ -369,6 +369,7 @@ int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops;
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6250_watchdog_ops;
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops;
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6393x_watchdog_ops;
|
||||
|
||||
extern const struct mv88e6xxx_avb_ops mv88e6165_avb_ops;
|
||||
extern const struct mv88e6xxx_avb_ops mv88e6352_avb_ops;
|
||||
|
||||
@@ -507,6 +507,11 @@ struct bufdesc_ex {
|
||||
/* i.MX6Q adds pm_qos support */
|
||||
#define FEC_QUIRK_HAS_PMQOS BIT(23)
|
||||
|
||||
/* Not all FEC hardware block MDIOs support accesses in C45 mode.
|
||||
* Older blocks in the ColdFire parts do not support it.
|
||||
*/
|
||||
#define FEC_QUIRK_HAS_MDIO_C45 BIT(24)
|
||||
|
||||
struct bufdesc_prop {
|
||||
int qid;
|
||||
/* Address of Rx and Tx buffers */
|
||||
|
||||
@@ -100,18 +100,19 @@ struct fec_devinfo {
|
||||
|
||||
static const struct fec_devinfo fec_imx25_info = {
|
||||
.quirks = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR |
|
||||
FEC_QUIRK_HAS_FRREG,
|
||||
FEC_QUIRK_HAS_FRREG | FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx27_info = {
|
||||
.quirks = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG,
|
||||
.quirks = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx28_info = {
|
||||
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME |
|
||||
FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC |
|
||||
FEC_QUIRK_HAS_FRREG | FEC_QUIRK_CLEAR_SETUP_MII |
|
||||
FEC_QUIRK_NO_HARD_RESET,
|
||||
FEC_QUIRK_NO_HARD_RESET | FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx6q_info = {
|
||||
@@ -119,11 +120,12 @@ static const struct fec_devinfo fec_imx6q_info = {
|
||||
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
|
||||
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358 |
|
||||
FEC_QUIRK_HAS_RACC | FEC_QUIRK_CLEAR_SETUP_MII |
|
||||
FEC_QUIRK_HAS_PMQOS,
|
||||
FEC_QUIRK_HAS_PMQOS | FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_mvf600_info = {
|
||||
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_RACC,
|
||||
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_RACC |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx6x_info = {
|
||||
@@ -132,7 +134,8 @@ static const struct fec_devinfo fec_imx6x_info = {
|
||||
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
|
||||
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
|
||||
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
|
||||
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES,
|
||||
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx6ul_info = {
|
||||
@@ -140,7 +143,8 @@ static const struct fec_devinfo fec_imx6ul_info = {
|
||||
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
|
||||
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR007885 |
|
||||
FEC_QUIRK_BUG_CAPTURE | FEC_QUIRK_HAS_RACC |
|
||||
FEC_QUIRK_HAS_COALESCE | FEC_QUIRK_CLEAR_SETUP_MII,
|
||||
FEC_QUIRK_HAS_COALESCE | FEC_QUIRK_CLEAR_SETUP_MII |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx8mq_info = {
|
||||
@@ -150,7 +154,8 @@ static const struct fec_devinfo fec_imx8mq_info = {
|
||||
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
|
||||
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
|
||||
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
|
||||
FEC_QUIRK_HAS_EEE | FEC_QUIRK_WAKEUP_FROM_INT2,
|
||||
FEC_QUIRK_HAS_EEE | FEC_QUIRK_WAKEUP_FROM_INT2 |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_imx8qm_info = {
|
||||
@@ -160,14 +165,15 @@ static const struct fec_devinfo fec_imx8qm_info = {
|
||||
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
|
||||
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
|
||||
FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES |
|
||||
FEC_QUIRK_DELAYED_CLKS_SUPPORT,
|
||||
FEC_QUIRK_DELAYED_CLKS_SUPPORT | FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static const struct fec_devinfo fec_s32v234_info = {
|
||||
.quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
|
||||
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
|
||||
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
|
||||
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE,
|
||||
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
|
||||
FEC_QUIRK_HAS_MDIO_C45,
|
||||
};
|
||||
|
||||
static struct platform_device_id fec_devtype[] = {
|
||||
@@ -2434,8 +2440,10 @@ static int fec_enet_mii_init(struct platform_device *pdev)
|
||||
fep->mii_bus->name = "fec_enet_mii_bus";
|
||||
fep->mii_bus->read = fec_enet_mdio_read_c22;
|
||||
fep->mii_bus->write = fec_enet_mdio_write_c22;
|
||||
fep->mii_bus->read_c45 = fec_enet_mdio_read_c45;
|
||||
fep->mii_bus->write_c45 = fec_enet_mdio_write_c45;
|
||||
if (fep->quirks & FEC_QUIRK_HAS_MDIO_C45) {
|
||||
fep->mii_bus->read_c45 = fec_enet_mdio_read_c45;
|
||||
fep->mii_bus->write_c45 = fec_enet_mdio_write_c45;
|
||||
}
|
||||
snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
|
||||
pdev->name, fep->dev_id + 1);
|
||||
fep->mii_bus->priv = fep;
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
|
||||
#define GVE_RX_BUFFER_SIZE_DQO 2048
|
||||
|
||||
#define GVE_GQ_TX_MIN_PKT_DESC_BYTES 182
|
||||
|
||||
/* Each slot in the desc ring has a 1:1 mapping to a slot in the data ring */
|
||||
struct gve_rx_desc_queue {
|
||||
struct gve_rx_desc *desc_ring; /* the descriptor ring */
|
||||
|
||||
@@ -284,8 +284,8 @@ static inline int gve_skb_fifo_bytes_required(struct gve_tx_ring *tx,
|
||||
int bytes;
|
||||
int hlen;
|
||||
|
||||
hlen = skb_is_gso(skb) ? skb_checksum_start_offset(skb) +
|
||||
tcp_hdrlen(skb) : skb_headlen(skb);
|
||||
hlen = skb_is_gso(skb) ? skb_checksum_start_offset(skb) + tcp_hdrlen(skb) :
|
||||
min_t(int, GVE_GQ_TX_MIN_PKT_DESC_BYTES, skb->len);
|
||||
|
||||
pad_bytes = gve_tx_fifo_pad_alloc_one_frag(&tx->tx_fifo,
|
||||
hlen);
|
||||
@@ -454,13 +454,11 @@ static int gve_tx_add_skb_copy(struct gve_priv *priv, struct gve_tx_ring *tx, st
|
||||
pkt_desc = &tx->desc[idx];
|
||||
|
||||
l4_hdr_offset = skb_checksum_start_offset(skb);
|
||||
/* If the skb is gso, then we want the tcp header in the first segment
|
||||
* otherwise we want the linear portion of the skb (which will contain
|
||||
* the checksum because skb->csum_start and skb->csum_offset are given
|
||||
* relative to skb->head) in the first segment.
|
||||
/* If the skb is gso, then we want the tcp header alone in the first segment
|
||||
* otherwise we want the minimum required by the gVNIC spec.
|
||||
*/
|
||||
hlen = is_gso ? l4_hdr_offset + tcp_hdrlen(skb) :
|
||||
skb_headlen(skb);
|
||||
min_t(int, GVE_GQ_TX_MIN_PKT_DESC_BYTES, skb->len);
|
||||
|
||||
info->skb = skb;
|
||||
/* We don't want to split the header, so if necessary, pad to the end
|
||||
|
||||
@@ -541,6 +541,21 @@ static void ice_vc_fdir_rem_prof_all(struct ice_vf *vf)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_vc_fdir_reset_cnt_all - reset all FDIR counters for this VF FDIR
|
||||
* @fdir: pointer to the VF FDIR structure
|
||||
*/
|
||||
static void ice_vc_fdir_reset_cnt_all(struct ice_vf_fdir *fdir)
|
||||
{
|
||||
enum ice_fltr_ptype flow;
|
||||
|
||||
for (flow = ICE_FLTR_PTYPE_NONF_NONE;
|
||||
flow < ICE_FLTR_PTYPE_MAX; flow++) {
|
||||
fdir->fdir_fltr_cnt[flow][0] = 0;
|
||||
fdir->fdir_fltr_cnt[flow][1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_vc_fdir_has_prof_conflict
|
||||
* @vf: pointer to the VF structure
|
||||
@@ -1871,7 +1886,7 @@ int ice_vc_add_fdir_fltr(struct ice_vf *vf, u8 *msg)
|
||||
v_ret = VIRTCHNL_STATUS_SUCCESS;
|
||||
stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE;
|
||||
dev_dbg(dev, "VF %d: set FDIR context failed\n", vf->vf_id);
|
||||
goto err_free_conf;
|
||||
goto err_rem_entry;
|
||||
}
|
||||
|
||||
ret = ice_vc_fdir_write_fltr(vf, conf, true, is_tun);
|
||||
@@ -1880,15 +1895,16 @@ int ice_vc_add_fdir_fltr(struct ice_vf *vf, u8 *msg)
|
||||
stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE;
|
||||
dev_err(dev, "VF %d: writing FDIR rule failed, ret:%d\n",
|
||||
vf->vf_id, ret);
|
||||
goto err_rem_entry;
|
||||
goto err_clr_irq;
|
||||
}
|
||||
|
||||
exit:
|
||||
kfree(stat);
|
||||
return ret;
|
||||
|
||||
err_rem_entry:
|
||||
err_clr_irq:
|
||||
ice_vc_fdir_clear_irq_ctx(vf);
|
||||
err_rem_entry:
|
||||
ice_vc_fdir_remove_entry(vf, conf, conf->flow_id);
|
||||
err_free_conf:
|
||||
devm_kfree(dev, conf);
|
||||
@@ -1997,6 +2013,7 @@ void ice_vf_fdir_init(struct ice_vf *vf)
|
||||
spin_lock_init(&fdir->ctx_lock);
|
||||
fdir->ctx_irq.flags = 0;
|
||||
fdir->ctx_done.flags = 0;
|
||||
ice_vc_fdir_reset_cnt_all(fdir);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -753,6 +753,7 @@ static void mtk_mac_link_up(struct phylink_config *config,
|
||||
MAC_MCR_FORCE_RX_FC);
|
||||
|
||||
/* Configure speed */
|
||||
mac->speed = speed;
|
||||
switch (speed) {
|
||||
case SPEED_2500:
|
||||
case SPEED_1000:
|
||||
@@ -3235,6 +3236,9 @@ found:
|
||||
if (dp->index >= MTK_QDMA_NUM_QUEUES)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (mac->speed > 0 && mac->speed <= s.base.speed)
|
||||
s.base.speed = 0;
|
||||
|
||||
mtk_set_queue_speed(eth, dp->index + 3, s.base.speed);
|
||||
|
||||
return NOTIFY_DONE;
|
||||
|
||||
@@ -251,7 +251,6 @@ static void intel_speed_mode_2500(struct net_device *ndev, void *intel_data)
|
||||
priv->plat->mdio_bus_data->xpcs_an_inband = false;
|
||||
} else {
|
||||
priv->plat->max_speed = 1000;
|
||||
priv->plat->mdio_bus_data->xpcs_an_inband = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1134,20 +1134,26 @@ static void stmmac_check_pcs_mode(struct stmmac_priv *priv)
|
||||
static int stmmac_init_phy(struct net_device *dev)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
struct fwnode_handle *phy_fwnode;
|
||||
struct fwnode_handle *fwnode;
|
||||
int ret;
|
||||
|
||||
if (!phylink_expects_phy(priv->phylink))
|
||||
return 0;
|
||||
|
||||
fwnode = of_fwnode_handle(priv->plat->phylink_node);
|
||||
if (!fwnode)
|
||||
fwnode = dev_fwnode(priv->device);
|
||||
|
||||
if (fwnode)
|
||||
ret = phylink_fwnode_phy_connect(priv->phylink, fwnode, 0);
|
||||
phy_fwnode = fwnode_get_phy_node(fwnode);
|
||||
else
|
||||
phy_fwnode = NULL;
|
||||
|
||||
/* Some DT bindings do not set-up the PHY handle. Let's try to
|
||||
* manually parse it
|
||||
*/
|
||||
if (!fwnode || ret) {
|
||||
if (!phy_fwnode || IS_ERR(phy_fwnode)) {
|
||||
int addr = priv->plat->phy_addr;
|
||||
struct phy_device *phydev;
|
||||
|
||||
@@ -1163,6 +1169,9 @@ static int stmmac_init_phy(struct net_device *dev)
|
||||
}
|
||||
|
||||
ret = phylink_connect_phy(priv->phylink, phydev);
|
||||
} else {
|
||||
fwnode_handle_put(phy_fwnode);
|
||||
ret = phylink_fwnode_phy_connect(priv->phylink, fwnode, 0);
|
||||
}
|
||||
|
||||
if (!priv->plat->pmt) {
|
||||
@@ -6622,6 +6631,8 @@ int stmmac_xdp_open(struct net_device *dev)
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
stmmac_reset_queues_param(priv);
|
||||
|
||||
/* DMA CSR Channel configuration */
|
||||
for (chan = 0; chan < dma_csr_ch; chan++) {
|
||||
stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
|
||||
@@ -6948,7 +6959,7 @@ static void stmmac_napi_del(struct net_device *dev)
|
||||
int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
int ret = 0;
|
||||
int ret = 0, i;
|
||||
|
||||
if (netif_running(dev))
|
||||
stmmac_release(dev);
|
||||
@@ -6957,6 +6968,10 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt)
|
||||
|
||||
priv->plat->rx_queues_to_use = rx_cnt;
|
||||
priv->plat->tx_queues_to_use = tx_cnt;
|
||||
if (!netif_is_rxfh_configured(dev))
|
||||
for (i = 0; i < ARRAY_SIZE(priv->rss.table); i++)
|
||||
priv->rss.table[i] = ethtool_rxfh_indir_default(i,
|
||||
rx_cnt);
|
||||
|
||||
stmmac_napi_add(dev);
|
||||
|
||||
|
||||
@@ -2926,7 +2926,8 @@ err_free_phylink:
|
||||
am65_cpsw_nuss_phylink_cleanup(common);
|
||||
am65_cpts_release(common->cpts);
|
||||
err_of_clear:
|
||||
of_platform_device_destroy(common->mdio_dev, NULL);
|
||||
if (common->mdio_dev)
|
||||
of_platform_device_destroy(common->mdio_dev, NULL);
|
||||
err_pm_clear:
|
||||
pm_runtime_put_sync(dev);
|
||||
pm_runtime_disable(dev);
|
||||
@@ -2956,7 +2957,8 @@ static int am65_cpsw_nuss_remove(struct platform_device *pdev)
|
||||
am65_cpts_release(common->cpts);
|
||||
am65_cpsw_disable_serdes_phy(common);
|
||||
|
||||
of_platform_device_destroy(common->mdio_dev, NULL);
|
||||
if (common->mdio_dev)
|
||||
of_platform_device_destroy(common->mdio_dev, NULL);
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
@@ -1586,6 +1586,25 @@ void phylink_destroy(struct phylink *pl)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_destroy);
|
||||
|
||||
/**
|
||||
* phylink_expects_phy() - Determine if phylink expects a phy to be attached
|
||||
* @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
*
|
||||
* When using fixed-link mode, or in-band mode with 1000base-X or 2500base-X,
|
||||
* no PHY is needed.
|
||||
*
|
||||
* Returns true if phylink will be expecting a PHY.
|
||||
*/
|
||||
bool phylink_expects_phy(struct phylink *pl)
|
||||
{
|
||||
if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
|
||||
(pl->cfg_link_an_mode == MLO_AN_INBAND &&
|
||||
phy_interface_mode_is_8023z(pl->link_config.interface)))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_expects_phy);
|
||||
|
||||
static void phylink_phy_change(struct phy_device *phydev, bool up)
|
||||
{
|
||||
struct phylink *pl = phydev->phylink;
|
||||
|
||||
@@ -387,6 +387,10 @@ static const struct sfp_quirk sfp_quirks[] = {
|
||||
|
||||
SFP_QUIRK_F("HALNy", "HL-GSFP", sfp_fixup_halny_gsfp),
|
||||
|
||||
// HG MXPD-483II-F 2.5G supports 2500Base-X, but incorrectly reports
|
||||
// 2600MBd in their EERPOM
|
||||
SFP_QUIRK_M("HG GENUINE", "MXPD-483II", sfp_quirk_2500basex),
|
||||
|
||||
// Huawei MA5671A can operate at 2500base-X, but report 1.2GBd NRZ in
|
||||
// their EEPROM
|
||||
SFP_QUIRK("HUAWEI", "MA5671A", sfp_quirk_2500basex,
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "pci.h"
|
||||
#include "pcic.h"
|
||||
|
||||
#define MHI_TIMEOUT_DEFAULT_MS 90000
|
||||
#define MHI_TIMEOUT_DEFAULT_MS 20000
|
||||
#define RDDM_DUMP_SIZE 0x420000
|
||||
|
||||
static struct mhi_channel_config ath11k_mhi_channels_qca6390[] = {
|
||||
|
||||
@@ -994,15 +994,34 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
|
||||
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
|
||||
|
||||
|
||||
static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev,
|
||||
int val)
|
||||
static void brcmf_sdiod_acpi_save_power_manageable(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_ACPI)
|
||||
struct acpi_device *adev;
|
||||
|
||||
adev = ACPI_COMPANION(dev);
|
||||
adev = ACPI_COMPANION(&sdiodev->func1->dev);
|
||||
if (adev)
|
||||
adev->flags.power_manageable = 0;
|
||||
sdiodev->func1_power_manageable = adev->flags.power_manageable;
|
||||
|
||||
adev = ACPI_COMPANION(&sdiodev->func2->dev);
|
||||
if (adev)
|
||||
sdiodev->func2_power_manageable = adev->flags.power_manageable;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void brcmf_sdiod_acpi_set_power_manageable(struct brcmf_sdio_dev *sdiodev,
|
||||
int enable)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_ACPI)
|
||||
struct acpi_device *adev;
|
||||
|
||||
adev = ACPI_COMPANION(&sdiodev->func1->dev);
|
||||
if (adev)
|
||||
adev->flags.power_manageable = enable ? sdiodev->func1_power_manageable : 0;
|
||||
|
||||
adev = ACPI_COMPANION(&sdiodev->func2->dev);
|
||||
if (adev)
|
||||
adev->flags.power_manageable = enable ? sdiodev->func2_power_manageable : 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1012,7 +1031,6 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
||||
int err;
|
||||
struct brcmf_sdio_dev *sdiodev;
|
||||
struct brcmf_bus *bus_if;
|
||||
struct device *dev;
|
||||
|
||||
brcmf_dbg(SDIO, "Enter\n");
|
||||
brcmf_dbg(SDIO, "Class=%x\n", func->class);
|
||||
@@ -1020,14 +1038,9 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
||||
brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
|
||||
brcmf_dbg(SDIO, "Function#: %d\n", func->num);
|
||||
|
||||
dev = &func->dev;
|
||||
|
||||
/* Set MMC_QUIRK_LENIENT_FN0 for this card */
|
||||
func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
|
||||
|
||||
/* prohibit ACPI power management for this device */
|
||||
brcmf_sdiod_acpi_set_power_manageable(dev, 0);
|
||||
|
||||
/* Consume func num 1 but dont do anything with it. */
|
||||
if (func->num == 1)
|
||||
return 0;
|
||||
@@ -1059,6 +1072,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
||||
dev_set_drvdata(&sdiodev->func1->dev, bus_if);
|
||||
sdiodev->dev = &sdiodev->func1->dev;
|
||||
|
||||
brcmf_sdiod_acpi_save_power_manageable(sdiodev);
|
||||
brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
|
||||
|
||||
brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n");
|
||||
@@ -1124,6 +1138,8 @@ void brcmf_sdio_wowl_config(struct device *dev, bool enabled)
|
||||
|
||||
if (sdiodev->settings->bus.sdio.oob_irq_supported ||
|
||||
pm_caps & MMC_PM_WAKE_SDIO_IRQ) {
|
||||
/* Stop ACPI from turning off the device when wowl is enabled */
|
||||
brcmf_sdiod_acpi_set_power_manageable(sdiodev, !enabled);
|
||||
sdiodev->wowl_enabled = enabled;
|
||||
brcmf_dbg(SDIO, "Configuring WOWL, enabled=%d\n", enabled);
|
||||
return;
|
||||
|
||||
@@ -188,6 +188,8 @@ struct brcmf_sdio_dev {
|
||||
char nvram_name[BRCMF_FW_NAME_LEN];
|
||||
char clm_name[BRCMF_FW_NAME_LEN];
|
||||
bool wowl_enabled;
|
||||
bool func1_power_manageable;
|
||||
bool func2_power_manageable;
|
||||
enum brcmf_sdiod_state state;
|
||||
struct brcmf_sdiod_freezer *freezer;
|
||||
const struct firmware *clm_fw;
|
||||
|
||||
@@ -512,15 +512,15 @@ mt7603_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (cmd == SET_KEY) {
|
||||
key->hw_key_idx = wcid->idx;
|
||||
wcid->hw_key_idx = idx;
|
||||
} else {
|
||||
if (cmd != SET_KEY) {
|
||||
if (idx == wcid->hw_key_idx)
|
||||
wcid->hw_key_idx = -1;
|
||||
|
||||
key = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
key->hw_key_idx = wcid->idx;
|
||||
wcid->hw_key_idx = idx;
|
||||
mt76_wcid_key_setup(&dev->mt76, wcid, key);
|
||||
|
||||
return mt7603_wtbl_set_key(dev, wcid->idx, key);
|
||||
|
||||
@@ -1193,8 +1193,7 @@ EXPORT_SYMBOL_GPL(mt7615_mac_enable_rtscts);
|
||||
static int
|
||||
mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
struct ieee80211_key_conf *key,
|
||||
enum mt76_cipher_type cipher, u16 cipher_mask,
|
||||
enum set_key_cmd cmd)
|
||||
enum mt76_cipher_type cipher, u16 cipher_mask)
|
||||
{
|
||||
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx) + 30 * 4;
|
||||
u8 data[32] = {};
|
||||
@@ -1203,27 +1202,18 @@ mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
return -EINVAL;
|
||||
|
||||
mt76_rr_copy(dev, addr, data, sizeof(data));
|
||||
if (cmd == SET_KEY) {
|
||||
if (cipher == MT_CIPHER_TKIP) {
|
||||
/* Rx/Tx MIC keys are swapped */
|
||||
memcpy(data, key->key, 16);
|
||||
memcpy(data + 16, key->key + 24, 8);
|
||||
memcpy(data + 24, key->key + 16, 8);
|
||||
} else {
|
||||
if (cipher_mask == BIT(cipher))
|
||||
memcpy(data, key->key, key->keylen);
|
||||
else if (cipher != MT_CIPHER_BIP_CMAC_128)
|
||||
memcpy(data, key->key, 16);
|
||||
if (cipher == MT_CIPHER_BIP_CMAC_128)
|
||||
memcpy(data + 16, key->key, 16);
|
||||
}
|
||||
if (cipher == MT_CIPHER_TKIP) {
|
||||
/* Rx/Tx MIC keys are swapped */
|
||||
memcpy(data, key->key, 16);
|
||||
memcpy(data + 16, key->key + 24, 8);
|
||||
memcpy(data + 24, key->key + 16, 8);
|
||||
} else {
|
||||
if (cipher_mask == BIT(cipher))
|
||||
memcpy(data, key->key, key->keylen);
|
||||
else if (cipher != MT_CIPHER_BIP_CMAC_128)
|
||||
memcpy(data, key->key, 16);
|
||||
if (cipher == MT_CIPHER_BIP_CMAC_128)
|
||||
memset(data + 16, 0, 16);
|
||||
else if (cipher_mask)
|
||||
memset(data, 0, 16);
|
||||
if (!cipher_mask)
|
||||
memset(data, 0, sizeof(data));
|
||||
memcpy(data + 16, key->key, 16);
|
||||
}
|
||||
|
||||
mt76_wr_copy(dev, addr, data, sizeof(data));
|
||||
@@ -1234,7 +1224,7 @@ mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
static int
|
||||
mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
enum mt76_cipher_type cipher, u16 cipher_mask,
|
||||
int keyidx, enum set_key_cmd cmd)
|
||||
int keyidx)
|
||||
{
|
||||
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx), w0, w1;
|
||||
|
||||
@@ -1253,9 +1243,7 @@ mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
else
|
||||
w0 &= ~MT_WTBL_W0_RX_IK_VALID;
|
||||
|
||||
if (cmd == SET_KEY &&
|
||||
(cipher != MT_CIPHER_BIP_CMAC_128 ||
|
||||
cipher_mask == BIT(cipher))) {
|
||||
if (cipher != MT_CIPHER_BIP_CMAC_128 || cipher_mask == BIT(cipher)) {
|
||||
w0 &= ~MT_WTBL_W0_KEY_IDX;
|
||||
w0 |= FIELD_PREP(MT_WTBL_W0_KEY_IDX, keyidx);
|
||||
}
|
||||
@@ -1272,19 +1260,10 @@ mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
|
||||
static void
|
||||
mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
enum mt76_cipher_type cipher, u16 cipher_mask,
|
||||
enum set_key_cmd cmd)
|
||||
enum mt76_cipher_type cipher, u16 cipher_mask)
|
||||
{
|
||||
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx);
|
||||
|
||||
if (!cipher_mask) {
|
||||
mt76_clear(dev, addr + 2 * 4, MT_WTBL_W2_KEY_TYPE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd != SET_KEY)
|
||||
return;
|
||||
|
||||
if (cipher == MT_CIPHER_BIP_CMAC_128 &&
|
||||
cipher_mask & ~BIT(MT_CIPHER_BIP_CMAC_128))
|
||||
return;
|
||||
@@ -1295,8 +1274,7 @@ mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
|
||||
int __mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
|
||||
struct mt76_wcid *wcid,
|
||||
struct ieee80211_key_conf *key,
|
||||
enum set_key_cmd cmd)
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
enum mt76_cipher_type cipher;
|
||||
u16 cipher_mask = wcid->cipher;
|
||||
@@ -1306,19 +1284,14 @@ int __mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
|
||||
if (cipher == MT_CIPHER_NONE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (cmd == SET_KEY)
|
||||
cipher_mask |= BIT(cipher);
|
||||
else
|
||||
cipher_mask &= ~BIT(cipher);
|
||||
|
||||
mt7615_mac_wtbl_update_cipher(dev, wcid, cipher, cipher_mask, cmd);
|
||||
err = mt7615_mac_wtbl_update_key(dev, wcid, key, cipher, cipher_mask,
|
||||
cmd);
|
||||
cipher_mask |= BIT(cipher);
|
||||
mt7615_mac_wtbl_update_cipher(dev, wcid, cipher, cipher_mask);
|
||||
err = mt7615_mac_wtbl_update_key(dev, wcid, key, cipher, cipher_mask);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = mt7615_mac_wtbl_update_pk(dev, wcid, cipher, cipher_mask,
|
||||
key->keyidx, cmd);
|
||||
key->keyidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -1329,13 +1302,12 @@ int __mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
|
||||
|
||||
int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
|
||||
struct mt76_wcid *wcid,
|
||||
struct ieee80211_key_conf *key,
|
||||
enum set_key_cmd cmd)
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
int err;
|
||||
|
||||
spin_lock_bh(&dev->mt76.lock);
|
||||
err = __mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
|
||||
err = __mt7615_mac_wtbl_set_key(dev, wcid, key);
|
||||
spin_unlock_bh(&dev->mt76.lock);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -391,18 +391,17 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
|
||||
if (cmd == SET_KEY)
|
||||
*wcid_keyidx = idx;
|
||||
else if (idx == *wcid_keyidx)
|
||||
*wcid_keyidx = -1;
|
||||
else
|
||||
else {
|
||||
if (idx == *wcid_keyidx)
|
||||
*wcid_keyidx = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mt76_wcid_key_setup(&dev->mt76, wcid,
|
||||
cmd == SET_KEY ? key : NULL);
|
||||
|
||||
mt76_wcid_key_setup(&dev->mt76, wcid, key);
|
||||
if (mt76_is_mmio(&dev->mt76))
|
||||
err = mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
|
||||
err = mt7615_mac_wtbl_set_key(dev, wcid, key);
|
||||
else
|
||||
err = __mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
|
||||
err = __mt7615_mac_wtbl_set_key(dev, wcid, key);
|
||||
|
||||
out:
|
||||
mt7615_mutex_release(dev);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user