From: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> Date: Tue, 1 Oct 2024 13:38:27 +0200 Add a label so that a bit of exception handling can be better reused at the end of 53 function implementations. This issue was transformed by using the Coccinelle software. Signed-off-by: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> --- drivers/net/wireless/ath/ath10k/bmi.c | 7 +- drivers/net/wireless/ath/ath10k/usb.c | 15 +- drivers/net/wireless/ath/ath10k/wmi-tlv.c | 170 +++++++++++--------- drivers/net/wireless/ath/ath11k/wmi.c | 179 ++++++++++++---------- drivers/net/wireless/ath/ath12k/wmi.c | 166 +++++++++++--------- drivers/net/wireless/ath/ath6kl/usb.c | 15 +- 6 files changed, 306 insertions(+), 246 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/bmi.c b/drivers/net/wireless/ath/ath10k/bmi.c index 9a4f8e815412..01715ba4309f 100644 --- a/drivers/net/wireless/ath/ath10k/bmi.c +++ b/drivers/net/wireless/ath/ath10k/bmi.c @@ -375,17 +375,18 @@ static int ath10k_bmi_lz_data_large(struct ath10k *ar, const void *buffer, u32 l NULL, NULL); if (ret) { ath10k_warn(ar, "unable to write to the device\n"); - kfree(cmd); - return ret; + goto free_cmd; } buffer += txlen; length -= txlen; } + ret = 0; +free_cmd: kfree(cmd); - return 0; + return ret; } int ath10k_bmi_lz_data(struct ath10k *ar, const void *buffer, u32 length) diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c index 3b51b7f52130..b4ef0fdae144 100644 --- a/drivers/net/wireless/ath/ath10k/usb.c +++ b/drivers/net/wireless/ath/ath10k/usb.c @@ -504,13 +504,14 @@ static int ath10k_usb_submit_ctrl_out(struct ath10k *ar, if (ret < 0) { ath10k_warn(ar, "Failed to submit usb control message: %d\n", ret); - kfree(buf); - return ret; + goto free_buf; } + ret = 0; +free_buf: kfree(buf); - return 0; + return ret; } static int ath10k_usb_submit_ctrl_in(struct ath10k *ar, @@ -538,15 +539,15 @@ static int ath10k_usb_submit_ctrl_in(struct ath10k *ar, if (ret < 0) { ath10k_warn(ar, "Failed to read usb control message: %d\n", ret); - kfree(buf); - return ret; + goto free_buf; } memcpy((u8 *)data, buf, size); - + ret = 0; +free_buf: kfree(buf); - return 0; + return ret; } static int ath10k_usb_ctrl_msg_exchange(struct ath10k *ar, diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c index dbaf26d6a7a6..87c4573e923f 100644 --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c @@ -184,8 +184,8 @@ static int ath10k_wmi_tlv_event_bcn_tx_status(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_OFFLOAD_BCN_TX_STATUS_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } tx_status = __le32_to_cpu(ev->tx_status); @@ -209,8 +209,10 @@ static int ath10k_wmi_tlv_event_bcn_tx_status(struct ath10k *ar, if (arvif && arvif->is_up && arvif->vif->bss_conf.csa_active) ieee80211_queue_work(ar->hw, &arvif->ap_csa_work); + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath10k_wmi_tlv_event_vdev_delete_resp(struct ath10k *ar, @@ -279,8 +281,8 @@ static int ath10k_wmi_tlv_op_pull_peer_stats_info(struct ath10k *ar, data = tb[WMI_TLV_TAG_ARRAY_STRUCT]; if (!ev || !data) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } num_peer_stats = __le32_to_cpu(ev->num_peers); @@ -296,8 +298,10 @@ static int ath10k_wmi_tlv_op_pull_peer_stats_info(struct ath10k *ar, if (ret) ath10k_warn(ar, "failed to parse stats info tlv: %d\n", ret); + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath10k_wmi_tlv_event_peer_stats_info(struct ath10k *ar, @@ -327,8 +331,8 @@ static int ath10k_wmi_tlv_event_diag_data(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_DIAG_DATA_CONTAINER_EVENT]; data = tb[WMI_TLV_TAG_ARRAY_BYTE]; if (!ev || !data) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } num_items = __le32_to_cpu(ev->num_items); @@ -367,8 +371,10 @@ static int ath10k_wmi_tlv_event_diag_data(struct ath10k *ar, ath10k_warn(ar, "failed to parse diag data event: num_items %d len %d\n", num_items, len); + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_event_diag(struct ath10k *ar, @@ -387,16 +393,17 @@ static int ath10k_wmi_tlv_event_diag(struct ath10k *ar, data = tb[WMI_TLV_TAG_ARRAY_BYTE]; if (!data) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } len = ath10k_wmi_tlv_len(data); ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv diag event len %d\n", len); trace_ath10k_wmi_diag(ar, data, len); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_event_p2p_noa(struct ath10k *ar, @@ -418,8 +425,8 @@ static int ath10k_wmi_tlv_event_p2p_noa(struct ath10k *ar, noa = tb[WMI_TLV_TAG_STRUCT_P2P_NOA_INFO]; if (!ev || !noa) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } vdev_id = __le32_to_cpu(ev->vdev_id); @@ -429,8 +436,10 @@ static int ath10k_wmi_tlv_event_p2p_noa(struct ath10k *ar, vdev_id, noa->num_descriptors); ath10k_p2p_noa_update_by_vdev_id(ar, vdev_id, noa); + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar, @@ -450,8 +459,8 @@ static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_TX_PAUSE_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } pause_id = __le32_to_cpu(ev->pause_id); @@ -494,8 +503,10 @@ static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar, break; } + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath10k_wmi_tlv_event_rfkill_state_change(struct ath10k *ar, @@ -821,8 +832,8 @@ static int ath10k_wmi_tlv_op_pull_scan_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_SCAN_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->event_type = ev->event_type; @@ -831,9 +842,10 @@ static int ath10k_wmi_tlv_op_pull_scan_ev(struct ath10k *ar, arg->scan_req_id = ev->scan_req_id; arg->scan_id = ev->scan_id; arg->vdev_id = ev->vdev_id; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -853,8 +865,8 @@ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev(struct ath10k *ar, struct sk_buff *skb, ev = tb[WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->desc_id = ev->desc_id; @@ -865,8 +877,10 @@ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev(struct ath10k *ar, struct sk_buff *skb, if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map)) arg->ack_rssi = ev->ack_rssi; + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } struct wmi_tlv_tx_bundle_compl_parse { @@ -963,8 +977,8 @@ static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k *ar, frame = tb[WMI_TLV_TAG_ARRAY_BYTE]; if (!ev || !frame) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->channel = ev->channel; @@ -980,8 +994,8 @@ static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k *ar, msdu_len = __le32_to_cpu(arg->buf_len); if (skb->len < (frame - skb->data) + msdu_len) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } /* shift the sk_buff to point to `frame` */ @@ -989,9 +1003,10 @@ static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k *ar, skb_put(skb, frame - skb->data); skb_pull(skb, frame - skb->data); skb_put(skb, msdu_len); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k *ar, @@ -1011,8 +1026,8 @@ static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_CHAN_INFO_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->err_code = ev->err_code; @@ -1025,8 +1040,10 @@ static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k *ar, ar->running_fw->fw_file.fw_features)) arg->mac_clk_mhz = ev->mac_clk_mhz; + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -1046,8 +1063,8 @@ ath10k_wmi_tlv_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb, ev = tb[WMI_TLV_TAG_STRUCT_VDEV_START_RESPONSE_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } skb_pull(skb, sizeof(*ev)); @@ -1055,9 +1072,10 @@ ath10k_wmi_tlv_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb, arg->req_id = ev->req_id; arg->resp_type = ev->resp_type; arg->status = ev->status; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_op_pull_peer_kick_ev(struct ath10k *ar, @@ -1077,14 +1095,15 @@ static int ath10k_wmi_tlv_op_pull_peer_kick_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_PEER_STA_KICKOUT_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->mac_addr = ev->peer_macaddr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } struct wmi_tlv_swba_parse { @@ -1227,8 +1246,8 @@ static int ath10k_wmi_tlv_op_pull_phyerr_ev_hdr(struct ath10k *ar, phyerrs = tb[WMI_TLV_TAG_ARRAY_BYTE]; if (!ev || !phyerrs) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs); @@ -1236,9 +1255,10 @@ static int ath10k_wmi_tlv_op_pull_phyerr_ev_hdr(struct ath10k *ar, arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32); arg->buf_len = __le32_to_cpu(ev->buf_len); arg->phyerrs = phyerrs; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } #define WMI_TLV_ABI_VER_NS0 0x5F414351 @@ -1402,17 +1422,18 @@ static int ath10k_wmi_tlv_op_pull_rdy_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_READY_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->sw_version = ev->abi.abi_ver0; arg->abi_version = ev->abi.abi_ver1; arg->status = ev->status; arg->mac_addr = ev->mac_addr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_svc_avail_parse(struct ath10k *ar, u16 tag, u16 len, @@ -1515,8 +1536,8 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, data = tb[WMI_TLV_TAG_ARRAY_BYTE]; if (!ev || !data) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } data_len = ath10k_wmi_tlv_len(data); @@ -1539,8 +1560,8 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, src = data; if (data_len < sizeof(*src)) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } data += sizeof(*src); @@ -1562,8 +1583,8 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, src = data; if (data_len < sizeof(*src)) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } data += sizeof(*src); @@ -1583,8 +1604,8 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, src = data; if (data_len < sizeof(*src)) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } data += sizeof(*src); @@ -1621,8 +1642,10 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, list_add_tail(&dst->list, &stats->peers); } + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_op_pull_roam_ev(struct ath10k *ar, @@ -1642,16 +1665,17 @@ static int ath10k_wmi_tlv_op_pull_roam_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_ROAM_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->vdev_id = ev->vdev_id; arg->reason = ev->reason; arg->rssi = ev->rssi; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -1671,17 +1695,18 @@ ath10k_wmi_tlv_op_pull_wow_ev(struct ath10k *ar, struct sk_buff *skb, ev = tb[WMI_TLV_TAG_STRUCT_WOW_EVENT_INFO]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->vdev_id = __le32_to_cpu(ev->vdev_id); arg->flag = __le32_to_cpu(ev->flag); arg->wake_reason = __le32_to_cpu(ev->wake_reason); arg->data_len = __le32_to_cpu(ev->data_len); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath10k_wmi_tlv_op_pull_echo_ev(struct ath10k *ar, @@ -1701,14 +1726,15 @@ static int ath10k_wmi_tlv_op_pull_echo_ev(struct ath10k *ar, ev = tb[WMI_TLV_TAG_STRUCT_ECHO_EVENT]; if (!ev) { - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->value = ev->value; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static struct sk_buff * diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c index 87abfa547529..5ce507b49d20 100644 --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -5130,8 +5130,8 @@ static int ath11k_pull_vdev_start_resp_tlv(struct ath11k_base *ab, struct sk_buf ev = tb[WMI_TAG_VDEV_START_RESPONSE_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch vdev start resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } memset(vdev_rsp, 0, sizeof(*vdev_rsp)); @@ -5146,9 +5146,10 @@ static int ath11k_pull_vdev_start_resp_tlv(struct ath11k_base *ab, struct sk_buf vdev_rsp->cfgd_tx_streams = ev->cfgd_tx_streams; vdev_rsp->cfgd_rx_streams = ev->cfgd_rx_streams; vdev_rsp->max_allowed_tx_power = ev->max_allowed_tx_power; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath11k_print_reg_rule(struct ath11k_base *ab, const char *band, @@ -5230,8 +5231,8 @@ static int ath11k_pull_reg_chan_list_update_ev(struct ath11k_base *ab, chan_list_event_hdr = tb[WMI_TAG_REG_CHAN_LIST_CC_EVENT]; if (!chan_list_event_hdr) { ath11k_warn(ab, "failed to fetch reg chan list update ev\n"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } reg_info->num_2ghz_reg_rules = chan_list_event_hdr->num_2ghz_reg_rules; @@ -5239,8 +5240,8 @@ static int ath11k_pull_reg_chan_list_update_ev(struct ath11k_base *ab, if (!(reg_info->num_2ghz_reg_rules + reg_info->num_5ghz_reg_rules)) { ath11k_warn(ab, "No regulatory rules available in the event info\n"); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } memcpy(reg_info->alpha2, &chan_list_event_hdr->alpha2, @@ -5289,9 +5290,9 @@ static int ath11k_pull_reg_chan_list_update_ev(struct ath11k_base *ab, create_reg_rules_from_wmi(num_2ghz_reg_rules, wmi_reg_rule); if (!reg_info->reg_rules_2ghz_ptr) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, "2 GHz", @@ -5305,9 +5306,9 @@ static int ath11k_pull_reg_chan_list_update_ev(struct ath11k_base *ab, create_reg_rules_from_wmi(num_5ghz_reg_rules, wmi_reg_rule); if (!reg_info->reg_rules_5ghz_ptr) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, "5 GHz", @@ -5316,9 +5317,10 @@ static int ath11k_pull_reg_chan_list_update_ev(struct ath11k_base *ab, } ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory channel list\n"); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static struct cur_reg_rule @@ -5406,8 +5408,8 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ev = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch reg chan list ext update ev\n"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } reg_info->num_2ghz_reg_rules = ev->num_2ghz_reg_rules; @@ -5438,8 +5440,8 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, (num_5ghz_reg_rules > MAX_REG_RULES)) { ath11k_warn(ab, "Num reg rules for 2.4 GHz/5 GHz exceeds max limit (num_2ghz_reg_rules: %d num_5ghz_reg_rules: %d max_rules: %d)\n", num_2ghz_reg_rules, num_5ghz_reg_rules, MAX_REG_RULES); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { @@ -5448,8 +5450,8 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, if (num_6ghz_reg_rules_ap[i] > MAX_6GHZ_REG_RULES) { ath11k_warn(ab, "Num 6 GHz reg rules for AP mode(%d) exceeds max limit (num_6ghz_reg_rules_ap: %d, max_rules: %d)\n", i, num_6ghz_reg_rules_ap[i], MAX_6GHZ_REG_RULES); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } total_reg_rules += num_6ghz_reg_rules_ap[i]; @@ -5476,15 +5478,15 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ath11k_warn(ab, "Num 6 GHz client reg rules exceeds max limit, for client(type: %d)\n", i); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } } if (!total_reg_rules) { ath11k_warn(ab, "No reg rules available\n"); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } memcpy(reg_info->alpha2, &ev->alpha2, REG_ALPHA2_LEN); @@ -5597,9 +5599,9 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_2ghz_ptr) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, "2 GHz", @@ -5636,9 +5638,9 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_5ghz_ptr) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, "5 GHz", @@ -5659,9 +5661,9 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_6ghz_ap_ptr[i]) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 6 GHz AP rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, ath11k_6ghz_ap_type_to_str(i), @@ -5681,9 +5683,9 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_6ghz_client_ptr[j][i]) { - kfree(tb); ath11k_warn(ab, "Unable to Allocate memory for 6 GHz client rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ath11k_print_reg_rule(ab, @@ -5740,9 +5742,10 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, ath11k_super_reg_6ghz_to_str(reg_info->domain_code_6ghz_super_id)); ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory ext channel list\n"); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_peer_del_resp_ev(struct ath11k_base *ab, struct sk_buff *skb, @@ -5762,8 +5765,8 @@ static int ath11k_pull_peer_del_resp_ev(struct ath11k_base *ab, struct sk_buff * ev = tb[WMI_TAG_PEER_DELETE_RESP_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch peer delete resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } memset(peer_del_resp, 0, sizeof(*peer_del_resp)); @@ -5771,9 +5774,10 @@ static int ath11k_pull_peer_del_resp_ev(struct ath11k_base *ab, struct sk_buff * peer_del_resp->vdev_id = ev->vdev_id; ether_addr_copy(peer_del_resp->peer_macaddr.addr, ev->peer_macaddr.addr); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_vdev_del_resp_ev(struct ath11k_base *ab, @@ -5794,14 +5798,15 @@ static int ath11k_pull_vdev_del_resp_ev(struct ath11k_base *ab, ev = tb[WMI_TAG_VDEV_DELETE_RESP_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch vdev delete resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = ev->vdev_id; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_bcn_tx_status_ev(struct ath11k_base *ab, @@ -5822,15 +5827,16 @@ static int ath11k_pull_bcn_tx_status_ev(struct ath11k_base *ab, ev = tb[WMI_TAG_OFFLOAD_BCN_TX_STATUS_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch bcn tx status ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = ev->vdev_id; *tx_status = ev->tx_status; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_vdev_stopped_param_tlv(struct ath11k_base *ab, struct sk_buff *skb, @@ -5850,14 +5856,15 @@ static int ath11k_pull_vdev_stopped_param_tlv(struct ath11k_base *ab, struct sk_ ev = tb[WMI_TAG_VDEV_STOPPED_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch vdev stop ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = ev->vdev_id; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_wmi_tlv_mgmt_rx_parse(struct ath11k_base *ab, @@ -6004,17 +6011,18 @@ static int ath11k_pull_mgmt_tx_compl_param_tlv(struct ath11k_base *ab, ev = tb[WMI_TAG_MGMT_TX_COMPL_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch mgmt tx compl ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } param->pdev_id = ev->pdev_id; param->desc_id = ev->desc_id; param->status = ev->status; param->ack_rssi = ev->ack_rssi; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath11k_wmi_event_scan_started(struct ath11k *ar) @@ -6180,8 +6188,8 @@ static int ath11k_pull_scan_ev(struct ath11k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_SCAN_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch scan ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } scan_evt_param->event_type = ev->event_type; @@ -6191,9 +6199,10 @@ static int ath11k_pull_scan_ev(struct ath11k_base *ab, struct sk_buff *skb, scan_evt_param->scan_id = ev->scan_id; scan_evt_param->vdev_id = ev->vdev_id; scan_evt_param->tsf_timestamp = ev->tsf_timestamp; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_peer_sta_kickout_ev(struct ath11k_base *ab, struct sk_buff *skb, @@ -6213,14 +6222,15 @@ static int ath11k_pull_peer_sta_kickout_ev(struct ath11k_base *ab, struct sk_buf ev = tb[WMI_TAG_PEER_STA_KICKOUT_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch peer sta kickout ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->mac_addr = ev->peer_macaddr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_roam_ev(struct ath11k_base *ab, struct sk_buff *skb, @@ -6240,16 +6250,17 @@ static int ath11k_pull_roam_ev(struct ath11k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_ROAM_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch roam ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } roam_ev->vdev_id = ev->vdev_id; roam_ev->reason = ev->reason; roam_ev->rssi = ev->rssi; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int freq_to_idx(struct ath11k *ar, int freq) @@ -6288,8 +6299,8 @@ static int ath11k_pull_chan_info_ev(struct ath11k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_CHAN_INFO_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch chan info ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } ch_info_ev->err_code = ev->err_code; @@ -6304,9 +6315,10 @@ static int ath11k_pull_chan_info_ev(struct ath11k_base *ab, struct sk_buff *skb, ch_info_ev->tx_frame_cnt = ev->tx_frame_cnt; ch_info_ev->mac_clk_mhz = ev->mac_clk_mhz; ch_info_ev->vdev_id = ev->vdev_id; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -6327,8 +6339,8 @@ ath11k_pull_pdev_bss_chan_info_ev(struct ath11k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_PDEV_BSS_CHAN_INFO_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch pdev bss chan info ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } bss_ch_info_ev->pdev_id = ev->pdev_id; @@ -6344,9 +6356,10 @@ ath11k_pull_pdev_bss_chan_info_ev(struct ath11k_base *ab, struct sk_buff *skb, bss_ch_info_ev->rx_cycle_count_high = ev->rx_cycle_count_high; bss_ch_info_ev->rx_bss_cycle_count_low = ev->rx_bss_cycle_count_low; bss_ch_info_ev->rx_bss_cycle_count_high = ev->rx_bss_cycle_count_high; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -6367,8 +6380,8 @@ ath11k_pull_vdev_install_key_compl_ev(struct ath11k_base *ab, struct sk_buff *sk ev = tb[WMI_TAG_VDEV_INSTALL_KEY_COMPLETE_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch vdev install key compl ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->vdev_id = ev->vdev_id; @@ -6376,9 +6389,10 @@ ath11k_pull_vdev_install_key_compl_ev(struct ath11k_base *ab, struct sk_buff *sk arg->key_idx = ev->key_idx; arg->key_flags = ev->key_flags; arg->status = ev->status; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath11k_pull_peer_assoc_conf_ev(struct ath11k_base *ab, struct sk_buff *skb, @@ -6398,15 +6412,16 @@ static int ath11k_pull_peer_assoc_conf_ev(struct ath11k_base *ab, struct sk_buff ev = tb[WMI_TAG_PEER_ASSOC_CONF_EVENT]; if (!ev) { ath11k_warn(ab, "failed to fetch peer assoc conf ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } peer_assoc_conf->vdev_id = ev->vdev_id; peer_assoc_conf->macaddr = ev->peer_macaddr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath11k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src, diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index 190439ad7f23..c4578be1676e 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -4628,14 +4628,15 @@ static int ath12k_pull_vdev_start_resp_tlv(struct ath12k_base *ab, struct sk_buf ev = tb[WMI_TAG_VDEV_START_RESPONSE_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch vdev start resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_rsp = *ev; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static struct ath12k_reg_rule @@ -4706,8 +4707,8 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, ev = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch reg chan list ext update ev\n"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } reg_info->num_2g_reg_rules = le32_to_cpu(ev->num_2g_reg_rules); @@ -4736,8 +4737,8 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, if (num_2g_reg_rules > MAX_REG_RULES || num_5g_reg_rules > MAX_REG_RULES) { ath12k_warn(ab, "Num reg rules for 2G/5G exceeds max limit (num_2g_reg_rules: %d num_5g_reg_rules: %d max_rules: %d)\n", num_2g_reg_rules, num_5g_reg_rules, MAX_REG_RULES); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { @@ -4746,8 +4747,8 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, if (num_6g_reg_rules_ap[i] > MAX_6G_REG_RULES) { ath12k_warn(ab, "Num 6G reg rules for AP mode(%d) exceeds max limit (num_6g_reg_rules_ap: %d, max_rules: %d)\n", i, num_6g_reg_rules_ap[i], MAX_6G_REG_RULES); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } total_reg_rules += num_6g_reg_rules_ap[i]; @@ -4771,15 +4772,15 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, num_6g_reg_rules_cl[WMI_REG_VLP_AP][i] > MAX_6G_REG_RULES) { ath12k_warn(ab, "Num 6g client reg rules exceeds max limit, for client(type: %d)\n", i); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } } if (!total_reg_rules) { ath12k_warn(ab, "No reg rules available\n"); - kfree(tb); - return -EINVAL; + ret = -EINVAL; + goto free_tb; } memcpy(reg_info->alpha2, &ev->alpha2, REG_ALPHA2_LEN); @@ -4894,9 +4895,9 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_2g_ptr) { - kfree(tb); ath12k_warn(ab, "Unable to Allocate memory for 2g rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } } @@ -4907,9 +4908,9 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_5g_ptr) { - kfree(tb); ath12k_warn(ab, "Unable to Allocate memory for 5g rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } } @@ -4921,9 +4922,9 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_6g_ap_ptr[i]) { - kfree(tb); ath12k_warn(ab, "Unable to Allocate memory for 6g ap rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ext_wmi_reg_rule += num_6g_reg_rules_ap[i]; @@ -4936,9 +4937,9 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, ext_wmi_reg_rule); if (!reg_info->reg_rules_6g_client_ptr[j][i]) { - kfree(tb); ath12k_warn(ab, "Unable to Allocate memory for 6g client rules\n"); - return -ENOMEM; + ret = -ENOMEM; + goto free_tb; } ext_wmi_reg_rule += num_6g_reg_rules_cl[j][i]; @@ -4970,9 +4971,10 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab, reg_info->client_type, reg_info->domain_code_6g_super_id); ath12k_dbg(ab, ATH12K_DBG_WMI, "processed regulatory ext channel list\n"); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_peer_del_resp_ev(struct ath12k_base *ab, struct sk_buff *skb, @@ -4992,8 +4994,8 @@ static int ath12k_pull_peer_del_resp_ev(struct ath12k_base *ab, struct sk_buff * ev = tb[WMI_TAG_PEER_DELETE_RESP_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch peer delete resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } memset(peer_del_resp, 0, sizeof(*peer_del_resp)); @@ -5001,9 +5003,10 @@ static int ath12k_pull_peer_del_resp_ev(struct ath12k_base *ab, struct sk_buff * peer_del_resp->vdev_id = ev->vdev_id; ether_addr_copy(peer_del_resp->peer_macaddr.addr, ev->peer_macaddr.addr); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_vdev_del_resp_ev(struct ath12k_base *ab, @@ -5024,14 +5027,15 @@ static int ath12k_pull_vdev_del_resp_ev(struct ath12k_base *ab, ev = tb[WMI_TAG_VDEV_DELETE_RESP_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch vdev delete resp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = le32_to_cpu(ev->vdev_id); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_bcn_tx_status_ev(struct ath12k_base *ab, @@ -5052,15 +5056,16 @@ static int ath12k_pull_bcn_tx_status_ev(struct ath12k_base *ab, ev = tb[WMI_TAG_OFFLOAD_BCN_TX_STATUS_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch bcn tx status ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = le32_to_cpu(ev->vdev_id); *tx_status = le32_to_cpu(ev->tx_status); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_vdev_stopped_param_tlv(struct ath12k_base *ab, struct sk_buff *skb, @@ -5080,14 +5085,15 @@ static int ath12k_pull_vdev_stopped_param_tlv(struct ath12k_base *ab, struct sk_ ev = tb[WMI_TAG_VDEV_STOPPED_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch vdev stop ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } *vdev_id = le32_to_cpu(ev->vdev_id); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_wmi_tlv_mgmt_rx_parse(struct ath12k_base *ab, @@ -5224,16 +5230,17 @@ static int ath12k_pull_mgmt_tx_compl_param_tlv(struct ath12k_base *ab, ev = tb[WMI_TAG_MGMT_TX_COMPL_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch mgmt tx compl ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } param->pdev_id = ev->pdev_id; param->desc_id = ev->desc_id; param->status = ev->status; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath12k_wmi_event_scan_started(struct ath12k *ar) @@ -5405,8 +5412,8 @@ static int ath12k_pull_scan_ev(struct ath12k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_SCAN_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch scan ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } scan_evt_param->event_type = ev->event_type; @@ -5416,9 +5423,10 @@ static int ath12k_pull_scan_ev(struct ath12k_base *ab, struct sk_buff *skb, scan_evt_param->scan_id = ev->scan_id; scan_evt_param->vdev_id = ev->vdev_id; scan_evt_param->tsf_timestamp = ev->tsf_timestamp; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_peer_sta_kickout_ev(struct ath12k_base *ab, struct sk_buff *skb, @@ -5438,14 +5446,15 @@ static int ath12k_pull_peer_sta_kickout_ev(struct ath12k_base *ab, struct sk_buf ev = tb[WMI_TAG_PEER_STA_KICKOUT_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch peer sta kickout ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->mac_addr = ev->peer_macaddr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_roam_ev(struct ath12k_base *ab, struct sk_buff *skb, @@ -5465,16 +5474,17 @@ static int ath12k_pull_roam_ev(struct ath12k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_ROAM_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch roam ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } roam_ev->vdev_id = ev->vdev_id; roam_ev->reason = ev->reason; roam_ev->rssi = ev->rssi; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int freq_to_idx(struct ath12k *ar, int freq) @@ -5517,8 +5527,8 @@ static int ath12k_pull_chan_info_ev(struct ath12k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_CHAN_INFO_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch chan info ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } ch_info_ev->err_code = ev->err_code; @@ -5533,9 +5543,10 @@ static int ath12k_pull_chan_info_ev(struct ath12k_base *ab, struct sk_buff *skb, ch_info_ev->tx_frame_cnt = ev->tx_frame_cnt; ch_info_ev->mac_clk_mhz = ev->mac_clk_mhz; ch_info_ev->vdev_id = ev->vdev_id; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -5556,8 +5567,8 @@ ath12k_pull_pdev_bss_chan_info_ev(struct ath12k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_PDEV_BSS_CHAN_INFO_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch pdev bss chan info ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } bss_ch_info_ev->pdev_id = ev->pdev_id; @@ -5573,9 +5584,10 @@ ath12k_pull_pdev_bss_chan_info_ev(struct ath12k_base *ab, struct sk_buff *skb, bss_ch_info_ev->rx_cycle_count_high = ev->rx_cycle_count_high; bss_ch_info_ev->rx_bss_cycle_count_low = ev->rx_bss_cycle_count_low; bss_ch_info_ev->rx_bss_cycle_count_high = ev->rx_bss_cycle_count_high; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -5596,8 +5608,8 @@ ath12k_pull_vdev_install_key_compl_ev(struct ath12k_base *ab, struct sk_buff *sk ev = tb[WMI_TAG_VDEV_INSTALL_KEY_COMPLETE_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch vdev install key compl ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } arg->vdev_id = le32_to_cpu(ev->vdev_id); @@ -5605,9 +5617,10 @@ ath12k_pull_vdev_install_key_compl_ev(struct ath12k_base *ab, struct sk_buff *sk arg->key_idx = le32_to_cpu(ev->key_idx); arg->key_flags = le32_to_cpu(ev->key_flags); arg->status = le32_to_cpu(ev->status); - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int ath12k_pull_peer_assoc_conf_ev(struct ath12k_base *ab, struct sk_buff *skb, @@ -5627,15 +5640,16 @@ static int ath12k_pull_peer_assoc_conf_ev(struct ath12k_base *ab, struct sk_buff ev = tb[WMI_TAG_PEER_ASSOC_CONF_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch peer assoc conf ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } peer_assoc_conf->vdev_id = le32_to_cpu(ev->vdev_id); peer_assoc_conf->macaddr = ev->peer_macaddr.addr; - + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static int @@ -5655,12 +5669,14 @@ ath12k_pull_pdev_temp_ev(struct ath12k_base *ab, struct sk_buff *skb, ev = tb[WMI_TAG_PDEV_TEMPERATURE_EVENT]; if (!ev) { ath12k_warn(ab, "failed to fetch pdev temp ev"); - kfree(tb); - return -EPROTO; + ret = -EPROTO; + goto free_tb; } + ret = 0; +free_tb: kfree(tb); - return 0; + return ret; } static void ath12k_wmi_op_ep_tx_credits(struct ath12k_base *ab) diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c index 5220809841a6..ea27eb535a02 100644 --- a/drivers/net/wireless/ath/ath6kl/usb.c +++ b/drivers/net/wireless/ath/ath6kl/usb.c @@ -892,13 +892,14 @@ static int ath6kl_usb_submit_ctrl_out(struct ath6kl_usb *ar_usb, if (ret < 0) { ath6kl_warn("Failed to submit usb control message: %d\n", ret); - kfree(buf); - return ret; + goto free_buf; } + ret = 0; +free_buf: kfree(buf); - return 0; + return ret; } static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb, @@ -924,15 +925,15 @@ static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb, if (ret < 0) { ath6kl_warn("Failed to read usb control message: %d\n", ret); - kfree(buf); - return ret; + goto free_buf; } memcpy((u8 *) data, buf, size); - + ret = 0; +free_buf: kfree(buf); - return 0; + return ret; } static int ath6kl_usb_ctrl_msg_exchange(struct ath6kl_usb *ar_usb, -- 2.46.1