Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/iwlwifi/fw/dhc-utils.h
48287 views
1
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2
/*
3
* Copyright (C) 2021, 2025 Intel Corporation
4
*/
5
#ifndef __iwl_fw_dhc_utils_h__
6
#define __iwl_fw_dhc_utils_h__
7
8
#include <linux/types.h>
9
#include "fw/img.h"
10
#include "api/commands.h"
11
#include "api/dhc.h"
12
13
/**
14
* iwl_dhc_resp_status - return status of DHC response
15
* @fw: firwmware image information
16
* @pkt: response packet, must not be %NULL
17
*
18
* Returns: the status value of the DHC command or (u32)-1 if the
19
* response was too short.
20
*/
21
static inline u32 iwl_dhc_resp_status(const struct iwl_fw *fw,
22
struct iwl_rx_packet *pkt)
23
{
24
if (iwl_fw_lookup_notif_ver(fw, IWL_ALWAYS_LONG_GROUP,
25
DEBUG_HOST_COMMAND, 1) >= 2) {
26
struct iwl_dhc_cmd_resp *resp = (void *)pkt->data;
27
28
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
29
return (u32)-1;
30
31
return le32_to_cpu(resp->status);
32
} else {
33
struct iwl_dhc_cmd_resp_v1 *resp = (void *)pkt->data;
34
35
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
36
return (u32)-1;
37
38
return le32_to_cpu(resp->status);
39
}
40
}
41
42
/**
43
* iwl_dhc_resp_data - return data pointer of DHC response
44
* @fw: firwmware image information
45
* @pkt: response packet, must not be %NULL
46
* @len: where to store the length
47
*
48
* Returns: The data pointer, or an ERR_PTR() if the data was
49
* not valid (too short).
50
*/
51
static inline void *iwl_dhc_resp_data(const struct iwl_fw *fw,
52
struct iwl_rx_packet *pkt,
53
unsigned int *len)
54
{
55
if (iwl_fw_lookup_notif_ver(fw, IWL_ALWAYS_LONG_GROUP,
56
DEBUG_HOST_COMMAND, 1) >= 2) {
57
struct iwl_dhc_cmd_resp *resp = (void *)pkt->data;
58
59
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
60
return ERR_PTR(-EINVAL);
61
62
*len = iwl_rx_packet_payload_len(pkt) - sizeof(*resp);
63
return (void *)&resp->data;
64
} else {
65
struct iwl_dhc_cmd_resp_v1 *resp = (void *)pkt->data;
66
67
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
68
return ERR_PTR(-EINVAL);
69
70
*len = iwl_rx_packet_payload_len(pkt) - sizeof(*resp);
71
return (void *)&resp->data;
72
}
73
}
74
75
#endif /* __iwl_fw_dhc_utils_h__ */
76
77