if (wdev->chip_frozen)
                return 0;
        wfx_alloc_hif(0, &hif);
+       if (!hif)
+               return -ENOMEM;
        wfx_fill_header(hif, -1, HIF_REQ_ID_SHUT_DOWN, 0);
        ret = wfx_cmd_send(wdev, hif, NULL, 0, true);
        // After this command, chip won't reply. Be sure to give enough time to
        struct hif_msg *hif;
        struct hif_req_configuration *body = wfx_alloc_hif(buf_len, &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->length = cpu_to_le16(len);
        memcpy(body->pds_data, conf, len);
        wfx_fill_header(hif, -1, HIF_REQ_ID_CONFIGURATION, buf_len);
        struct hif_msg *hif;
        struct hif_req_reset *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->reset_flags.reset_stat = reset_stat;
        wfx_fill_header(hif, wvif->id, HIF_REQ_ID_RESET, sizeof(*body));
        ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
        struct hif_req_read_mib *body = wfx_alloc_hif(sizeof(*body), &hif);
        struct hif_cnf_read_mib *reply = kmalloc(buf_len, GFP_KERNEL);
 
+       if (!body || !reply) {
+               ret = -ENOMEM;
+               goto out;
+       }
        body->mib_id = cpu_to_le16(mib_id);
        wfx_fill_header(hif, vif_id, HIF_REQ_ID_READ_MIB, sizeof(*body));
        ret = wfx_cmd_send(wdev, hif, reply, buf_len, false);
                memcpy(val, &reply->mib_data, le16_to_cpu(reply->length));
        else
                memset(val, 0xFF, val_len);
+out:
        kfree(hif);
        kfree(reply);
        return ret;
        int buf_len = sizeof(struct hif_req_write_mib) + val_len;
        struct hif_req_write_mib *body = wfx_alloc_hif(buf_len, &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->mib_id = cpu_to_le16(mib_id);
        body->length = cpu_to_le16(val_len);
        memcpy(&body->mib_data, val, val_len);
 
        compiletime_assert(IEEE80211_MAX_SSID_LEN == HIF_API_SSID_SIZE,
                           "API inconsistency");
+       if (!hif)
+               return -ENOMEM;
        for (i = 0; i < req->n_ssids; i++) {
                memcpy(body->ssid_def[i].ssid, req->ssids[i].ssid,
                       IEEE80211_MAX_SSID_LEN);
        // body associated to HIF_REQ_ID_STOP_SCAN is empty
        wfx_alloc_hif(0, &hif);
 
+       if (!hif)
+               return -ENOMEM;
        wfx_fill_header(hif, wvif->id, HIF_REQ_ID_STOP_SCAN, 0);
        ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
        kfree(hif);
        WARN_ON(!conf->basic_rates);
        WARN_ON(sizeof(body->ssid) < ssidlen);
        WARN(!conf->ibss_joined && !ssidlen, "joining an unknown BSS");
+       if (!hif)
+               return -ENOMEM;
        body->infrastructure_bss_mode = !conf->ibss_joined;
        body->short_preamble = conf->use_short_preamble;
        if (channel && channel->flags & IEEE80211_CHAN_NO_IR)
        struct hif_req_set_bss_params *body =
                wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->aid = cpu_to_le16(aid);
        body->beacon_lost_count = beacon_lost_count;
        wfx_fill_header(hif, wvif->id, HIF_REQ_ID_SET_BSS_PARAMS,
        // FIXME: only send necessary bits
        struct hif_req_add_key *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        // FIXME: swap bytes as necessary in body
        memcpy(body, arg, sizeof(*body));
        if (wfx_api_older_than(wdev, 1, 5))
        struct hif_msg *hif;
        struct hif_req_remove_key *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->entry_index = idx;
        wfx_fill_header(hif, -1, HIF_REQ_ID_REMOVE_KEY, sizeof(*body));
        ret = wfx_cmd_send(wdev, hif, NULL, 0, false);
                return -ENOMEM;
 
        WARN_ON(arg->aifs > 255);
+       if (!hif)
+               return -ENOMEM;
        body->aifsn = arg->aifs;
        body->cw_min = cpu_to_le16(arg->cw_min);
        body->cw_max = cpu_to_le16(arg->cw_max);
        if (!body)
                return -ENOMEM;
 
+       if (!hif)
+               return -ENOMEM;
        if (ps) {
                body->pm_mode.enter_psm = 1;
                // Firmware does not support more than 128ms
        struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif);
 
        WARN_ON(!conf->beacon_int);
+       if (!hif)
+               return -ENOMEM;
        body->dtim_period = conf->dtim_period;
        body->short_preamble = conf->use_short_preamble;
        body->channel_number = channel->hw_value;
        struct hif_req_beacon_transmit *body = wfx_alloc_hif(sizeof(*body),
                                                             &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->enable_beaconing = enable ? 1 : 0;
        wfx_fill_header(hif, wvif->id, HIF_REQ_ID_BEACON_TRANSMIT,
                        sizeof(*body));
        struct hif_msg *hif;
        struct hif_req_map_link *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        if (mac_addr)
                ether_addr_copy(body->mac_addr, mac_addr);
        body->map_link_flags = *(struct hif_map_link_flags *)&flags;
        int buf_len = sizeof(struct hif_req_update_ie) + ies_len;
        struct hif_req_update_ie *body = wfx_alloc_hif(buf_len, &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->ie_flags.beacon = 1;
        body->num_ies = cpu_to_le16(1);
        memcpy(body->ie, ies, ies_len);
        struct hif_req_sl_exchange_pub_keys *body = wfx_alloc_hif(sizeof(*body),
                                                                  &hif);
 
+       if (!hif)
+               return -ENOMEM;
        body->algorithm = HIF_SL_CURVE25519;
        memcpy(body->host_pub_key, pubkey, sizeof(body->host_pub_key));
        memcpy(body->host_pub_key_mac, pubkey_hmac,
        struct hif_msg *hif;
        struct hif_req_sl_configure *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+       if (!hif)
+               return -ENOMEM;
        memcpy(body->encr_bmp, bitmap, sizeof(body->encr_bmp));
        wfx_fill_header(hif, -1, HIF_REQ_ID_SL_CONFIGURE, sizeof(*body));
        ret = wfx_cmd_send(wdev, hif, NULL, 0, false);
        struct hif_req_set_sl_mac_key *body = wfx_alloc_hif(sizeof(*body),
                                                            &hif);
 
+       if (!hif)
+               return -ENOMEM;
        memcpy(body->key_value, slk_key, sizeof(body->key_value));
        body->otp_or_ram = destination;
        wfx_fill_header(hif, -1, HIF_REQ_ID_SET_SL_MAC_KEY, sizeof(*body));