diff options
Diffstat (limited to 'net/caif/cfsrvl.c')
| -rw-r--r-- | net/caif/cfsrvl.c | 70 | 
1 files changed, 42 insertions, 28 deletions
diff --git a/net/caif/cfsrvl.c b/net/caif/cfsrvl.c index ab5e542526b..a6e11546305 100644 --- a/net/caif/cfsrvl.c +++ b/net/caif/cfsrvl.c @@ -1,6 +1,6 @@  /*   * Copyright (C) ST-Ericsson AB 2010 - * Author:	Sjur Brendeland/sjur.brandeland@stericsson.com + * Author:	Sjur Brendeland   * License terms: GNU General Public License (GPL) version 2   */ @@ -10,9 +10,12 @@  #include <linux/types.h>  #include <linux/errno.h>  #include <linux/slab.h> +#include <linux/module.h> +#include <linux/pkt_sched.h>  #include <net/caif/caif_layer.h>  #include <net/caif/cfsrvl.h>  #include <net/caif/cfpkt.h> +#include <net/caif/caif_dev.h>  #define SRVL_CTRL_PKT_SIZE 1  #define SRVL_FLOW_OFF 0x81 @@ -23,12 +26,12 @@  #define container_obj(layr) container_of(layr, struct cfsrvl, layer)  static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl, -				int phyid) +			    int phyid)  {  	struct cfsrvl *service = container_obj(layr); -	caif_assert(layr->up != NULL); -	caif_assert(layr->up->ctrlcmd != NULL); +	if (layr->up == NULL || layr->up->ctrlcmd == NULL) +		return;  	switch (ctrl) {  	case CAIF_CTRLCMD_INIT_RSP: @@ -107,10 +110,8 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)  			struct caif_payload_info *info;  			u8 flow_on = SRVL_FLOW_ON;  			pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE); -			if (!pkt) { -				pr_warn("Out of memory\n"); +			if (!pkt)  				return -ENOMEM; -			}  			if (cfpkt_add_head(pkt, &flow_on, 1) < 0) {  				pr_err("Packet is erroneous!\n"); @@ -121,6 +122,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)  			info->channel_id = service->layer.id;  			info->hdr_len = 1;  			info->dev_info = &service->dev_info; +			cfpkt_set_prio(pkt, TC_PRIO_CONTROL);  			return layr->dn->transmit(layr->dn, pkt);  		}  	case CAIF_MODEMCMD_FLOW_OFF_REQ: @@ -129,10 +131,8 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)  			struct caif_payload_info *info;  			u8 flow_off = SRVL_FLOW_OFF;  			pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE); -			if (!pkt) { -				pr_warn("Out of memory\n"); +			if (!pkt)  				return -ENOMEM; -			}  			if (cfpkt_add_head(pkt, &flow_off, 1) < 0) {  				pr_err("Packet is erroneous!\n"); @@ -143,6 +143,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)  			info->channel_id = service->layer.id;  			info->hdr_len = 1;  			info->dev_info = &service->dev_info; +			cfpkt_set_prio(pkt, TC_PRIO_CONTROL);  			return layr->dn->transmit(layr->dn, pkt);  		}  	default: @@ -151,22 +152,16 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)  	return -EINVAL;  } -void cfservl_destroy(struct cflayer *layer) +static void cfsrvl_release(struct cflayer *layer)  { -	kfree(layer); -} - -void cfsrvl_release(struct kref *kref) -{ -	struct cfsrvl *service = container_of(kref, struct cfsrvl, ref); +	struct cfsrvl *service = container_of(layer, struct cfsrvl, layer);  	kfree(service);  }  void cfsrvl_init(struct cfsrvl *service, -			u8 channel_id, -			struct dev_info *dev_info, -			bool supports_flowctrl -			) +		 u8 channel_id, +		 struct dev_info *dev_info, +		 bool supports_flowctrl)  {  	caif_assert(offsetof(struct cfsrvl, layer) == 0);  	service->open = false; @@ -178,22 +173,17 @@ void cfsrvl_init(struct cfsrvl *service,  	service->dev_info = *dev_info;  	service->supports_flowctrl = supports_flowctrl;  	service->release = cfsrvl_release; -	kref_init(&service->ref);  } -  bool cfsrvl_ready(struct cfsrvl *service, int *err)  { -	if (service->open && service->modem_flow_on && service->phy_flow_on) -		return true;  	if (!service->open) {  		*err = -ENOTCONN;  		return false;  	} -	caif_assert(!(service->modem_flow_on && service->phy_flow_on)); -	*err = -EAGAIN; -	return false; +	return true;  } +  u8 cfsrvl_getphyid(struct cflayer *layer)  {  	struct cfsrvl *servl = container_obj(layer); @@ -205,3 +195,27 @@ bool cfsrvl_phyid_match(struct cflayer *layer, int phyid)  	struct cfsrvl *servl = container_obj(layer);  	return servl->dev_info.id == phyid;  } + +void caif_free_client(struct cflayer *adap_layer) +{ +	struct cfsrvl *servl; +	if (adap_layer == NULL || adap_layer->dn == NULL) +		return; +	servl = container_obj(adap_layer->dn); +	servl->release(&servl->layer); +} +EXPORT_SYMBOL(caif_free_client); + +void caif_client_register_refcnt(struct cflayer *adapt_layer, +				 void (*hold)(struct cflayer *lyr), +				 void (*put)(struct cflayer *lyr)) +{ +	struct cfsrvl *service; + +	if (WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL)) +		return; +	service = container_of(adapt_layer->dn, struct cfsrvl, layer); +	service->hold = hold; +	service->put = put; +} +EXPORT_SYMBOL(caif_client_register_refcnt);  | 
