mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-21 06:50:25 +00:00
76 lines
2 KiB
C
76 lines
2 KiB
C
![]() |
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||
|
/*
|
||
|
* Copyright (C) 2021, 2025 Intel Corporation
|
||
|
*/
|
||
|
#ifndef __iwl_fw_dhc_utils_h__
|
||
|
#define __iwl_fw_dhc_utils_h__
|
||
|
|
||
|
#include <linux/types.h>
|
||
|
#include "fw/img.h"
|
||
|
#include "api/commands.h"
|
||
|
#include "api/dhc.h"
|
||
|
|
||
|
/**
|
||
|
* iwl_dhc_resp_status - return status of DHC response
|
||
|
* @fw: firwmware image information
|
||
|
* @pkt: response packet, must not be %NULL
|
||
|
*
|
||
|
* Returns: the status value of the DHC command or (u32)-1 if the
|
||
|
* response was too short.
|
||
|
*/
|
||
|
static inline u32 iwl_dhc_resp_status(const struct iwl_fw *fw,
|
||
|
struct iwl_rx_packet *pkt)
|
||
|
{
|
||
|
if (iwl_fw_lookup_notif_ver(fw, IWL_ALWAYS_LONG_GROUP,
|
||
|
DEBUG_HOST_COMMAND, 1) >= 2) {
|
||
|
struct iwl_dhc_cmd_resp *resp = (void *)pkt->data;
|
||
|
|
||
|
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
|
||
|
return (u32)-1;
|
||
|
|
||
|
return le32_to_cpu(resp->status);
|
||
|
} else {
|
||
|
struct iwl_dhc_cmd_resp_v1 *resp = (void *)pkt->data;
|
||
|
|
||
|
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
|
||
|
return (u32)-1;
|
||
|
|
||
|
return le32_to_cpu(resp->status);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* iwl_dhc_resp_data - return data pointer of DHC response
|
||
|
* @fw: firwmware image information
|
||
|
* @pkt: response packet, must not be %NULL
|
||
|
* @len: where to store the length
|
||
|
*
|
||
|
* Returns: The data pointer, or an ERR_PTR() if the data was
|
||
|
* not valid (too short).
|
||
|
*/
|
||
|
static inline void *iwl_dhc_resp_data(const struct iwl_fw *fw,
|
||
|
struct iwl_rx_packet *pkt,
|
||
|
unsigned int *len)
|
||
|
{
|
||
|
if (iwl_fw_lookup_notif_ver(fw, IWL_ALWAYS_LONG_GROUP,
|
||
|
DEBUG_HOST_COMMAND, 1) >= 2) {
|
||
|
struct iwl_dhc_cmd_resp *resp = (void *)pkt->data;
|
||
|
|
||
|
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
|
||
|
return ERR_PTR(-EINVAL);
|
||
|
|
||
|
*len = iwl_rx_packet_payload_len(pkt) - sizeof(*resp);
|
||
|
return (void *)&resp->data;
|
||
|
} else {
|
||
|
struct iwl_dhc_cmd_resp_v1 *resp = (void *)pkt->data;
|
||
|
|
||
|
if (iwl_rx_packet_payload_len(pkt) < sizeof(*resp))
|
||
|
return ERR_PTR(-EINVAL);
|
||
|
|
||
|
*len = iwl_rx_packet_payload_len(pkt) - sizeof(*resp);
|
||
|
return (void *)&resp->data;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif /* __iwl_fw_dhc_utils_h__ */
|