^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) ST-Ericsson AB 2010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Author: Sjur Brendeland
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define pr_fmt(fmt) KBUILD_MODNAME ":%s(): " fmt, __func__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/pkt_sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <net/caif/caif_layer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <net/caif/cfsrvl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <net/caif/cfpkt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <net/caif/caif_dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SRVL_CTRL_PKT_SIZE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SRVL_FLOW_OFF 0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define SRVL_FLOW_ON 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SRVL_SET_PIN 0x82
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define container_obj(layr) container_of(layr, struct cfsrvl, layer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int phyid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct cfsrvl *service = container_obj(layr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if (layr->up == NULL || layr->up->ctrlcmd == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) switch (ctrl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) case CAIF_CTRLCMD_INIT_RSP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) service->open = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) layr->up->ctrlcmd(layr->up, ctrl, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) case CAIF_CTRLCMD_DEINIT_RSP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) case CAIF_CTRLCMD_INIT_FAIL_RSP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) service->open = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) layr->up->ctrlcmd(layr->up, ctrl, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) case _CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (phyid != service->dev_info.id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if (service->modem_flow_on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) layr->up->ctrlcmd(layr->up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) CAIF_CTRLCMD_FLOW_OFF_IND, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) service->phy_flow_on = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) case _CAIF_CTRLCMD_PHYIF_FLOW_ON_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (phyid != service->dev_info.id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) if (service->modem_flow_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) layr->up->ctrlcmd(layr->up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) CAIF_CTRLCMD_FLOW_ON_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) service->phy_flow_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) case CAIF_CTRLCMD_FLOW_OFF_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (service->phy_flow_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) layr->up->ctrlcmd(layr->up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) CAIF_CTRLCMD_FLOW_OFF_IND, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) service->modem_flow_on = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) case CAIF_CTRLCMD_FLOW_ON_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) if (service->phy_flow_on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) layr->up->ctrlcmd(layr->up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) CAIF_CTRLCMD_FLOW_ON_IND, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) service->modem_flow_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) case _CAIF_CTRLCMD_PHYIF_DOWN_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* In case interface is down, let's fake a remove shutdown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) layr->up->ctrlcmd(layr->up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) case CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) layr->up->ctrlcmd(layr->up, ctrl, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) pr_warn("Unexpected ctrl in cfsrvl (%d)\n", ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* We have both modem and phy flow on, send flow on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) layr->up->ctrlcmd(layr->up, ctrl, phyid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) service->phy_flow_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct cfsrvl *service = container_obj(layr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) caif_assert(layr != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) caif_assert(layr->dn != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) caif_assert(layr->dn->transmit != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (!service->supports_flowctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) switch (ctrl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) case CAIF_MODEMCMD_FLOW_ON_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct cfpkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct caif_payload_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) u8 flow_on = SRVL_FLOW_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (!pkt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (cfpkt_add_head(pkt, &flow_on, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) pr_err("Packet is erroneous!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) cfpkt_destroy(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) info = cfpkt_info(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) info->channel_id = service->layer.id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) info->hdr_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) info->dev_info = &service->dev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return layr->dn->transmit(layr->dn, pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) case CAIF_MODEMCMD_FLOW_OFF_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct cfpkt *pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct caif_payload_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u8 flow_off = SRVL_FLOW_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (!pkt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (cfpkt_add_head(pkt, &flow_off, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) pr_err("Packet is erroneous!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) cfpkt_destroy(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) info = cfpkt_info(pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) info->channel_id = service->layer.id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) info->hdr_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) info->dev_info = &service->dev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return layr->dn->transmit(layr->dn, pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static void cfsrvl_release(struct cflayer *layer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct cfsrvl *service = container_of(layer, struct cfsrvl, layer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) kfree(service);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) void cfsrvl_init(struct cfsrvl *service,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) u8 channel_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct dev_info *dev_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) bool supports_flowctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) caif_assert(offsetof(struct cfsrvl, layer) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) service->open = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) service->modem_flow_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) service->phy_flow_on = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) service->layer.id = channel_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) service->layer.ctrlcmd = cfservl_ctrlcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) service->layer.modemcmd = cfservl_modemcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) service->dev_info = *dev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) service->supports_flowctrl = supports_flowctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) service->release = cfsrvl_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) bool cfsrvl_ready(struct cfsrvl *service, int *err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (!service->open) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) *err = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) u8 cfsrvl_getphyid(struct cflayer *layer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct cfsrvl *servl = container_obj(layer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) return servl->dev_info.id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) bool cfsrvl_phyid_match(struct cflayer *layer, int phyid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) struct cfsrvl *servl = container_obj(layer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return servl->dev_info.id == phyid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) void caif_free_client(struct cflayer *adap_layer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct cfsrvl *servl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (adap_layer == NULL || adap_layer->dn == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) servl = container_obj(adap_layer->dn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) servl->release(&servl->layer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) EXPORT_SYMBOL(caif_free_client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) void caif_client_register_refcnt(struct cflayer *adapt_layer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) void (*hold)(struct cflayer *lyr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) void (*put)(struct cflayer *lyr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct cfsrvl *service;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if (WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) service = container_of(adapt_layer->dn, struct cfsrvl, layer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) service->hold = hold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) service->put = put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) EXPORT_SYMBOL(caif_client_register_refcnt);