mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
ath.git update for v7.2-rc4
The most significant change is to fix an ath12k regression which led to low MLO RX throughput on WCN7850. The remainder are an assortment of minor bug fixes spread across many of the ath drivers. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQ/mtSHzPUi16IfDEksFbugiYzLewUCalUE+AAKCRAsFbugiYzL e41eAQD9fk23dZo0OlT3lWl4AO2VmUECeXFZ0SqCGMQ828t07wEA1NF/1Nzyf7xV 6S4gOVCX+lX8lm9AISx8lBcA6llb5g8= =aNPp -----END PGP SIGNATURE----- Merge tag 'ath-current-20260713' of git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath Jeff Johnson says: ================== ath.git update for v7.2-rc4 The most significant change is to fix an ath12k regression which led to low MLO RX throughput on WCN7850. The remainder are an assortment of minor bug fixes spread across many of the ath drivers. ================== Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
commit
b55a04ebb5
|
|
@ -706,6 +706,7 @@ static int ath10k_htt_rx_pop_paddr32_list(struct ath10k_htt *htt,
|
|||
if (!(__le32_to_cpu(rxd_attention->flags) &
|
||||
RX_ATTENTION_FLAGS_MSDU_DONE)) {
|
||||
ath10k_warn(htt->ar, "tried to pop an incomplete frame, oops!\n");
|
||||
__skb_queue_purge(list);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
|
@ -770,6 +771,7 @@ static int ath10k_htt_rx_pop_paddr64_list(struct ath10k_htt *htt,
|
|||
if (!(__le32_to_cpu(rxd_attention->flags) &
|
||||
RX_ATTENTION_FLAGS_MSDU_DONE)) {
|
||||
ath10k_warn(htt->ar, "tried to pop an incomplete frame, oops!\n");
|
||||
__skb_queue_purge(list);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -996,6 +996,7 @@ static int ath11k_ahb_fw_resources_init(struct ath11k_base *ab)
|
|||
ret = ath11k_ahb_setup_msa_resources(ab);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to setup msa resources\n");
|
||||
of_node_put(node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4618,6 +4618,9 @@ static void ath11k_hal_rx_msdu_list_get(struct ath11k *ar,
|
|||
msdu_details = &msdu_link->msdu_link[0];
|
||||
|
||||
for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
|
||||
if (!i && FIELD_GET(BUFFER_ADDR_INFO0_ADDR,
|
||||
msdu_details[i].buf_addr_info.info0) == 0)
|
||||
break;
|
||||
if (FIELD_GET(BUFFER_ADDR_INFO0_ADDR,
|
||||
msdu_details[i].buf_addr_info.info0) == 0) {
|
||||
msdu_desc_info = &msdu_details[i - 1].rx_msdu_info;
|
||||
|
|
|
|||
|
|
@ -199,6 +199,8 @@ static void ath11k_pci_soc_global_reset(struct ath11k_base *ab)
|
|||
val |= PCIE_SOC_GLOBAL_RESET_V;
|
||||
|
||||
ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
|
||||
/* Flush the posted write to the device */
|
||||
ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
|
||||
|
||||
/* TODO: exact time to sleep is uncertain */
|
||||
delay = 10;
|
||||
|
|
@ -208,6 +210,8 @@ static void ath11k_pci_soc_global_reset(struct ath11k_base *ab)
|
|||
val &= ~PCIE_SOC_GLOBAL_RESET_V;
|
||||
|
||||
ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
|
||||
/* Flush the posted write to the device */
|
||||
ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
|
||||
|
||||
mdelay(delay);
|
||||
|
||||
|
|
|
|||
|
|
@ -3294,9 +3294,14 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
|
|||
clear_bit(ATH11K_FLAG_CRASH_FLUSH,
|
||||
&ab->dev_flags);
|
||||
clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
|
||||
ath11k_core_qmi_firmware_ready(ab);
|
||||
set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
|
||||
|
||||
if (!test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
|
||||
ret = ath11k_core_qmi_firmware_ready(ab);
|
||||
if (ret) {
|
||||
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
||||
break;
|
||||
}
|
||||
set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
|
||||
}
|
||||
break;
|
||||
case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -274,11 +274,14 @@ int ath12k_dp_link_peer_rhash_tbl_init(struct ath12k_dp *dp)
|
|||
|
||||
void ath12k_dp_link_peer_rhash_tbl_destroy(struct ath12k_dp *dp)
|
||||
{
|
||||
mutex_lock(&dp->link_peer_rhash_tbl_lock);
|
||||
guard(mutex)(&dp->link_peer_rhash_tbl_lock);
|
||||
|
||||
if (!dp->rhead_peer_addr)
|
||||
return;
|
||||
|
||||
rhashtable_destroy(dp->rhead_peer_addr);
|
||||
kfree(dp->rhead_peer_addr);
|
||||
dp->rhead_peer_addr = NULL;
|
||||
mutex_unlock(&dp->link_peer_rhash_tbl_lock);
|
||||
}
|
||||
|
||||
static int ath12k_dp_link_peer_rhash_insert(struct ath12k_dp *dp,
|
||||
|
|
@ -570,6 +573,8 @@ int ath12k_dp_link_peer_assign(struct ath12k_dp *dp, struct ath12k_dp_hw *dp_hw,
|
|||
peerid_index = ath12k_dp_peer_get_peerid_index(dp, peer->peer_id);
|
||||
|
||||
rcu_assign_pointer(dp_peer->link_peers[peer->link_id], peer);
|
||||
WRITE_ONCE(dp_peer->link_peers_map,
|
||||
READ_ONCE(dp_peer->link_peers_map) | BIT(peer->link_id));
|
||||
|
||||
rcu_assign_pointer(dp_hw->dp_peers[peerid_index], dp_peer);
|
||||
|
||||
|
|
@ -632,6 +637,8 @@ void ath12k_dp_link_peer_unassign(struct ath12k_dp *dp, struct ath12k_dp_hw *dp_
|
|||
peerid_index = ath12k_dp_peer_get_peerid_index(dp, peer->peer_id);
|
||||
|
||||
rcu_assign_pointer(dp_peer->link_peers[peer->link_id], NULL);
|
||||
WRITE_ONCE(dp_peer->link_peers_map,
|
||||
READ_ONCE(dp_peer->link_peers_map) & ~BIT(peer->link_id));
|
||||
|
||||
rcu_assign_pointer(dp_hw->dp_peers[peerid_index], NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ struct ath12k_dp_peer {
|
|||
|
||||
/* Info used in MMIC verification of * RX fragments */
|
||||
struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
|
||||
unsigned long link_peers_map;
|
||||
struct ath12k_dp_link_peer __rcu *link_peers[ATH12K_NUM_MAX_LINKS];
|
||||
struct ath12k_reoq_buf reoq_bufs[IEEE80211_NUM_TIDS + 1];
|
||||
struct ath12k_dp_rx_tid rx_tid[IEEE80211_NUM_TIDS + 1];
|
||||
|
|
|
|||
|
|
@ -1384,10 +1384,9 @@ void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struc
|
|||
|
||||
pubsta = peer ? peer->sta : NULL;
|
||||
|
||||
if (pubsta && pubsta->valid_links) {
|
||||
status->link_valid = 1;
|
||||
status->link_id = peer->hw_links[rxcb->hw_link_id];
|
||||
}
|
||||
status->link_valid = 0;
|
||||
if (pubsta && pubsta->valid_links)
|
||||
ath12k_hw_set_rx_link_id(dp->hw_params, peer, rxcb, status);
|
||||
|
||||
ath12k_dbg(dp->ab, ATH12K_DBG_DATA,
|
||||
"rx skb %p len %u peer %pM %d %s sn %u %s%s%s%s%s%s%s%s%s%s rate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@
|
|||
#include "wmi.h"
|
||||
#include "hal.h"
|
||||
|
||||
struct ath12k_dp_peer;
|
||||
struct ath12k_skb_rxcb;
|
||||
struct ieee80211_rx_status;
|
||||
|
||||
/* Target configuration defines */
|
||||
|
||||
/* Num VDEVS per radio */
|
||||
|
|
@ -243,6 +247,9 @@ struct ath12k_hw_ops {
|
|||
bool (*dp_srng_is_tx_comp_ring)(int ring_num);
|
||||
bool (*is_frame_link_agnostic)(struct ath12k_link_vif *arvif,
|
||||
struct ieee80211_mgmt *mgmt);
|
||||
void (*set_rx_link_id)(struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status);
|
||||
};
|
||||
|
||||
static inline
|
||||
|
|
@ -273,6 +280,15 @@ static inline int ath12k_hw_mac_id_to_srng_id(const struct ath12k_hw_params *hw,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void ath12k_hw_set_rx_link_id(const struct ath12k_hw_params *hw,
|
||||
struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status)
|
||||
{
|
||||
if (hw->hw_ops->set_rx_link_id)
|
||||
hw->hw_ops->set_rx_link_id(dp_peer, rxcb, status);
|
||||
}
|
||||
|
||||
struct ath12k_fw_ie {
|
||||
__le32 id;
|
||||
__le32 len;
|
||||
|
|
|
|||
|
|
@ -1238,9 +1238,13 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
|
|||
/* cleanup dp peer */
|
||||
spin_lock_bh(&dp_hw->peer_lock);
|
||||
dp_peer = peer->dp_peer;
|
||||
peerid_index = ath12k_dp_peer_get_peerid_index(dp, peer->peer_id);
|
||||
rcu_assign_pointer(dp_peer->link_peers[peer->link_id], NULL);
|
||||
rcu_assign_pointer(dp_hw->dp_peers[peerid_index], NULL);
|
||||
if (dp_peer) {
|
||||
peerid_index = ath12k_dp_peer_get_peerid_index(dp, peer->peer_id);
|
||||
rcu_assign_pointer(dp_peer->link_peers[peer->link_id], NULL);
|
||||
WRITE_ONCE(dp_peer->link_peers_map,
|
||||
READ_ONCE(dp_peer->link_peers_map) & ~BIT(peer->link_id));
|
||||
rcu_assign_pointer(dp_hw->dp_peers[peerid_index], NULL);
|
||||
}
|
||||
spin_unlock_bh(&dp_hw->peer_lock);
|
||||
|
||||
ath12k_dp_link_peer_rhash_delete(dp, peer);
|
||||
|
|
|
|||
|
|
@ -188,6 +188,8 @@ static void ath12k_pci_soc_global_reset(struct ath12k_base *ab)
|
|||
val |= PCIE_SOC_GLOBAL_RESET_V;
|
||||
|
||||
ath12k_pci_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
|
||||
/* Flush the posted write to the device */
|
||||
ath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);
|
||||
|
||||
/* TODO: exact time to sleep is uncertain */
|
||||
delay = 10;
|
||||
|
|
@ -197,6 +199,8 @@ static void ath12k_pci_soc_global_reset(struct ath12k_base *ab)
|
|||
val &= ~PCIE_SOC_GLOBAL_RESET_V;
|
||||
|
||||
ath12k_pci_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
|
||||
/* Flush the posted write to the device */
|
||||
ath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);
|
||||
|
||||
mdelay(delay);
|
||||
|
||||
|
|
|
|||
|
|
@ -453,6 +453,9 @@ int ath12k_link_sta_rhash_tbl_init(struct ath12k_base *ab)
|
|||
|
||||
void ath12k_link_sta_rhash_tbl_destroy(struct ath12k_base *ab)
|
||||
{
|
||||
if (!ab->rhead_sta_addr)
|
||||
return;
|
||||
|
||||
rhashtable_destroy(ab->rhead_sta_addr);
|
||||
kfree(ab->rhead_sta_addr);
|
||||
ab->rhead_sta_addr = NULL;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "dp_rx.h"
|
||||
#include "../dp_peer.h"
|
||||
#include "../dp_tx.h"
|
||||
#include "../peer.h"
|
||||
#include "hal_qcn9274.h"
|
||||
|
|
@ -2315,3 +2316,35 @@ ath12k_wifi7_dp_rxdesc_mpdu_valid(struct ath12k_base *ab,
|
|||
|
||||
return tlv_tag == HAL_RX_MPDU_START;
|
||||
}
|
||||
|
||||
void
|
||||
ath12k_wifi7_dp_rx_set_link_id_qcn9274(struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status)
|
||||
{
|
||||
status->link_valid = 1;
|
||||
status->link_id = dp_peer->hw_links[rxcb->hw_link_id];
|
||||
}
|
||||
|
||||
void
|
||||
ath12k_wifi7_dp_rx_set_link_id_wcn7850(struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status)
|
||||
{
|
||||
struct ath12k_dp_link_peer *link_peer;
|
||||
unsigned long links_map;
|
||||
int i;
|
||||
|
||||
RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
|
||||
"ath12k set rx link id called without rcu lock");
|
||||
|
||||
links_map = READ_ONCE(dp_peer->link_peers_map);
|
||||
for_each_set_bit(i, &links_map, ATH12K_NUM_MAX_LINKS) {
|
||||
link_peer = rcu_dereference(dp_peer->link_peers[i]);
|
||||
if (link_peer && link_peer->peer_id == rxcb->peer_id) {
|
||||
status->link_valid = 1;
|
||||
status->link_id = link_peer->link_id;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,4 +57,10 @@ ath12k_wifi7_dp_rxdesc_mpdu_valid(struct ath12k_base *ab,
|
|||
struct hal_rx_desc *rx_desc);
|
||||
int ath12k_wifi7_dp_rx_tid_delete_handler(struct ath12k_base *ab,
|
||||
struct ath12k_dp_rx_tid_rxq *rx_tid);
|
||||
void ath12k_wifi7_dp_rx_set_link_id_qcn9274(struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status);
|
||||
void ath12k_wifi7_dp_rx_set_link_id_wcn7850(struct ath12k_dp_peer *dp_peer,
|
||||
struct ath12k_skb_rxcb *rxcb,
|
||||
struct ieee80211_rx_status *status);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ static const struct ath12k_hw_ops qcn9274_ops = {
|
|||
.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_qcn9274,
|
||||
.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_qcn9274,
|
||||
.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_qcn9274,
|
||||
.set_rx_link_id = ath12k_wifi7_dp_rx_set_link_id_qcn9274,
|
||||
};
|
||||
|
||||
static const struct ath12k_hw_ops wcn7850_ops = {
|
||||
|
|
@ -168,6 +169,7 @@ static const struct ath12k_hw_ops wcn7850_ops = {
|
|||
.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_wcn7850,
|
||||
.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_wcn7850,
|
||||
.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_wcn7850,
|
||||
.set_rx_link_id = ath12k_wifi7_dp_rx_set_link_id_wcn7850,
|
||||
};
|
||||
|
||||
static const struct ath12k_hw_ops qcc2072_ops = {
|
||||
|
|
@ -178,6 +180,7 @@ static const struct ath12k_hw_ops qcc2072_ops = {
|
|||
.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_wcn7850,
|
||||
.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_wcn7850,
|
||||
.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_wcn7850,
|
||||
.set_rx_link_id = ath12k_wifi7_dp_rx_set_link_id_wcn7850,
|
||||
};
|
||||
|
||||
#define ATH12K_TX_RING_MASK_0 0x1
|
||||
|
|
|
|||
|
|
@ -1723,13 +1723,15 @@ void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid_mux, u16 seq_no,
|
|||
|
||||
rxtid = &aggr_conn->rx_tid[tid];
|
||||
|
||||
if (win_sz < AGGR_WIN_SZ_MIN || win_sz > AGGR_WIN_SZ_MAX)
|
||||
ath6kl_dbg(ATH6KL_DBG_WLAN_RX, "%s: win_sz %d, tid %d\n",
|
||||
__func__, win_sz, tid);
|
||||
|
||||
if (rxtid->aggr)
|
||||
aggr_delete_tid_state(aggr_conn, tid);
|
||||
|
||||
if (win_sz < AGGR_WIN_SZ_MIN || win_sz > AGGR_WIN_SZ_MAX) {
|
||||
ath6kl_dbg(ATH6KL_DBG_WLAN_RX, "%s: win_sz %d, tid %d\n",
|
||||
__func__, win_sz, tid);
|
||||
return;
|
||||
}
|
||||
|
||||
rxtid->seq_next = seq_no;
|
||||
hold_q_size = TID_WINDOW_SZ(win_sz) * sizeof(struct skb_hold_q);
|
||||
rxtid->hold_q = kzalloc(hold_q_size, GFP_KERNEL);
|
||||
|
|
@ -1828,7 +1830,7 @@ void aggr_reset_state(struct aggr_info_conn *aggr_conn)
|
|||
return;
|
||||
|
||||
if (aggr_conn->timer_scheduled) {
|
||||
timer_delete(&aggr_conn->timer);
|
||||
timer_delete_sync(&aggr_conn->timer);
|
||||
aggr_conn->timer_scheduled = false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -484,6 +484,18 @@ static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len)
|
|||
|
||||
evt = (struct wmi_tx_complete_event *) datap;
|
||||
|
||||
if (len < sizeof(*evt)) {
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI, "tx complete: invalid len %d\n",
|
||||
len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (len < sizeof(*evt) + evt->num_msg * sizeof(struct tx_complete_msg_v1)) {
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI, "tx complete: invalid len %d for %u msgs\n",
|
||||
len, evt->num_msg);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI, "comp: %d %d %d\n",
|
||||
evt->num_msg, evt->msg_len, evt->msg_type);
|
||||
|
||||
|
|
@ -862,6 +874,14 @@ static int ath6kl_wmi_connect_event_rx(struct wmi *wmi, u8 *datap, int len,
|
|||
|
||||
ev = (struct wmi_connect_event *) datap;
|
||||
|
||||
if (len < sizeof(*ev) + ev->beacon_ie_len +
|
||||
ev->assoc_req_len + ev->assoc_resp_len) {
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI,
|
||||
"connect event: IE lengths %u+%u+%u exceed buffer %d\n",
|
||||
ev->beacon_ie_len, ev->assoc_req_len,
|
||||
ev->assoc_resp_len, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (vif->nw_type == AP_NETWORK) {
|
||||
/* AP mode start/STA connected event */
|
||||
struct net_device *dev = vif->ndev;
|
||||
|
|
|
|||
|
|
@ -1215,15 +1215,10 @@ static int ath9k_hif_request_firmware(struct hif_device_usb *hif_dev,
|
|||
ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
|
||||
&hif_dev->udev->dev, GFP_KERNEL,
|
||||
hif_dev, ath9k_hif_usb_firmware_cb);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
dev_err(&hif_dev->udev->dev,
|
||||
"ath9k_htc: Async request for firmware %s failed\n",
|
||||
hif_dev->fw_name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
|
||||
hif_dev->fw_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -150,7 +150,8 @@ static void carl9170_cmd_callback(struct ar9170 *ar, u32 len, void *buffer)
|
|||
spin_lock(&ar->cmd_lock);
|
||||
if (ar->readbuf) {
|
||||
if (len >= 4)
|
||||
memcpy(ar->readbuf, buffer + 4, len - 4);
|
||||
memcpy(ar->readbuf, buffer + 4,
|
||||
min_t(u32, len - 4, ar->readlen));
|
||||
|
||||
ar->readbuf = NULL;
|
||||
}
|
||||
|
|
@ -917,7 +918,9 @@ static void carl9170_rx_stream(struct ar9170 *ar, void *buf, unsigned int len)
|
|||
}
|
||||
}
|
||||
|
||||
skb_put_data(ar->rx_failover, tbuf, tlen);
|
||||
skb_put_data(ar->rx_failover, tbuf,
|
||||
min_t(unsigned int, tlen,
|
||||
ar->rx_failover_missing));
|
||||
ar->rx_failover_missing -= tlen;
|
||||
|
||||
if (ar->rx_failover_missing <= 0) {
|
||||
|
|
|
|||
|
|
@ -692,7 +692,7 @@ void carl9170_tx_process_status(struct ar9170 *ar,
|
|||
unsigned int i;
|
||||
|
||||
for (i = 0; i < cmd->hdr.ext; i++) {
|
||||
if (WARN_ON(i > ((cmd->hdr.len / 2) + 1))) {
|
||||
if (WARN_ON(i >= (cmd->hdr.len / 2))) {
|
||||
print_hex_dump_bytes("UU:", DUMP_PREFIX_NONE,
|
||||
(void *) cmd, cmd->hdr.len + 4);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user