* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "ka_task_pub.h"
#include "udis_log.h"
#include "udis_management.h"
#include "ka_common_pub.h"
STATIC struct udis_ctrl_block *g_udis_cb[UDIS_DEVICE_UDEVID_MAX];
STATIC ka_rw_semaphore_t g_udis_cb_lock[UDIS_DEVICE_UDEVID_MAX];
struct udis_ctrl_block* udis_get_ctrl_block(unsigned int udevid)
{
if (udevid >= UDIS_DEVICE_UDEVID_MAX) {
udis_err("Invalid udevid. (udevid=%u)\n", udevid);
return NULL;
}
return g_udis_cb[udevid];
}
int udis_set_ctrl_block(unsigned int udevid, struct udis_ctrl_block *ctrl_block)
{
if (udevid >= UDIS_DEVICE_UDEVID_MAX) {
udis_err("Invalid udevid. (udevid=%u)\n", udevid);
return -EINVAL;
}
g_udis_cb[udevid] = ctrl_block;
return 0;
}
void udis_cb_rwlock_init(unsigned int udevid)
{
ka_task_init_rwsem(&g_udis_cb_lock[udevid]);
}
void udis_cb_write_lock(unsigned int udevid)
{
ka_task_down_write(&g_udis_cb_lock[udevid]);
}
void udis_cb_write_unlock(unsigned int udevid)
{
ka_task_up_write(&g_udis_cb_lock[udevid]);
}
void udis_cb_read_lock(unsigned int udevid)
{
ka_task_down_read(&g_udis_cb_lock[udevid]);
}
void udis_cb_read_unlock(unsigned int udevid)
{
ka_task_up_read(&g_udis_cb_lock[udevid]);
}