2019-05-28 19:57:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2010-03-30 17:56:23 +04:00
/*
* Copyright ( C ) ST - Ericsson AB 2010
2013-04-23 03:57:01 +04:00
* Author : Sjur Brendeland
2010-03-30 17:56:23 +04:00
*/
2010-09-06 01:31:11 +04:00
# define pr_fmt(fmt) KBUILD_MODNAME ":%s(): " fmt, __func__
2010-03-30 17:56:23 +04:00
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/slab.h>
# include <linux/errno.h>
# include <net/caif/caif_layer.h>
# include <net/caif/cfsrvl.h>
# include <net/caif/cfpkt.h>
# define container_obj(layr) ((struct cfsrvl *) layr)
static int cfvidl_receive ( struct cflayer * layr , struct cfpkt * pkt ) ;
static int cfvidl_transmit ( struct cflayer * layr , struct cfpkt * pkt ) ;
struct cflayer * cfvidl_create ( u8 channel_id , struct dev_info * dev_info )
{
2011-08-25 17:22:24 +04:00
struct cfsrvl * vid = kzalloc ( sizeof ( struct cfsrvl ) , GFP_ATOMIC ) ;
if ( ! vid )
2010-03-30 17:56:23 +04:00
return NULL ;
caif_assert ( offsetof ( struct cfsrvl , layer ) = = 0 ) ;
2010-06-17 10:55:38 +04:00
cfsrvl_init ( vid , channel_id , dev_info , false ) ;
2010-03-30 17:56:23 +04:00
vid - > layer . receive = cfvidl_receive ;
vid - > layer . transmit = cfvidl_transmit ;
2019-05-17 10:59:22 +03:00
snprintf ( vid - > layer . name , CAIF_LAYER_NAME_SZ , " vid1 " ) ;
2010-03-30 17:56:23 +04:00
return & vid - > layer ;
}
static int cfvidl_receive ( struct cflayer * layr , struct cfpkt * pkt )
{
u32 videoheader ;
if ( cfpkt_extr_head ( pkt , & videoheader , 4 ) < 0 ) {
2010-09-06 01:31:11 +04:00
pr_err ( " Packet is erroneous! \n " ) ;
2010-03-30 17:56:23 +04:00
cfpkt_destroy ( pkt ) ;
return - EPROTO ;
}
return layr - > up - > receive ( layr - > up , pkt ) ;
}
static int cfvidl_transmit ( struct cflayer * layr , struct cfpkt * pkt )
{
struct cfsrvl * service = container_obj ( layr ) ;
struct caif_payload_info * info ;
u32 videoheader = 0 ;
int ret ;
2012-03-11 14:28:31 +04:00
if ( ! cfsrvl_ready ( service , & ret ) ) {
cfpkt_destroy ( pkt ) ;
2010-03-30 17:56:23 +04:00
return ret ;
2012-03-11 14:28:31 +04:00
}
2010-03-30 17:56:23 +04:00
cfpkt_add_head ( pkt , & videoheader , 4 ) ;
/* Add info for MUX-layer to route the packet out */
info = cfpkt_info ( pkt ) ;
info - > channel_id = service - > layer . id ;
info - > dev_info = & service - > dev_info ;
2011-04-11 14:43:51 +04:00
return layr - > dn - > transmit ( layr - > dn , pkt ) ;
2010-03-30 17:56:23 +04:00
}