We have been notified of a TLS regression that will be addressed
via the MM tree.
Including fixes from bluetooth and wireless.
Current release - new code bugs:
- wifi: nl80211: disable multi-link reconfiguration
Previous releases - regressions:
- gso: fix ownership in __udp_gso_segment
- wifi: iwlwifi:
- fix A-MSDU TSO preparation
- free pages allocated when failing to build A-MSDU
- ipv6: fix dst ref loop in ila lwtunnel
- mptcp: fix 'scheduling while atomic' in mptcp_pm_nl_append_new_local_addr
- bluetooth: add check for mgmt_alloc_skb() in mgmt_device_connected()
- ethtool: allow NULL nlattrs when getting a phy_device
- eth: be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
Previous releases - always broken:
- core: support TCP GSO case for a few missing flags
- wifi: mac80211:
- fix vendor-specific inheritance
- cleanup sta TXQs on flush
- llc: do not use skb_get() before dev_queue_xmit()
- eth: ipa: nable checksum for IPA_ENDPOINT_AP_MODEM_{RX,TX} for v4.7
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-----BEGIN PGP SIGNATURE-----
iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmfJju8SHHBhYmVuaUBy
ZWRoYXQuY29tAAoJECkkeY3MjxOkMHwP/3yeeCLI3+IFHxUowCQfltw65hxGwzK6
2aODAtfVDZR1OervdE4iJld09cfIoopQc1Ej3hMUZ/Bsxil2ag3tQnjB4rGXQNI1
TANp+nNfuGEpN/yeoNkymzXuMLI/RB27BByoIZdY5ArvFK3Q7pniaRMBXWkWfC5I
2oBqZnpPwqtviTWXYa3n86oh5IY1C1n3i6Sqv6cCuu0g8ZVmgLkcDul2euNQ5ZnC
x8p3N4EM8NYNRYFiSSU1F/hBpntfMwYA7UuAROPAY7x/11nCinoewXxAIkATw0GN
LbDwvMqqaMykZNjM7YJouor8yUZYQdDScTQuWRqYV80xe5VUHksVZVxzMqfIS3bG
nDuZT/buwO+wiHrW3SUa5QrVaun8HkSuVUKF8pxu0veTRDDgcGnPGZYt9v6uKJ10
7mZqWUcjD+Hw+Tk+aLVGlaaYuIck4htOAOd/bD+RI/xEzCNjGyvhEZLTYMNA5WNR
S9iapt+lyjvImAIAOn9C55X4x1cJ1g6qaYeRc/NXLh+XkVFG3GXPzvl07wuD7zt4
CAM37W7zT2gyi8JgTKs2uWScVFgTQfXDW4LdGMMQrdApVk5ufPtcXWru5t3+I17k
dyO2NbvtdaSso2LTp/RXFv7AQXz+qzX0NAi6sToijH26tiXHmYwyH6Scb8CwIQXc
EClot5F+R7W0
=QAYF
-----END PGP SIGNATURE-----
Merge tag 'net-6.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni:
"Including fixes from bluetooth and wireless.
Current release - new code bugs:
- wifi: nl80211: disable multi-link reconfiguration
Previous releases - regressions:
- gso: fix ownership in __udp_gso_segment
- wifi: iwlwifi:
- fix A-MSDU TSO preparation
- free pages allocated when failing to build A-MSDU
- ipv6: fix dst ref loop in ila lwtunnel
- mptcp: fix 'scheduling while atomic' in
mptcp_pm_nl_append_new_local_addr
- bluetooth: add check for mgmt_alloc_skb() in
mgmt_device_connected()
- ethtool: allow NULL nlattrs when getting a phy_device
- eth: be2net: fix sleeping while atomic bugs in
be_ndo_bridge_getlink
Previous releases - always broken:
- core: support TCP GSO case for a few missing flags
- wifi: mac80211:
- fix vendor-specific inheritance
- cleanup sta TXQs on flush
- llc: do not use skb_get() before dev_queue_xmit()
- eth: ipa: nable checksum for IPA_ENDPOINT_AP_MODEM_{RX,TX}
for v4.7"
* tag 'net-6.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (41 commits)
net: ipv6: fix missing dst ref drop in ila lwtunnel
net: ipv6: fix dst ref loop in ila lwtunnel
mctp i3c: handle NULL header address
net: dsa: mt7530: Fix traffic flooding for MMIO devices
net-timestamp: support TCP GSO case for a few missing flags
vlan: enforce underlying device type
mptcp: fix 'scheduling while atomic' in mptcp_pm_nl_append_new_local_addr
net: ethtool: netlink: Allow NULL nlattrs when getting a phy_device
ppp: Fix KMSAN uninit-value warning with bpf
net: ipa: Enable checksum for IPA_ENDPOINT_AP_MODEM_{RX,TX} for v4.7
net: ipa: Fix QSB data for v4.7
net: ipa: Fix v4.7 resource group names
net: hns3: make sure ptp clock is unregister and freed if hclge_ptp_get_cycle returns an error
wifi: nl80211: disable multi-link reconfiguration
net: dsa: rtl8366rb: don't prompt users for LED control
be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
llc: do not use skb_get() before dev_queue_xmit()
wifi: cfg80211: regulatory: improve invalid hints checking
caif_virtio: fix wrong pointer check in cfv_probe()
net: gso: fix ownership in __udp_gso_segment
...
pull/1167/head
commit
f315296c92
1
.mailmap
1
.mailmap
|
|
@ -88,7 +88,6 @@ Antonio Quartulli <antonio@mandelbit.com> <antonio@open-mesh.com>
|
|||
Antonio Quartulli <antonio@mandelbit.com> <antonio.quartulli@open-mesh.com>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <ordex@autistici.org>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <ordex@ritirata.org>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <antonio@openvpn.net>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <a@unstable.cc>
|
||||
Anup Patel <anup@brainfault.org> <anup.patel@wdc.com>
|
||||
Archit Taneja <archit@ti.com>
|
||||
|
|
|
|||
|
|
@ -3644,6 +3644,7 @@ static ssize_t force_poll_sync_write(struct file *file,
|
|||
}
|
||||
|
||||
static const struct file_operations force_poll_sync_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = simple_open,
|
||||
.read = force_poll_sync_read,
|
||||
.write = force_poll_sync_write,
|
||||
|
|
|
|||
|
|
@ -745,7 +745,7 @@ err:
|
|||
|
||||
if (cfv->vr_rx)
|
||||
vdev->vringh_config->del_vrhs(cfv->vdev);
|
||||
if (cfv->vdev)
|
||||
if (cfv->vq_tx)
|
||||
vdev->config->del_vqs(cfv->vdev);
|
||||
free_netdev(netdev);
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -2591,7 +2591,8 @@ mt7531_setup_common(struct dsa_switch *ds)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
/* Setup VLAN ID 0 for VLAN-unaware bridges */
|
||||
return mt7530_setup_vlan0(priv);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -2687,11 +2688,6 @@ mt7531_setup(struct dsa_switch *ds)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Setup VLAN ID 0 for VLAN-unaware bridges */
|
||||
ret = mt7530_setup_vlan0(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ds->assisted_learning_on_cpu_port = true;
|
||||
ds->mtu_enforcement_ingress = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ config NET_DSA_REALTEK_RTL8366RB
|
|||
Select to enable support for Realtek RTL8366RB.
|
||||
|
||||
config NET_DSA_REALTEK_RTL8366RB_LEDS
|
||||
bool "Support RTL8366RB LED control"
|
||||
bool
|
||||
depends on (LEDS_CLASS=y || LEDS_CLASS=NET_DSA_REALTEK_RTL8366RB)
|
||||
depends on NET_DSA_REALTEK_RTL8366RB
|
||||
default NET_DSA_REALTEK_RTL8366RB
|
||||
|
|
|
|||
|
|
@ -562,7 +562,7 @@ struct be_adapter {
|
|||
struct be_dma_mem mbox_mem_alloced;
|
||||
|
||||
struct be_mcc_obj mcc_obj;
|
||||
struct mutex mcc_lock; /* For serializing mcc cmds to BE card */
|
||||
spinlock_t mcc_lock; /* For serializing mcc cmds to BE card */
|
||||
spinlock_t mcc_cq_lock;
|
||||
|
||||
u16 cfg_num_rx_irqs; /* configured via set-channels */
|
||||
|
|
|
|||
|
|
@ -575,7 +575,7 @@ int be_process_mcc(struct be_adapter *adapter)
|
|||
/* Wait till no more pending mcc requests are present */
|
||||
static int be_mcc_wait_compl(struct be_adapter *adapter)
|
||||
{
|
||||
#define mcc_timeout 12000 /* 12s timeout */
|
||||
#define mcc_timeout 120000 /* 12s timeout */
|
||||
int i, status = 0;
|
||||
struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
|
||||
|
||||
|
|
@ -589,7 +589,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
|
|||
|
||||
if (atomic_read(&mcc_obj->q.used) == 0)
|
||||
break;
|
||||
usleep_range(500, 1000);
|
||||
udelay(100);
|
||||
}
|
||||
if (i == mcc_timeout) {
|
||||
dev_err(&adapter->pdev->dev, "FW not responding\n");
|
||||
|
|
@ -866,7 +866,7 @@ static bool use_mcc(struct be_adapter *adapter)
|
|||
static int be_cmd_lock(struct be_adapter *adapter)
|
||||
{
|
||||
if (use_mcc(adapter)) {
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
return 0;
|
||||
} else {
|
||||
return mutex_lock_interruptible(&adapter->mbox_lock);
|
||||
|
|
@ -877,7 +877,7 @@ static int be_cmd_lock(struct be_adapter *adapter)
|
|||
static void be_cmd_unlock(struct be_adapter *adapter)
|
||||
{
|
||||
if (use_mcc(adapter))
|
||||
return mutex_unlock(&adapter->mcc_lock);
|
||||
return spin_unlock_bh(&adapter->mcc_lock);
|
||||
else
|
||||
return mutex_unlock(&adapter->mbox_lock);
|
||||
}
|
||||
|
|
@ -1047,7 +1047,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
|
|||
struct be_cmd_req_mac_query *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1076,7 +1076,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1088,7 +1088,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
|
|||
struct be_cmd_req_pmac_add *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1113,7 +1113,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST)
|
||||
status = -EPERM;
|
||||
|
|
@ -1131,7 +1131,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
|
|||
if (pmac_id == -1)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1151,7 +1151,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1414,7 +1414,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
|
|||
struct be_dma_mem *q_mem = &rxq->dma_mem;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1444,7 +1444,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1508,7 +1508,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
|
|||
struct be_cmd_req_q_destroy *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1525,7 +1525,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
|
|||
q->created = false;
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1593,7 +1593,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
|
|||
struct be_cmd_req_hdr *hdr;
|
||||
int status = 0;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1621,7 +1621,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
|
|||
adapter->stats_cmd_sent = true;
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1637,7 +1637,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
|
|||
CMD_SUBSYSTEM_ETH))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1660,7 +1660,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
|
|||
adapter->stats_cmd_sent = true;
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1697,7 +1697,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
|
|||
struct be_cmd_req_link_status *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (link_status)
|
||||
*link_status = LINK_DOWN;
|
||||
|
|
@ -1736,7 +1736,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1747,7 +1747,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
|
|||
struct be_cmd_req_get_cntl_addnl_attribs *req;
|
||||
int status = 0;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1762,7 +1762,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
|
|||
|
||||
status = be_mcc_notify(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1811,7 +1811,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
|
|||
if (!get_fat_cmd.va)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
while (total_size) {
|
||||
buf_size = min(total_size, (u32)60 * 1024);
|
||||
|
|
@ -1849,9 +1849,9 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
|
|||
log_offset += buf_size;
|
||||
}
|
||||
err:
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size,
|
||||
get_fat_cmd.va, get_fat_cmd.dma);
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1862,7 +1862,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
|
|||
struct be_cmd_req_get_fw_version *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1885,7 +1885,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
|
|||
sizeof(adapter->fw_on_flash));
|
||||
}
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1899,7 +1899,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
|
|||
struct be_cmd_req_modify_eq_delay *req;
|
||||
int status = 0, i;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1922,7 +1922,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
|
|||
|
||||
status = be_mcc_notify(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1949,7 +1949,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
|
|||
struct be_cmd_req_vlan_config *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -1971,7 +1971,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -1982,7 +1982,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
|
|||
struct be_cmd_req_rx_filter *req = mem->va;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2015,7 +2015,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2046,7 +2046,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
|
|||
CMD_SUBSYSTEM_COMMON))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2066,7 +2066,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED)
|
||||
return -EOPNOTSUPP;
|
||||
|
|
@ -2085,7 +2085,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
|
|||
CMD_SUBSYSTEM_COMMON))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2108,7 +2108,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2189,7 +2189,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
|
|||
if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2214,7 +2214,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2226,7 +2226,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
|
|||
struct be_cmd_req_enable_disable_beacon *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2247,7 +2247,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2258,7 +2258,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
|
|||
struct be_cmd_req_get_beacon_state *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2282,7 +2282,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2306,7 +2306,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2328,7 +2328,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
|
|||
memcpy(data, resp->page_data + off, len);
|
||||
}
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
|
||||
return status;
|
||||
}
|
||||
|
|
@ -2345,7 +2345,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
|
|||
void *ctxt = NULL;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
adapter->flash_status = 0;
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
|
|
@ -2387,7 +2387,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
|
|||
if (status)
|
||||
goto err_unlock;
|
||||
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
|
||||
msecs_to_jiffies(60000)))
|
||||
|
|
@ -2406,7 +2406,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
|
|||
return status;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2460,7 +2460,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
|
|||
struct be_mcc_wrb *wrb;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2478,7 +2478,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2491,7 +2491,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
|||
struct lancer_cmd_resp_read_object *resp;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2525,7 +2525,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
|||
}
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2537,7 +2537,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
|
|||
struct be_cmd_write_flashrom *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
adapter->flash_status = 0;
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
|
|
@ -2562,7 +2562,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
|
|||
if (status)
|
||||
goto err_unlock;
|
||||
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
|
||||
msecs_to_jiffies(40000)))
|
||||
|
|
@ -2573,7 +2573,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
|
|||
return status;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -2584,7 +2584,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
|
|||
struct be_mcc_wrb *wrb;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -2611,7 +2611,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
|
|||
memcpy(flashed_crc, req->crc, 4);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3217,7 +3217,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
|
|||
struct be_cmd_req_acpi_wol_magic_config *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3234,7 +3234,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3249,7 +3249,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
|
|||
CMD_SUBSYSTEM_LOWLEVEL))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3272,7 +3272,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
|
|||
if (status)
|
||||
goto err_unlock;
|
||||
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
|
||||
msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
|
||||
|
|
@ -3281,7 +3281,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
|
|||
return status;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3298,7 +3298,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
|
|||
CMD_SUBSYSTEM_LOWLEVEL))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3324,7 +3324,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
|
|||
if (status)
|
||||
goto err;
|
||||
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
|
||||
wait_for_completion(&adapter->et_cmd_compl);
|
||||
resp = embedded_payload(wrb);
|
||||
|
|
@ -3332,7 +3332,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
|
|||
|
||||
return status;
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3348,7 +3348,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
|
|||
CMD_SUBSYSTEM_LOWLEVEL))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3382,7 +3382,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3393,7 +3393,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
|
|||
struct be_cmd_req_seeprom_read *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3409,7 +3409,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3424,7 +3424,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
|
|||
CMD_SUBSYSTEM_COMMON))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3469,7 +3469,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
|
|||
}
|
||||
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3479,7 +3479,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
|
|||
struct be_cmd_req_set_qos *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3499,7 +3499,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3611,7 +3611,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
|
|||
struct be_cmd_req_get_fn_privileges *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3643,7 +3643,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3655,7 +3655,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
|
|||
struct be_cmd_req_set_fn_privileges *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3675,7 +3675,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3707,7 +3707,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3771,7 +3771,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
|
|||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size,
|
||||
get_mac_list_cmd.va, get_mac_list_cmd.dma);
|
||||
return status;
|
||||
|
|
@ -3831,7 +3831,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
|
|||
if (!cmd.va)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3853,7 +3853,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
|
|||
|
||||
err:
|
||||
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3889,7 +3889,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
|
|||
CMD_SUBSYSTEM_COMMON))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3930,7 +3930,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
|
|||
status = be_mcc_notify_wait(adapter);
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -3944,7 +3944,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
|
|||
int status;
|
||||
u16 vid;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -3991,7 +3991,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -4190,7 +4190,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
|
|||
struct be_cmd_req_set_ext_fat_caps *req;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -4206,7 +4206,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -4684,7 +4684,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
|
|||
if (iface == 0xFFFFFFFF)
|
||||
return -1;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -4701,7 +4701,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -4735,7 +4735,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
|
|||
struct be_cmd_resp_get_iface_list *resp;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -4756,7 +4756,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
|
|||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -4850,7 +4850,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
|
|||
if (BEx_chip(adapter))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -4868,7 +4868,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
|
|||
req->enable = 1;
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -4941,7 +4941,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
|
|||
u32 link_config = 0;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -4969,7 +4969,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
|
|||
|
||||
status = be_mcc_notify_wait(adapter);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -5000,8 +5000,7 @@ int be_cmd_set_features(struct be_adapter *adapter)
|
|||
struct be_mcc_wrb *wrb;
|
||||
int status;
|
||||
|
||||
if (mutex_lock_interruptible(&adapter->mcc_lock))
|
||||
return -1;
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -5039,7 +5038,7 @@ err:
|
|||
dev_info(&adapter->pdev->dev,
|
||||
"Adapter does not support HW error recovery\n");
|
||||
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -5053,7 +5052,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
|
|||
struct be_cmd_resp_hdr *resp;
|
||||
int status;
|
||||
|
||||
mutex_lock(&adapter->mcc_lock);
|
||||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
if (!wrb) {
|
||||
|
|
@ -5076,7 +5075,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
|
|||
memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length);
|
||||
be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length);
|
||||
err:
|
||||
mutex_unlock(&adapter->mcc_lock);
|
||||
spin_unlock_bh(&adapter->mcc_lock);
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL(be_roce_mcc_cmd);
|
||||
|
|
|
|||
|
|
@ -5667,8 +5667,8 @@ static int be_drv_init(struct be_adapter *adapter)
|
|||
}
|
||||
|
||||
mutex_init(&adapter->mbox_lock);
|
||||
mutex_init(&adapter->mcc_lock);
|
||||
mutex_init(&adapter->rx_filter_lock);
|
||||
spin_lock_init(&adapter->mcc_lock);
|
||||
spin_lock_init(&adapter->mcc_cq_lock);
|
||||
init_completion(&adapter->et_cmd_compl);
|
||||
|
||||
|
|
|
|||
|
|
@ -483,7 +483,7 @@ int hclge_ptp_init(struct hclge_dev *hdev)
|
|||
|
||||
ret = hclge_ptp_get_cycle(hdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = hclge_ptp_int_en(hdev, true);
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@
|
|||
#include "dwmac_dma.h"
|
||||
#include "dwmac1000.h"
|
||||
|
||||
#define DRIVER_NAME "dwmac-loongson-pci"
|
||||
|
||||
/* Normal Loongson Tx Summary */
|
||||
#define DMA_INTR_ENA_NIE_TX_LOONGSON 0x00040000
|
||||
/* Normal Loongson Rx Summary */
|
||||
|
|
@ -568,7 +570,7 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id
|
|||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
continue;
|
||||
ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
|
||||
ret = pcim_iomap_regions(pdev, BIT(0), DRIVER_NAME);
|
||||
if (ret)
|
||||
goto err_disable_device;
|
||||
break;
|
||||
|
|
@ -687,7 +689,7 @@ static const struct pci_device_id loongson_dwmac_id_table[] = {
|
|||
MODULE_DEVICE_TABLE(pci, loongson_dwmac_id_table);
|
||||
|
||||
static struct pci_driver loongson_dwmac_driver = {
|
||||
.name = "dwmac-loongson-pci",
|
||||
.name = DRIVER_NAME,
|
||||
.id_table = loongson_dwmac_id_table,
|
||||
.probe = loongson_dwmac_probe,
|
||||
.remove = loongson_dwmac_remove,
|
||||
|
|
|
|||
|
|
@ -28,20 +28,18 @@ enum ipa_resource_type {
|
|||
enum ipa_rsrc_group_id {
|
||||
/* Source resource group identifiers */
|
||||
IPA_RSRC_GROUP_SRC_UL_DL = 0,
|
||||
IPA_RSRC_GROUP_SRC_UC_RX_Q,
|
||||
IPA_RSRC_GROUP_SRC_COUNT, /* Last in set; not a source group */
|
||||
|
||||
/* Destination resource group identifiers */
|
||||
IPA_RSRC_GROUP_DST_UL_DL_DPL = 0,
|
||||
IPA_RSRC_GROUP_DST_UNUSED_1,
|
||||
IPA_RSRC_GROUP_DST_UL_DL = 0,
|
||||
IPA_RSRC_GROUP_DST_COUNT, /* Last; not a destination group */
|
||||
};
|
||||
|
||||
/* QSB configuration data for an SoC having IPA v4.7 */
|
||||
static const struct ipa_qsb_data ipa_qsb_data[] = {
|
||||
[IPA_QSB_MASTER_DDR] = {
|
||||
.max_writes = 8,
|
||||
.max_reads = 0, /* no limit (hardware max) */
|
||||
.max_writes = 12,
|
||||
.max_reads = 13,
|
||||
.max_reads_beats = 120,
|
||||
},
|
||||
};
|
||||
|
|
@ -81,7 +79,7 @@ static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data[] = {
|
|||
},
|
||||
.endpoint = {
|
||||
.config = {
|
||||
.resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL,
|
||||
.resource_group = IPA_RSRC_GROUP_DST_UL_DL,
|
||||
.aggregation = true,
|
||||
.status_enable = true,
|
||||
.rx = {
|
||||
|
|
@ -106,6 +104,7 @@ static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data[] = {
|
|||
.filter_support = true,
|
||||
.config = {
|
||||
.resource_group = IPA_RSRC_GROUP_SRC_UL_DL,
|
||||
.checksum = true,
|
||||
.qmap = true,
|
||||
.status_enable = true,
|
||||
.tx = {
|
||||
|
|
@ -128,7 +127,8 @@ static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data[] = {
|
|||
},
|
||||
.endpoint = {
|
||||
.config = {
|
||||
.resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL,
|
||||
.resource_group = IPA_RSRC_GROUP_DST_UL_DL,
|
||||
.checksum = true,
|
||||
.qmap = true,
|
||||
.aggregation = true,
|
||||
.rx = {
|
||||
|
|
@ -197,12 +197,12 @@ static const struct ipa_resource ipa_resource_src[] = {
|
|||
/* Destination resource configuration data for an SoC having IPA v4.7 */
|
||||
static const struct ipa_resource ipa_resource_dst[] = {
|
||||
[IPA_RESOURCE_TYPE_DST_DATA_SECTORS] = {
|
||||
.limits[IPA_RSRC_GROUP_DST_UL_DL_DPL] = {
|
||||
.limits[IPA_RSRC_GROUP_DST_UL_DL] = {
|
||||
.min = 7, .max = 7,
|
||||
},
|
||||
},
|
||||
[IPA_RESOURCE_TYPE_DST_DPS_DMARS] = {
|
||||
.limits[IPA_RSRC_GROUP_DST_UL_DL_DPL] = {
|
||||
.limits[IPA_RSRC_GROUP_DST_UL_DL] = {
|
||||
.min = 2, .max = 2,
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -507,6 +507,9 @@ static int mctp_i3c_header_create(struct sk_buff *skb, struct net_device *dev,
|
|||
{
|
||||
struct mctp_i3c_internal_hdr *ihdr;
|
||||
|
||||
if (!daddr || !saddr)
|
||||
return -EINVAL;
|
||||
|
||||
skb_push(skb, sizeof(struct mctp_i3c_internal_hdr));
|
||||
skb_reset_mac_header(skb);
|
||||
ihdr = (void *)skb_mac_header(skb);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,17 @@
|
|||
#define PPP_PROTO_LEN 2
|
||||
#define PPP_LCP_HDRLEN 4
|
||||
|
||||
/* The filter instructions generated by libpcap are constructed
|
||||
* assuming a four-byte PPP header on each packet, where the last
|
||||
* 2 bytes are the protocol field defined in the RFC and the first
|
||||
* byte of the first 2 bytes indicates the direction.
|
||||
* The second byte is currently unused, but we still need to initialize
|
||||
* it to prevent crafted BPF programs from reading them which would
|
||||
* cause reading of uninitialized data.
|
||||
*/
|
||||
#define PPP_FILTER_OUTBOUND_TAG 0x0100
|
||||
#define PPP_FILTER_INBOUND_TAG 0x0000
|
||||
|
||||
/*
|
||||
* An instance of /dev/ppp can be associated with either a ppp
|
||||
* interface unit or a ppp channel. In both cases, file->private_data
|
||||
|
|
@ -1762,10 +1773,10 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb)
|
|||
|
||||
if (proto < 0x8000) {
|
||||
#ifdef CONFIG_PPP_FILTER
|
||||
/* check if we should pass this packet */
|
||||
/* the filter instructions are constructed assuming
|
||||
a four-byte PPP header on each packet */
|
||||
*(u8 *)skb_push(skb, 2) = 1;
|
||||
/* check if the packet passes the pass and active filters.
|
||||
* See comment for PPP_FILTER_OUTBOUND_TAG above.
|
||||
*/
|
||||
*(__be16 *)skb_push(skb, 2) = htons(PPP_FILTER_OUTBOUND_TAG);
|
||||
if (ppp->pass_filter &&
|
||||
bpf_prog_run(ppp->pass_filter, skb) == 0) {
|
||||
if (ppp->debug & 1)
|
||||
|
|
@ -2482,14 +2493,13 @@ ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb)
|
|||
/* network protocol frame - give it to the kernel */
|
||||
|
||||
#ifdef CONFIG_PPP_FILTER
|
||||
/* check if the packet passes the pass and active filters */
|
||||
/* the filter instructions are constructed assuming
|
||||
a four-byte PPP header on each packet */
|
||||
if (ppp->pass_filter || ppp->active_filter) {
|
||||
if (skb_unclone(skb, GFP_ATOMIC))
|
||||
goto err;
|
||||
|
||||
*(u8 *)skb_push(skb, 2) = 0;
|
||||
/* Check if the packet passes the pass and active filters.
|
||||
* See comment for PPP_FILTER_INBOUND_TAG above.
|
||||
*/
|
||||
*(__be16 *)skb_push(skb, 2) = htons(PPP_FILTER_INBOUND_TAG);
|
||||
if (ppp->pass_filter &&
|
||||
bpf_prog_run(ppp->pass_filter, skb) == 0) {
|
||||
if (ppp->debug & 1)
|
||||
|
|
|
|||
|
|
@ -1172,6 +1172,7 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
|
|||
struct brcmf_bus *bus_if;
|
||||
struct brcmf_sdio_dev *sdiodev;
|
||||
mmc_pm_flag_t sdio_flags;
|
||||
bool cap_power_off;
|
||||
int ret = 0;
|
||||
|
||||
func = container_of(dev, struct sdio_func, dev);
|
||||
|
|
@ -1179,19 +1180,23 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
|
|||
if (func->num != 1)
|
||||
return 0;
|
||||
|
||||
cap_power_off = !!(func->card->host->caps & MMC_CAP_POWER_OFF_CARD);
|
||||
|
||||
bus_if = dev_get_drvdata(dev);
|
||||
sdiodev = bus_if->bus_priv.sdio;
|
||||
|
||||
if (sdiodev->wowl_enabled) {
|
||||
if (sdiodev->wowl_enabled || !cap_power_off) {
|
||||
brcmf_sdiod_freezer_on(sdiodev);
|
||||
brcmf_sdio_wd_timer(sdiodev->bus, 0);
|
||||
|
||||
sdio_flags = MMC_PM_KEEP_POWER;
|
||||
if (sdiodev->settings->bus.sdio.oob_irq_supported)
|
||||
enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
|
||||
else
|
||||
sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
|
||||
|
||||
if (sdiodev->wowl_enabled) {
|
||||
if (sdiodev->settings->bus.sdio.oob_irq_supported)
|
||||
enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
|
||||
else
|
||||
sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
|
||||
}
|
||||
|
||||
if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags))
|
||||
brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
|
||||
|
|
@ -1213,18 +1218,19 @@ static int brcmf_ops_sdio_resume(struct device *dev)
|
|||
struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
||||
struct sdio_func *func = container_of(dev, struct sdio_func, dev);
|
||||
int ret = 0;
|
||||
bool cap_power_off = !!(func->card->host->caps & MMC_CAP_POWER_OFF_CARD);
|
||||
|
||||
brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
|
||||
if (func->num != 2)
|
||||
return 0;
|
||||
|
||||
if (!sdiodev->wowl_enabled) {
|
||||
if (!sdiodev->wowl_enabled && cap_power_off) {
|
||||
/* bus was powered off and device removed, probe again */
|
||||
ret = brcmf_sdiod_probe(sdiodev);
|
||||
if (ret)
|
||||
brcmf_err("Failed to probe device on resume\n");
|
||||
} else {
|
||||
if (sdiodev->settings->bus.sdio.oob_irq_supported)
|
||||
if (sdiodev->wowl_enabled && sdiodev->settings->bus.sdio.oob_irq_supported)
|
||||
disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
|
||||
|
||||
brcmf_sdiod_freezer_off(sdiodev);
|
||||
|
|
|
|||
|
|
@ -558,41 +558,71 @@ static void iwl_dump_prph(struct iwl_fw_runtime *fwrt,
|
|||
}
|
||||
|
||||
/*
|
||||
* alloc_sgtable - allocates scallerlist table in the given size,
|
||||
* fills it with pages and returns it
|
||||
* alloc_sgtable - allocates (chained) scatterlist in the given size,
|
||||
* fills it with pages and returns it
|
||||
* @size: the size (in bytes) of the table
|
||||
*/
|
||||
static struct scatterlist *alloc_sgtable(int size)
|
||||
*/
|
||||
static struct scatterlist *alloc_sgtable(ssize_t size)
|
||||
{
|
||||
int alloc_size, nents, i;
|
||||
struct page *new_page;
|
||||
struct scatterlist *iter;
|
||||
struct scatterlist *table;
|
||||
struct scatterlist *result = NULL, *prev;
|
||||
int nents, i, n_prev;
|
||||
|
||||
nents = DIV_ROUND_UP(size, PAGE_SIZE);
|
||||
table = kcalloc(nents, sizeof(*table), GFP_KERNEL);
|
||||
if (!table)
|
||||
return NULL;
|
||||
sg_init_table(table, nents);
|
||||
iter = table;
|
||||
for_each_sg(table, iter, sg_nents(table), i) {
|
||||
new_page = alloc_page(GFP_KERNEL);
|
||||
if (!new_page) {
|
||||
/* release all previous allocated pages in the table */
|
||||
iter = table;
|
||||
for_each_sg(table, iter, sg_nents(table), i) {
|
||||
new_page = sg_page(iter);
|
||||
if (new_page)
|
||||
__free_page(new_page);
|
||||
}
|
||||
kfree(table);
|
||||
|
||||
#define N_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof(*result))
|
||||
/*
|
||||
* We need an additional entry for table chaining,
|
||||
* this ensures the loop can finish i.e. we can
|
||||
* fit at least two entries per page (obviously,
|
||||
* many more really fit.)
|
||||
*/
|
||||
BUILD_BUG_ON(N_ENTRIES_PER_PAGE < 2);
|
||||
|
||||
while (nents > 0) {
|
||||
struct scatterlist *new, *iter;
|
||||
int n_fill, n_alloc;
|
||||
|
||||
if (nents <= N_ENTRIES_PER_PAGE) {
|
||||
/* last needed table */
|
||||
n_fill = nents;
|
||||
n_alloc = nents;
|
||||
nents = 0;
|
||||
} else {
|
||||
/* fill a page with entries */
|
||||
n_alloc = N_ENTRIES_PER_PAGE;
|
||||
/* reserve one for chaining */
|
||||
n_fill = n_alloc - 1;
|
||||
nents -= n_fill;
|
||||
}
|
||||
|
||||
new = kcalloc(n_alloc, sizeof(*new), GFP_KERNEL);
|
||||
if (!new) {
|
||||
if (result)
|
||||
_devcd_free_sgtable(result);
|
||||
return NULL;
|
||||
}
|
||||
alloc_size = min_t(int, size, PAGE_SIZE);
|
||||
size -= PAGE_SIZE;
|
||||
sg_set_page(iter, new_page, alloc_size, 0);
|
||||
sg_init_table(new, n_alloc);
|
||||
|
||||
if (!result)
|
||||
result = new;
|
||||
else
|
||||
sg_chain(prev, n_prev, new);
|
||||
prev = new;
|
||||
n_prev = n_alloc;
|
||||
|
||||
for_each_sg(new, iter, n_fill, i) {
|
||||
struct page *new_page = alloc_page(GFP_KERNEL);
|
||||
|
||||
if (!new_page) {
|
||||
_devcd_free_sgtable(result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sg_set_page(iter, new_page, PAGE_SIZE, 0);
|
||||
}
|
||||
}
|
||||
return table;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void iwl_fw_get_prph_len(struct iwl_fw_runtime *fwrt,
|
||||
|
|
|
|||
|
|
@ -540,6 +540,9 @@ bool iwl_fwrt_read_err_table(struct iwl_trans *trans, u32 base, u32 *err_id)
|
|||
} err_info = {};
|
||||
int ret;
|
||||
|
||||
if (err_id)
|
||||
*err_id = 0;
|
||||
|
||||
if (!base)
|
||||
return false;
|
||||
|
||||
|
|
|
|||
|
|
@ -1181,7 +1181,7 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
|||
|
||||
if (tlv_len != sizeof(*fseq_ver))
|
||||
goto invalid_tlv_len;
|
||||
IWL_INFO(drv, "TLV_FW_FSEQ_VERSION: %s\n",
|
||||
IWL_INFO(drv, "TLV_FW_FSEQ_VERSION: %.32s\n",
|
||||
fseq_ver->version);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -3092,8 +3092,14 @@ static void iwl_mvm_d3_disconnect_iter(void *data, u8 *mac,
|
|||
ieee80211_resume_disconnect(vif);
|
||||
}
|
||||
|
||||
static bool iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif)
|
||||
enum rt_status {
|
||||
FW_ALIVE,
|
||||
FW_NEEDS_RESET,
|
||||
FW_ERROR,
|
||||
};
|
||||
|
||||
static enum rt_status iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
u32 err_id;
|
||||
|
||||
|
|
@ -3101,29 +3107,35 @@ static bool iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
|
|||
if (iwl_fwrt_read_err_table(mvm->trans,
|
||||
mvm->trans->dbg.lmac_error_event_table[0],
|
||||
&err_id)) {
|
||||
if (err_id == RF_KILL_INDICATOR_FOR_WOWLAN && vif) {
|
||||
struct cfg80211_wowlan_wakeup wakeup = {
|
||||
.rfkill_release = true,
|
||||
};
|
||||
ieee80211_report_wowlan_wakeup(vif, &wakeup,
|
||||
GFP_KERNEL);
|
||||
if (err_id == RF_KILL_INDICATOR_FOR_WOWLAN) {
|
||||
IWL_WARN(mvm, "Rfkill was toggled during suspend\n");
|
||||
if (vif) {
|
||||
struct cfg80211_wowlan_wakeup wakeup = {
|
||||
.rfkill_release = true,
|
||||
};
|
||||
|
||||
ieee80211_report_wowlan_wakeup(vif, &wakeup,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
return FW_NEEDS_RESET;
|
||||
}
|
||||
return true;
|
||||
return FW_ERROR;
|
||||
}
|
||||
|
||||
/* check if we have lmac2 set and check for error */
|
||||
if (iwl_fwrt_read_err_table(mvm->trans,
|
||||
mvm->trans->dbg.lmac_error_event_table[1],
|
||||
NULL))
|
||||
return true;
|
||||
return FW_ERROR;
|
||||
|
||||
/* check for umac error */
|
||||
if (iwl_fwrt_read_err_table(mvm->trans,
|
||||
mvm->trans->dbg.umac_error_event_table,
|
||||
NULL))
|
||||
return true;
|
||||
return FW_ERROR;
|
||||
|
||||
return false;
|
||||
return FW_ALIVE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -3492,6 +3504,7 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
|
|||
bool d0i3_first = fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_D0I3_END_FIRST);
|
||||
bool resume_notif_based = iwl_mvm_d3_resume_notif_based(mvm);
|
||||
enum rt_status rt_status;
|
||||
bool keep = false;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
|
@ -3515,14 +3528,19 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
|
|||
|
||||
iwl_fw_dbg_read_d3_debug_data(&mvm->fwrt);
|
||||
|
||||
if (iwl_mvm_check_rt_status(mvm, vif)) {
|
||||
IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
|
||||
rt_status = iwl_mvm_check_rt_status(mvm, vif);
|
||||
if (rt_status != FW_ALIVE) {
|
||||
set_bit(STATUS_FW_ERROR, &mvm->trans->status);
|
||||
iwl_mvm_dump_nic_error_log(mvm);
|
||||
iwl_dbg_tlv_time_point(&mvm->fwrt,
|
||||
IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
|
||||
iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
|
||||
false, 0);
|
||||
if (rt_status == FW_ERROR) {
|
||||
IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
|
||||
iwl_mvm_dump_nic_error_log(mvm);
|
||||
iwl_dbg_tlv_time_point(&mvm->fwrt,
|
||||
IWL_FW_INI_TIME_POINT_FW_ASSERT,
|
||||
NULL);
|
||||
iwl_fw_dbg_collect_desc(&mvm->fwrt,
|
||||
&iwl_dump_desc_assert,
|
||||
false, 0);
|
||||
}
|
||||
ret = 1;
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -3679,6 +3697,7 @@ int iwl_mvm_fast_resume(struct iwl_mvm *mvm)
|
|||
.notif_expected =
|
||||
IWL_D3_NOTIF_D3_END_NOTIF,
|
||||
};
|
||||
enum rt_status rt_status;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
|
@ -3688,14 +3707,20 @@ int iwl_mvm_fast_resume(struct iwl_mvm *mvm)
|
|||
mvm->last_reset_or_resume_time_jiffies = jiffies;
|
||||
iwl_fw_dbg_read_d3_debug_data(&mvm->fwrt);
|
||||
|
||||
if (iwl_mvm_check_rt_status(mvm, NULL)) {
|
||||
IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
|
||||
rt_status = iwl_mvm_check_rt_status(mvm, NULL);
|
||||
if (rt_status != FW_ALIVE) {
|
||||
set_bit(STATUS_FW_ERROR, &mvm->trans->status);
|
||||
iwl_mvm_dump_nic_error_log(mvm);
|
||||
iwl_dbg_tlv_time_point(&mvm->fwrt,
|
||||
IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
|
||||
iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
|
||||
false, 0);
|
||||
if (rt_status == FW_ERROR) {
|
||||
IWL_ERR(mvm,
|
||||
"iwl_mvm_check_rt_status failed, device is gone during suspend\n");
|
||||
iwl_mvm_dump_nic_error_log(mvm);
|
||||
iwl_dbg_tlv_time_point(&mvm->fwrt,
|
||||
IWL_FW_INI_TIME_POINT_FW_ASSERT,
|
||||
NULL);
|
||||
iwl_fw_dbg_collect_desc(&mvm->fwrt,
|
||||
&iwl_dump_desc_assert,
|
||||
false, 0);
|
||||
}
|
||||
mvm->trans->state = IWL_TRANS_NO_FW;
|
||||
ret = -ENODEV;
|
||||
|
||||
|
|
|
|||
|
|
@ -1479,6 +1479,13 @@ static ssize_t iwl_dbgfs_fw_dbg_clear_write(struct iwl_mvm *mvm,
|
|||
if (mvm->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_9000)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/*
|
||||
* If the firmware is not running, silently succeed since there is
|
||||
* no data to clear.
|
||||
*/
|
||||
if (!iwl_mvm_firmware_running(mvm))
|
||||
return count;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
iwl_fw_dbg_clear_monitor_buf(&mvm->fwrt);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
|
|
|||
|
|
@ -995,7 +995,7 @@ iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
|
|||
*/
|
||||
u8 ru = le32_get_bits(phy_data->d1, IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK);
|
||||
u32 rate_n_flags = phy_data->rate_n_flags;
|
||||
u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK_V1;
|
||||
u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
|
||||
u8 offs = 0;
|
||||
|
||||
rx_status->bw = RATE_INFO_BW_HE_RU;
|
||||
|
|
@ -1050,13 +1050,13 @@ iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
|
|||
|
||||
if (he_mu)
|
||||
he_mu->flags2 |=
|
||||
le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK_V1,
|
||||
le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK,
|
||||
rate_n_flags),
|
||||
IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW);
|
||||
else if (he_type == RATE_MCS_HE_TYPE_TRIG_V1)
|
||||
else if (he_type == RATE_MCS_HE_TYPE_TRIG)
|
||||
he->data6 |=
|
||||
cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN) |
|
||||
le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK_V1,
|
||||
le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK,
|
||||
rate_n_flags),
|
||||
IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1030,6 +1030,8 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
|
|||
/* End TE, notify mac80211 */
|
||||
mvmvif->time_event_data.id = SESSION_PROTECT_CONF_MAX_ID;
|
||||
mvmvif->time_event_data.link_id = -1;
|
||||
/* set the bit so the ROC cleanup will actually clean up */
|
||||
set_bit(IWL_MVM_STATUS_ROC_P2P_RUNNING, &mvm->status);
|
||||
iwl_mvm_roc_finished(mvm);
|
||||
ieee80211_remain_on_channel_expired(mvm->hw);
|
||||
} else if (le32_to_cpu(notif->start)) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2003-2015, 2018-2024 Intel Corporation
|
||||
* Copyright (C) 2003-2015, 2018-2025 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
|
|
@ -646,7 +646,8 @@ dma_addr_t iwl_pcie_get_sgt_tb_phys(struct sg_table *sgt, unsigned int offset,
|
|||
unsigned int len);
|
||||
struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
struct iwl_cmd_meta *cmd_meta,
|
||||
u8 **hdr, unsigned int hdr_room);
|
||||
u8 **hdr, unsigned int hdr_room,
|
||||
unsigned int offset);
|
||||
|
||||
void iwl_pcie_free_tso_pages(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
struct iwl_cmd_meta *cmd_meta);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2020, 2023-2024 Intel Corporation
|
||||
* Copyright (C) 2018-2020, 2023-2025 Intel Corporation
|
||||
*/
|
||||
#include <net/tso.h>
|
||||
#include <linux/tcp.h>
|
||||
|
|
@ -188,7 +188,8 @@ static int iwl_txq_gen2_build_amsdu(struct iwl_trans *trans,
|
|||
(3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr));
|
||||
|
||||
/* Our device supports 9 segments at most, it will fit in 1 page */
|
||||
sgt = iwl_pcie_prep_tso(trans, skb, out_meta, &start_hdr, hdr_room);
|
||||
sgt = iwl_pcie_prep_tso(trans, skb, out_meta, &start_hdr, hdr_room,
|
||||
snap_ip_tcp_hdrlen + hdr_len);
|
||||
if (!sgt)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -347,6 +348,7 @@ iwl_tfh_tfd *iwl_txq_gen2_build_tx_amsdu(struct iwl_trans *trans,
|
|||
return tfd;
|
||||
|
||||
out_err:
|
||||
iwl_pcie_free_tso_pages(trans, skb, out_meta);
|
||||
iwl_txq_gen2_tfd_unmap(trans, out_meta, tfd);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2003-2014, 2018-2021, 2023-2024 Intel Corporation
|
||||
* Copyright (C) 2003-2014, 2018-2021, 2023-2025 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
|
|
@ -1855,6 +1855,7 @@ dma_addr_t iwl_pcie_get_sgt_tb_phys(struct sg_table *sgt, unsigned int offset,
|
|||
* @cmd_meta: command meta to store the scatter list information for unmapping
|
||||
* @hdr: output argument for TSO headers
|
||||
* @hdr_room: requested length for TSO headers
|
||||
* @offset: offset into the data from which mapping should start
|
||||
*
|
||||
* Allocate space for a scatter gather list and TSO headers and map the SKB
|
||||
* using the scatter gather list. The SKB is unmapped again when the page is
|
||||
|
|
@ -1864,18 +1865,20 @@ dma_addr_t iwl_pcie_get_sgt_tb_phys(struct sg_table *sgt, unsigned int offset,
|
|||
*/
|
||||
struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
struct iwl_cmd_meta *cmd_meta,
|
||||
u8 **hdr, unsigned int hdr_room)
|
||||
u8 **hdr, unsigned int hdr_room,
|
||||
unsigned int offset)
|
||||
{
|
||||
struct sg_table *sgt;
|
||||
unsigned int n_segments;
|
||||
|
||||
if (WARN_ON_ONCE(skb_has_frag_list(skb)))
|
||||
return NULL;
|
||||
|
||||
n_segments = DIV_ROUND_UP(skb->len - offset, skb_shinfo(skb)->gso_size);
|
||||
*hdr = iwl_pcie_get_page_hdr(trans,
|
||||
hdr_room + __alignof__(struct sg_table) +
|
||||
sizeof(struct sg_table) +
|
||||
(skb_shinfo(skb)->nr_frags + 1) *
|
||||
sizeof(struct scatterlist),
|
||||
n_segments * sizeof(struct scatterlist),
|
||||
skb);
|
||||
if (!*hdr)
|
||||
return NULL;
|
||||
|
|
@ -1883,11 +1886,11 @@ struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
|
|||
sgt = (void *)PTR_ALIGN(*hdr + hdr_room, __alignof__(struct sg_table));
|
||||
sgt->sgl = (void *)(sgt + 1);
|
||||
|
||||
sg_init_table(sgt->sgl, skb_shinfo(skb)->nr_frags + 1);
|
||||
sg_init_table(sgt->sgl, n_segments);
|
||||
|
||||
/* Only map the data, not the header (it is copied to the TSO page) */
|
||||
sgt->orig_nents = skb_to_sgvec(skb, sgt->sgl, skb_headlen(skb),
|
||||
skb->data_len);
|
||||
sgt->orig_nents = skb_to_sgvec(skb, sgt->sgl, offset,
|
||||
skb->len - offset);
|
||||
if (WARN_ON_ONCE(sgt->orig_nents <= 0))
|
||||
return NULL;
|
||||
|
||||
|
|
@ -1939,7 +1942,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
|
|||
(3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr)) + iv_len;
|
||||
|
||||
/* Our device supports 9 segments at most, it will fit in 1 page */
|
||||
sgt = iwl_pcie_prep_tso(trans, skb, out_meta, &start_hdr, hdr_room);
|
||||
sgt = iwl_pcie_prep_tso(trans, skb, out_meta, &start_hdr, hdr_room,
|
||||
snap_ip_tcp_hdrlen + hdr_len + iv_len);
|
||||
if (!sgt)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -131,7 +131,8 @@ int vlan_check_real_dev(struct net_device *real_dev,
|
|||
{
|
||||
const char *name = real_dev->name;
|
||||
|
||||
if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
|
||||
if (real_dev->features & NETIF_F_VLAN_CHALLENGED ||
|
||||
real_dev->type != ARPHRD_ETHER) {
|
||||
pr_info("VLANs not supported on %s\n", name);
|
||||
NL_SET_ERR_MSG_MOD(extack, "VLANs not supported on device");
|
||||
return -EOPNOTSUPP;
|
||||
|
|
|
|||
|
|
@ -9660,6 +9660,9 @@ void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
|
|||
sizeof(*ev) + (name ? eir_precalc_len(name_len) : 0) +
|
||||
eir_precalc_len(sizeof(conn->dev_class)));
|
||||
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
ev = skb_put(skb, sizeof(*ev));
|
||||
bacpy(&ev->addr.bdaddr, &conn->dst);
|
||||
ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
|
||||
|
|
@ -10413,6 +10416,8 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
|||
|
||||
skb = mgmt_alloc_skb(hdev, MGMT_EV_DEVICE_FOUND,
|
||||
sizeof(*ev) + (name ? eir_precalc_len(name_len) : 0));
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
ev = skb_put(skb, sizeof(*ev));
|
||||
bacpy(&ev->addr.bdaddr, bdaddr);
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@ int ethnl_act_cable_test(struct sk_buff *skb, struct genl_info *info)
|
|||
dev = req_info.dev;
|
||||
|
||||
rtnl_lock();
|
||||
phydev = ethnl_req_get_phydev(&req_info,
|
||||
tb[ETHTOOL_A_CABLE_TEST_HEADER],
|
||||
phydev = ethnl_req_get_phydev(&req_info, tb,
|
||||
ETHTOOL_A_CABLE_TEST_HEADER,
|
||||
info->extack);
|
||||
if (IS_ERR_OR_NULL(phydev)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
|
|
@ -339,8 +339,8 @@ int ethnl_act_cable_test_tdr(struct sk_buff *skb, struct genl_info *info)
|
|||
goto out_dev_put;
|
||||
|
||||
rtnl_lock();
|
||||
phydev = ethnl_req_get_phydev(&req_info,
|
||||
tb[ETHTOOL_A_CABLE_TEST_TDR_HEADER],
|
||||
phydev = ethnl_req_get_phydev(&req_info, tb,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_HEADER,
|
||||
info->extack);
|
||||
if (IS_ERR_OR_NULL(phydev)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ static int linkstate_prepare_data(const struct ethnl_req_info *req_base,
|
|||
struct phy_device *phydev;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_LINKSTATE_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_LINKSTATE_HEADER,
|
||||
info->extack);
|
||||
if (IS_ERR(phydev)) {
|
||||
ret = PTR_ERR(phydev);
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ int ethnl_parse_header_dev_get(struct ethnl_req_info *req_info,
|
|||
}
|
||||
|
||||
struct phy_device *ethnl_req_get_phydev(const struct ethnl_req_info *req_info,
|
||||
const struct nlattr *header,
|
||||
struct nlattr **tb, unsigned int header,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct phy_device *phydev;
|
||||
|
|
@ -225,8 +225,8 @@ struct phy_device *ethnl_req_get_phydev(const struct ethnl_req_info *req_info,
|
|||
return req_info->dev->phydev;
|
||||
|
||||
phydev = phy_link_topo_get_phy(req_info->dev, req_info->phy_index);
|
||||
if (!phydev) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, header,
|
||||
if (!phydev && tb) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, tb[header],
|
||||
"no phy matching phyindex");
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -275,7 +275,8 @@ static inline void ethnl_parse_header_dev_put(struct ethnl_req_info *req_info)
|
|||
* ethnl_req_get_phydev() - Gets the phy_device targeted by this request,
|
||||
* if any. Must be called under rntl_lock().
|
||||
* @req_info: The ethnl request to get the phy from.
|
||||
* @header: The netlink header, used for error reporting.
|
||||
* @tb: The netlink attributes array, for error reporting.
|
||||
* @header: The netlink header index, used for error reporting.
|
||||
* @extack: The netlink extended ACK, for error reporting.
|
||||
*
|
||||
* The caller must hold RTNL, until it's done interacting with the returned
|
||||
|
|
@ -289,7 +290,7 @@ static inline void ethnl_parse_header_dev_put(struct ethnl_req_info *req_info)
|
|||
* is returned.
|
||||
*/
|
||||
struct phy_device *ethnl_req_get_phydev(const struct ethnl_req_info *req_info,
|
||||
const struct nlattr *header,
|
||||
struct nlattr **tb, unsigned int header,
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ static int ethnl_phy_parse_request(struct ethnl_req_info *req_base,
|
|||
struct phy_req_info *req_info = PHY_REQINFO(req_base);
|
||||
struct phy_device *phydev;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_PHY_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_PHY_HEADER,
|
||||
extack);
|
||||
if (!phydev)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ static int plca_get_cfg_prepare_data(const struct ethnl_req_info *req_base,
|
|||
struct phy_device *phydev;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_PLCA_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_PLCA_HEADER,
|
||||
info->extack);
|
||||
// check that the PHY device is available and connected
|
||||
if (IS_ERR_OR_NULL(phydev)) {
|
||||
|
|
@ -152,7 +152,7 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
|
|||
bool mod = false;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_info, tb[ETHTOOL_A_PLCA_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_info, tb, ETHTOOL_A_PLCA_HEADER,
|
||||
info->extack);
|
||||
// check that the PHY device is available and connected
|
||||
if (IS_ERR_OR_NULL(phydev))
|
||||
|
|
@ -211,7 +211,7 @@ static int plca_get_status_prepare_data(const struct ethnl_req_info *req_base,
|
|||
struct phy_device *phydev;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_PLCA_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_PLCA_HEADER,
|
||||
info->extack);
|
||||
// check that the PHY device is available and connected
|
||||
if (IS_ERR_OR_NULL(phydev)) {
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ static int pse_prepare_data(const struct ethnl_req_info *req_base,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_PSE_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_PSE_HEADER,
|
||||
info->extack);
|
||||
if (IS_ERR(phydev))
|
||||
return -ENODEV;
|
||||
|
|
@ -261,7 +261,7 @@ ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
|
|||
struct phy_device *phydev;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_info, tb[ETHTOOL_A_PSE_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_info, tb, ETHTOOL_A_PSE_HEADER,
|
||||
info->extack);
|
||||
ret = ethnl_set_pse_validate(phydev, info);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ static int stats_prepare_data(const struct ethnl_req_info *req_base,
|
|||
struct phy_device *phydev;
|
||||
int ret;
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_STATS_HEADER],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_STATS_HEADER,
|
||||
info->extack);
|
||||
if (IS_ERR(phydev))
|
||||
return PTR_ERR(phydev);
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ static int strset_prepare_data(const struct ethnl_req_info *req_base,
|
|||
return 0;
|
||||
}
|
||||
|
||||
phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_HEADER_FLAGS],
|
||||
phydev = ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_HEADER_FLAGS,
|
||||
info->extack);
|
||||
|
||||
/* phydev can be NULL, check for errors only */
|
||||
|
|
|
|||
|
|
@ -13,12 +13,15 @@
|
|||
#include <net/tcp.h>
|
||||
#include <net/protocol.h>
|
||||
|
||||
static void tcp_gso_tstamp(struct sk_buff *skb, unsigned int ts_seq,
|
||||
static void tcp_gso_tstamp(struct sk_buff *skb, struct sk_buff *gso_skb,
|
||||
unsigned int seq, unsigned int mss)
|
||||
{
|
||||
u32 flags = skb_shinfo(gso_skb)->tx_flags & SKBTX_ANY_TSTAMP;
|
||||
u32 ts_seq = skb_shinfo(gso_skb)->tskey;
|
||||
|
||||
while (skb) {
|
||||
if (before(ts_seq, seq + mss)) {
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_SW_TSTAMP;
|
||||
skb_shinfo(skb)->tx_flags |= flags;
|
||||
skb_shinfo(skb)->tskey = ts_seq;
|
||||
return;
|
||||
}
|
||||
|
|
@ -193,8 +196,8 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|||
th = tcp_hdr(skb);
|
||||
seq = ntohl(th->seq);
|
||||
|
||||
if (unlikely(skb_shinfo(gso_skb)->tx_flags & SKBTX_SW_TSTAMP))
|
||||
tcp_gso_tstamp(segs, skb_shinfo(gso_skb)->tskey, seq, mss);
|
||||
if (unlikely(skb_shinfo(gso_skb)->tx_flags & SKBTX_ANY_TSTAMP))
|
||||
tcp_gso_tstamp(segs, gso_skb, seq, mss);
|
||||
|
||||
newcheck = ~csum_fold(csum_add(csum_unfold(th->check), delta));
|
||||
|
||||
|
|
|
|||
|
|
@ -321,13 +321,17 @@ struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
|
|||
|
||||
/* clear destructor to avoid skb_segment assigning it to tail */
|
||||
copy_dtor = gso_skb->destructor == sock_wfree;
|
||||
if (copy_dtor)
|
||||
if (copy_dtor) {
|
||||
gso_skb->destructor = NULL;
|
||||
gso_skb->sk = NULL;
|
||||
}
|
||||
|
||||
segs = skb_segment(gso_skb, features);
|
||||
if (IS_ERR_OR_NULL(segs)) {
|
||||
if (copy_dtor)
|
||||
if (copy_dtor) {
|
||||
gso_skb->destructor = sock_wfree;
|
||||
gso_skb->sk = sk;
|
||||
}
|
||||
return segs;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -88,13 +88,15 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|||
goto drop;
|
||||
}
|
||||
|
||||
if (ilwt->connected) {
|
||||
/* cache only if we don't create a dst reference loop */
|
||||
if (ilwt->connected && orig_dst->lwtstate != dst->lwtstate) {
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&ilwt->dst_cache, dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
}
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
return dst_output(net, sk, skb);
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
#include <net/llc_s_ac.h>
|
||||
#include <net/llc_s_ev.h>
|
||||
#include <net/llc_sap.h>
|
||||
|
||||
#include <net/sock.h>
|
||||
|
||||
/**
|
||||
* llc_sap_action_unitdata_ind - forward UI PDU to network layer
|
||||
|
|
@ -40,6 +40,26 @@ int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int llc_prepare_and_xmit(struct sk_buff *skb)
|
||||
{
|
||||
struct llc_sap_state_ev *ev = llc_sap_ev(skb);
|
||||
struct sk_buff *nskb;
|
||||
int rc;
|
||||
|
||||
rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
nskb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!nskb)
|
||||
return -ENOMEM;
|
||||
|
||||
if (skb->sk)
|
||||
skb_set_owner_w(nskb, skb->sk);
|
||||
|
||||
return dev_queue_xmit(nskb);
|
||||
}
|
||||
|
||||
/**
|
||||
* llc_sap_action_send_ui - sends UI PDU resp to UNITDATA REQ to MAC layer
|
||||
* @sap: SAP
|
||||
|
|
@ -52,17 +72,12 @@ int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb)
|
|||
int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb)
|
||||
{
|
||||
struct llc_sap_state_ev *ev = llc_sap_ev(skb);
|
||||
int rc;
|
||||
|
||||
llc_pdu_header_init(skb, LLC_PDU_TYPE_U, ev->saddr.lsap,
|
||||
ev->daddr.lsap, LLC_PDU_CMD);
|
||||
llc_pdu_init_as_ui_cmd(skb);
|
||||
rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac);
|
||||
if (likely(!rc)) {
|
||||
skb_get(skb);
|
||||
rc = dev_queue_xmit(skb);
|
||||
}
|
||||
return rc;
|
||||
|
||||
return llc_prepare_and_xmit(skb);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -77,17 +92,12 @@ int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb)
|
|||
int llc_sap_action_send_xid_c(struct llc_sap *sap, struct sk_buff *skb)
|
||||
{
|
||||
struct llc_sap_state_ev *ev = llc_sap_ev(skb);
|
||||
int rc;
|
||||
|
||||
llc_pdu_header_init(skb, LLC_PDU_TYPE_U_XID, ev->saddr.lsap,
|
||||
ev->daddr.lsap, LLC_PDU_CMD);
|
||||
llc_pdu_init_as_xid_cmd(skb, LLC_XID_NULL_CLASS_2, 0);
|
||||
rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac);
|
||||
if (likely(!rc)) {
|
||||
skb_get(skb);
|
||||
rc = dev_queue_xmit(skb);
|
||||
}
|
||||
return rc;
|
||||
|
||||
return llc_prepare_and_xmit(skb);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -133,17 +143,12 @@ out:
|
|||
int llc_sap_action_send_test_c(struct llc_sap *sap, struct sk_buff *skb)
|
||||
{
|
||||
struct llc_sap_state_ev *ev = llc_sap_ev(skb);
|
||||
int rc;
|
||||
|
||||
llc_pdu_header_init(skb, LLC_PDU_TYPE_U, ev->saddr.lsap,
|
||||
ev->daddr.lsap, LLC_PDU_CMD);
|
||||
llc_pdu_init_as_test_cmd(skb);
|
||||
rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac);
|
||||
if (likely(!rc)) {
|
||||
skb_get(skb);
|
||||
rc = dev_queue_xmit(skb);
|
||||
}
|
||||
return rc;
|
||||
|
||||
return llc_prepare_and_xmit(skb);
|
||||
}
|
||||
|
||||
int llc_sap_action_send_test_r(struct llc_sap *sap, struct sk_buff *skb)
|
||||
|
|
|
|||
|
|
@ -116,8 +116,14 @@ void drv_remove_interface(struct ieee80211_local *local,
|
|||
|
||||
sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
|
||||
|
||||
/* Remove driver debugfs entries */
|
||||
ieee80211_debugfs_recreate_netdev(sdata, sdata->vif.valid_links);
|
||||
/*
|
||||
* Remove driver debugfs entries.
|
||||
* The virtual monitor interface doesn't get a debugfs
|
||||
* entry, so it's exempt here.
|
||||
*/
|
||||
if (sdata != rcu_access_pointer(local->monitor_sdata))
|
||||
ieee80211_debugfs_recreate_netdev(sdata,
|
||||
sdata->vif.valid_links);
|
||||
|
||||
trace_drv_remove_interface(local, sdata);
|
||||
local->ops->remove_interface(&local->hw, &sdata->vif);
|
||||
|
|
|
|||
|
|
@ -1206,16 +1206,17 @@ void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
|
|||
return;
|
||||
}
|
||||
|
||||
RCU_INIT_POINTER(local->monitor_sdata, NULL);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
synchronize_net();
|
||||
|
||||
clear_bit(SDATA_STATE_RUNNING, &sdata->state);
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
|
||||
drv_remove_interface(local, sdata);
|
||||
|
||||
RCU_INIT_POINTER(local->monitor_sdata, NULL);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
synchronize_net();
|
||||
|
||||
kfree(sdata);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4959,6 +4959,7 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
|
|||
parse_params.start = bss_ies->data;
|
||||
parse_params.len = bss_ies->len;
|
||||
parse_params.bss = cbss;
|
||||
parse_params.link_id = -1;
|
||||
bss_elems = ieee802_11_parse_elems_full(&parse_params);
|
||||
if (!bss_elems) {
|
||||
ret = false;
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ struct ieee80211_elems_parse {
|
|||
/* The EPCS Multi-Link element in the original elements */
|
||||
const struct element *ml_epcs_elem;
|
||||
|
||||
bool multi_link_inner;
|
||||
bool skip_vendor;
|
||||
|
||||
/*
|
||||
* scratch buffer that can be used for various element parsing related
|
||||
* tasks, e.g., element de-fragmentation etc.
|
||||
|
|
@ -152,12 +155,11 @@ ieee80211_parse_extension_element(u32 *crc,
|
|||
switch (le16_get_bits(mle->control,
|
||||
IEEE80211_ML_CONTROL_TYPE)) {
|
||||
case IEEE80211_ML_CONTROL_TYPE_BASIC:
|
||||
if (elems_parse->ml_basic_elem) {
|
||||
if (elems_parse->multi_link_inner) {
|
||||
elems->parse_error |=
|
||||
IEEE80211_PARSE_ERR_DUP_NEST_ML_BASIC;
|
||||
break;
|
||||
}
|
||||
elems_parse->ml_basic_elem = elem;
|
||||
break;
|
||||
case IEEE80211_ML_CONTROL_TYPE_RECONF:
|
||||
elems_parse->ml_reconf_elem = elem;
|
||||
|
|
@ -399,6 +401,9 @@ _ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params,
|
|||
IEEE80211_PARSE_ERR_BAD_ELEM_SIZE;
|
||||
break;
|
||||
case WLAN_EID_VENDOR_SPECIFIC:
|
||||
if (elems_parse->skip_vendor)
|
||||
break;
|
||||
|
||||
if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
|
||||
pos[2] == 0xf2) {
|
||||
/* Microsoft OUI (00:50:F2) */
|
||||
|
|
@ -866,21 +871,36 @@ ieee80211_mle_get_sta_prof(struct ieee80211_elems_parse *elems_parse,
|
|||
}
|
||||
}
|
||||
|
||||
static void ieee80211_mle_parse_link(struct ieee80211_elems_parse *elems_parse,
|
||||
struct ieee80211_elems_parse_params *params)
|
||||
static const struct element *
|
||||
ieee80211_prep_mle_link_parse(struct ieee80211_elems_parse *elems_parse,
|
||||
struct ieee80211_elems_parse_params *params,
|
||||
struct ieee80211_elems_parse_params *sub)
|
||||
{
|
||||
struct ieee802_11_elems *elems = &elems_parse->elems;
|
||||
struct ieee80211_mle_per_sta_profile *prof;
|
||||
struct ieee80211_elems_parse_params sub = {
|
||||
.mode = params->mode,
|
||||
.action = params->action,
|
||||
.from_ap = params->from_ap,
|
||||
.link_id = -1,
|
||||
};
|
||||
ssize_t ml_len = elems->ml_basic_len;
|
||||
const struct element *non_inherit = NULL;
|
||||
const struct element *tmp;
|
||||
ssize_t ml_len;
|
||||
const u8 *end;
|
||||
|
||||
if (params->mode < IEEE80211_CONN_MODE_EHT)
|
||||
return NULL;
|
||||
|
||||
for_each_element_extid(tmp, WLAN_EID_EXT_EHT_MULTI_LINK,
|
||||
elems->ie_start, elems->total_len) {
|
||||
const struct ieee80211_multi_link_elem *mle =
|
||||
(void *)tmp->data + 1;
|
||||
|
||||
if (!ieee80211_mle_size_ok(tmp->data + 1, tmp->datalen - 1))
|
||||
continue;
|
||||
|
||||
if (le16_get_bits(mle->control, IEEE80211_ML_CONTROL_TYPE) !=
|
||||
IEEE80211_ML_CONTROL_TYPE_BASIC)
|
||||
continue;
|
||||
|
||||
elems_parse->ml_basic_elem = tmp;
|
||||
break;
|
||||
}
|
||||
|
||||
ml_len = cfg80211_defragment_element(elems_parse->ml_basic_elem,
|
||||
elems->ie_start,
|
||||
elems->total_len,
|
||||
|
|
@ -891,26 +911,26 @@ static void ieee80211_mle_parse_link(struct ieee80211_elems_parse *elems_parse,
|
|||
WLAN_EID_FRAGMENT);
|
||||
|
||||
if (ml_len < 0)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
elems->ml_basic = (const void *)elems_parse->scratch_pos;
|
||||
elems->ml_basic_len = ml_len;
|
||||
elems_parse->scratch_pos += ml_len;
|
||||
|
||||
if (params->link_id == -1)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
ieee80211_mle_get_sta_prof(elems_parse, params->link_id);
|
||||
prof = elems->prof;
|
||||
|
||||
if (!prof)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
/* check if we have the 4 bytes for the fixed part in assoc response */
|
||||
if (elems->sta_prof_len < sizeof(*prof) + prof->sta_info_len - 1 + 4) {
|
||||
elems->prof = NULL;
|
||||
elems->sta_prof_len = 0;
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -919,13 +939,17 @@ static void ieee80211_mle_parse_link(struct ieee80211_elems_parse *elems_parse,
|
|||
* the -1 is because the 'sta_info_len' is accounted to as part of the
|
||||
* per-STA profile, but not part of the 'u8 variable[]' portion.
|
||||
*/
|
||||
sub.start = prof->variable + prof->sta_info_len - 1 + 4;
|
||||
sub->start = prof->variable + prof->sta_info_len - 1 + 4;
|
||||
end = (const u8 *)prof + elems->sta_prof_len;
|
||||
sub.len = end - sub.start;
|
||||
sub->len = end - sub->start;
|
||||
|
||||
non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
|
||||
sub.start, sub.len);
|
||||
_ieee802_11_parse_elems_full(&sub, elems_parse, non_inherit);
|
||||
sub->mode = params->mode;
|
||||
sub->action = params->action;
|
||||
sub->from_ap = params->from_ap;
|
||||
sub->link_id = -1;
|
||||
|
||||
return cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
|
||||
sub->start, sub->len);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -973,15 +997,19 @@ ieee80211_mle_defrag_epcs(struct ieee80211_elems_parse *elems_parse)
|
|||
struct ieee802_11_elems *
|
||||
ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
|
||||
{
|
||||
struct ieee80211_elems_parse_params sub = {};
|
||||
struct ieee80211_elems_parse *elems_parse;
|
||||
struct ieee802_11_elems *elems;
|
||||
const struct element *non_inherit = NULL;
|
||||
u8 *nontransmitted_profile;
|
||||
int nontransmitted_profile_len = 0;
|
||||
struct ieee802_11_elems *elems;
|
||||
size_t scratch_len = 3 * params->len;
|
||||
bool multi_link_inner = false;
|
||||
|
||||
BUILD_BUG_ON(offsetof(typeof(*elems_parse), elems) != 0);
|
||||
|
||||
/* cannot parse for both a specific link and non-transmitted BSS */
|
||||
if (WARN_ON(params->link_id >= 0 && params->bss))
|
||||
return NULL;
|
||||
|
||||
elems_parse = kzalloc(struct_size(elems_parse, scratch, scratch_len),
|
||||
GFP_ATOMIC);
|
||||
if (!elems_parse)
|
||||
|
|
@ -998,34 +1026,51 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
|
|||
ieee80211_clear_tpe(&elems->tpe);
|
||||
ieee80211_clear_tpe(&elems->csa_tpe);
|
||||
|
||||
nontransmitted_profile = elems_parse->scratch_pos;
|
||||
nontransmitted_profile_len =
|
||||
ieee802_11_find_bssid_profile(params->start, params->len,
|
||||
elems, params->bss,
|
||||
nontransmitted_profile);
|
||||
elems_parse->scratch_pos += nontransmitted_profile_len;
|
||||
non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
|
||||
nontransmitted_profile,
|
||||
nontransmitted_profile_len);
|
||||
/*
|
||||
* If we're looking for a non-transmitted BSS then we cannot at
|
||||
* the same time be looking for a second link as the two can only
|
||||
* appear in the same frame carrying info for different BSSes.
|
||||
*
|
||||
* In any case, we only look for one at a time, as encoded by
|
||||
* the WARN_ON above.
|
||||
*/
|
||||
if (params->bss) {
|
||||
int nontx_len =
|
||||
ieee802_11_find_bssid_profile(params->start,
|
||||
params->len,
|
||||
elems, params->bss,
|
||||
elems_parse->scratch_pos);
|
||||
sub.start = elems_parse->scratch_pos;
|
||||
sub.mode = params->mode;
|
||||
sub.len = nontx_len;
|
||||
sub.action = params->action;
|
||||
sub.link_id = params->link_id;
|
||||
|
||||
/* consume the space used for non-transmitted profile */
|
||||
elems_parse->scratch_pos += nontx_len;
|
||||
|
||||
non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
|
||||
sub.start, nontx_len);
|
||||
} else {
|
||||
/* must always parse to get elems_parse->ml_basic_elem */
|
||||
non_inherit = ieee80211_prep_mle_link_parse(elems_parse, params,
|
||||
&sub);
|
||||
multi_link_inner = true;
|
||||
}
|
||||
|
||||
elems_parse->skip_vendor =
|
||||
cfg80211_find_elem(WLAN_EID_VENDOR_SPECIFIC,
|
||||
sub.start, sub.len);
|
||||
elems->crc = _ieee802_11_parse_elems_full(params, elems_parse,
|
||||
non_inherit);
|
||||
|
||||
/* Override with nontransmitted profile, if found */
|
||||
if (nontransmitted_profile_len) {
|
||||
struct ieee80211_elems_parse_params sub = {
|
||||
.mode = params->mode,
|
||||
.start = nontransmitted_profile,
|
||||
.len = nontransmitted_profile_len,
|
||||
.action = params->action,
|
||||
.link_id = params->link_id,
|
||||
};
|
||||
|
||||
/* Override with nontransmitted/per-STA profile if found */
|
||||
if (sub.len) {
|
||||
elems_parse->multi_link_inner = multi_link_inner;
|
||||
elems_parse->skip_vendor = false;
|
||||
_ieee802_11_parse_elems_full(&sub, elems_parse, NULL);
|
||||
}
|
||||
|
||||
ieee80211_mle_parse_link(elems_parse, params);
|
||||
|
||||
ieee80211_mle_defrag_reconf(elems_parse);
|
||||
|
||||
ieee80211_mle_defrag_epcs(elems_parse);
|
||||
|
|
|
|||
|
|
@ -687,7 +687,7 @@ void __ieee80211_flush_queues(struct ieee80211_local *local,
|
|||
struct ieee80211_sub_if_data *sdata,
|
||||
unsigned int queues, bool drop)
|
||||
{
|
||||
if (!local->ops->flush)
|
||||
if (!local->ops->flush && !drop)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
|
@ -714,7 +714,8 @@ void __ieee80211_flush_queues(struct ieee80211_local *local,
|
|||
}
|
||||
}
|
||||
|
||||
drv_flush(local, sdata, queues, drop);
|
||||
if (local->ops->flush)
|
||||
drv_flush(local, sdata, queues, drop);
|
||||
|
||||
ieee80211_wake_queues_by_reason(&local->hw, queues,
|
||||
IEEE80211_QUEUE_STOP_REASON_FLUSH,
|
||||
|
|
|
|||
|
|
@ -977,7 +977,7 @@ static void __mptcp_pm_release_addr_entry(struct mptcp_pm_addr_entry *entry)
|
|||
|
||||
static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
|
||||
struct mptcp_pm_addr_entry *entry,
|
||||
bool needs_id)
|
||||
bool needs_id, bool replace)
|
||||
{
|
||||
struct mptcp_pm_addr_entry *cur, *del_entry = NULL;
|
||||
unsigned int addr_max;
|
||||
|
|
@ -1017,6 +1017,17 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
|
|||
if (entry->addr.id)
|
||||
goto out;
|
||||
|
||||
/* allow callers that only need to look up the local
|
||||
* addr's id to skip replacement. This allows them to
|
||||
* avoid calling synchronize_rcu in the packet recv
|
||||
* path.
|
||||
*/
|
||||
if (!replace) {
|
||||
kfree(entry);
|
||||
ret = cur->addr.id;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pernet->addrs--;
|
||||
entry->addr.id = cur->addr.id;
|
||||
list_del_rcu(&cur->list);
|
||||
|
|
@ -1165,7 +1176,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
|
|||
entry->ifindex = 0;
|
||||
entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
|
||||
entry->lsk = NULL;
|
||||
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
|
||||
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true, false);
|
||||
if (ret < 0)
|
||||
kfree(entry);
|
||||
|
||||
|
|
@ -1433,7 +1444,8 @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info)
|
|||
}
|
||||
}
|
||||
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry,
|
||||
!mptcp_pm_has_addr_attr_id(attr, info));
|
||||
!mptcp_pm_has_addr_attr_id(attr, info),
|
||||
true);
|
||||
if (ret < 0) {
|
||||
GENL_SET_ERR_MSG_FMT(info, "too many addresses or duplicate one: %d", ret);
|
||||
goto out_free;
|
||||
|
|
|
|||
|
|
@ -4220,6 +4220,11 @@ static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
|
|||
if (flags[flag])
|
||||
*mntrflags |= (1<<flag);
|
||||
|
||||
/* cooked monitor mode is incompatible with other modes */
|
||||
if (*mntrflags & MONITOR_FLAG_COOK_FRAMES &&
|
||||
*mntrflags != MONITOR_FLAG_COOK_FRAMES)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
*mntrflags |= MONITOR_FLAG_CHANGED;
|
||||
|
||||
return 0;
|
||||
|
|
@ -16529,7 +16534,7 @@ static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info)
|
|||
goto out;
|
||||
}
|
||||
|
||||
err = cfg80211_assoc_ml_reconf(rdev, dev, links, rem_links);
|
||||
err = -EOPNOTSUPP;
|
||||
|
||||
out:
|
||||
for (link_id = 0; link_id < ARRAY_SIZE(links); link_id++)
|
||||
|
|
|
|||
|
|
@ -407,7 +407,8 @@ static bool is_an_alpha2(const char *alpha2)
|
|||
{
|
||||
if (!alpha2)
|
||||
return false;
|
||||
return isalpha(alpha2[0]) && isalpha(alpha2[1]);
|
||||
return isascii(alpha2[0]) && isalpha(alpha2[0]) &&
|
||||
isascii(alpha2[1]) && isalpha(alpha2[1]);
|
||||
}
|
||||
|
||||
static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
|
||||
|
|
|
|||
Loading…
Reference in New Issue