caif: Bugfix not all services uses flow-ctrl.
authorSjur Braendeland <sjur.brandeland@stericsson.com>
Thu, 17 Jun 2010 06:55:38 +0000 (06:55 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Jun 2010 02:46:05 +0000 (19:46 -0700)
Flow control is not used by all CAIF services.
The usage of flow control is now part of the gerneal
initialization function for CAIF Services.

Signed-off-by: Sjur Braendeland@stericsson.com
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/caif/cfsrvl.h
net/caif/cfctrl.c
net/caif/cfdbgl.c
net/caif/cfdgml.c
net/caif/cfrfml.c
net/caif/cfsrvl.c
net/caif/cfutill.c
net/caif/cfveil.c
net/caif/cfvidl.c

index 2dc9eb193ecf8ae3fcab37586a28a08310472986..5d921f5e18c42c4a5249049591e34d3adf7ca705 100644 (file)
@@ -16,6 +16,7 @@ struct cfsrvl {
        bool open;
        bool phy_flow_on;
        bool modem_flow_on;
+       bool supports_flowctrl;
        struct dev_info dev_info;
        struct kref ref;
 };
@@ -30,8 +31,9 @@ struct cflayer *cfdbgl_create(u8 linkid, struct dev_info *dev_info);
 bool cfsrvl_phyid_match(struct cflayer *layer, int phyid);
 void cfservl_destroy(struct cflayer *layer);
 void cfsrvl_init(struct cfsrvl *service,
-                u8 channel_id,
-                struct dev_info *dev_info);
+                       u8 channel_id,
+                       struct dev_info *dev_info,
+                       bool supports_flowctrl);
 bool cfsrvl_ready(struct cfsrvl *service, int *err);
 u8 cfsrvl_getphyid(struct cflayer *layer);
 
index fcfda98a5e6d3e5eb2f01aa85912acc6982a1e1f..107c4b2a311ea0c5ee9f78e43d51dd00246ca919 100644 (file)
@@ -43,7 +43,7 @@ struct cflayer *cfctrl_create(void)
        memset(&dev_info, 0, sizeof(dev_info));
        dev_info.id = 0xff;
        memset(this, 0, sizeof(*this));
-       cfsrvl_init(&this->serv, 0, &dev_info);
+       cfsrvl_init(&this->serv, 0, &dev_info, false);
        atomic_set(&this->req_seq_no, 1);
        atomic_set(&this->rsp_seq_no, 1);
        this->serv.layer.receive = cfctrl_recv;
index ab6b6dc34cf84306fb806e0b144a107aa20e3421..676648cac8ddf3aa77f8659187b6aab8738388a0 100644 (file)
@@ -22,7 +22,7 @@ struct cflayer *cfdbgl_create(u8 channel_id, struct dev_info *dev_info)
        }
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
        memset(dbg, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(dbg, channel_id, dev_info);
+       cfsrvl_init(dbg, channel_id, dev_info, false);
        dbg->layer.receive = cfdbgl_receive;
        dbg->layer.transmit = cfdbgl_transmit;
        snprintf(dbg->layer.name, CAIF_LAYER_NAME_SZ - 1, "dbg%d", channel_id);
index 53194840ecb6cc8464b7a5cba4258dd27f0c6415..32d9f0dc8463ed6621a6af27c956ae99a3846bbe 100644 (file)
@@ -30,7 +30,7 @@ struct cflayer *cfdgml_create(u8 channel_id, struct dev_info *dev_info)
        }
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
        memset(dgm, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(dgm, channel_id, dev_info);
+       cfsrvl_init(dgm, channel_id, dev_info, true);
        dgm->layer.receive = cfdgml_receive;
        dgm->layer.transmit = cfdgml_transmit;
        snprintf(dgm->layer.name, CAIF_LAYER_NAME_SZ - 1, "dgm%d", channel_id);
index fd27b172fb5d444ffdf5664312f0b0c86b4836cd..689cbfd0e43d51bbe2fd6fde4a1930f320fc8cf0 100644 (file)
 
 static int cfrfml_receive(struct cflayer *layr, struct cfpkt *pkt);
 static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt);
-static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl);
 
 struct cflayer *cfrfml_create(u8 channel_id, struct dev_info *dev_info)
 {
        struct cfsrvl *rfm = kmalloc(sizeof(struct cfsrvl), GFP_ATOMIC);
+
        if (!rfm) {
                pr_warning("CAIF: %s(): Out of memory\n", __func__);
                return NULL;
        }
+
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
+
        memset(rfm, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(rfm, channel_id, dev_info);
-       rfm->layer.modemcmd = cfservl_modemcmd;
+       cfsrvl_init(rfm, channel_id, dev_info, false);
        rfm->layer.receive = cfrfml_receive;
        rfm->layer.transmit = cfrfml_transmit;
        snprintf(rfm->layer.name, CAIF_LAYER_NAME_SZ, "rfm%d", channel_id);
        return &rfm->layer;
 }
 
-static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
-{
-       return -EPROTO;
-}
-
 static int cfrfml_receive(struct cflayer *layr, struct cfpkt *pkt)
 {
        u8 tmp;
index 6e5b7079a68424ff414a5f33d0500267b59d489e..7aa1f03a01513cbcc5633a245f00ef6522594ed3 100644 (file)
@@ -24,8 +24,10 @@ static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
                                int phyid)
 {
        struct cfsrvl *service = container_obj(layr);
+
        caif_assert(layr->up != NULL);
        caif_assert(layr->up->ctrlcmd != NULL);
+
        switch (ctrl) {
        case CAIF_CTRLCMD_INIT_RSP:
                service->open = true;
@@ -89,9 +91,14 @@ static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
 static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
 {
        struct cfsrvl *service = container_obj(layr);
+
        caif_assert(layr != NULL);
        caif_assert(layr->dn != NULL);
        caif_assert(layr->dn->transmit != NULL);
+
+       if (!service->supports_flowctrl)
+               return 0;
+
        switch (ctrl) {
        case CAIF_MODEMCMD_FLOW_ON_REQ:
                {
@@ -153,8 +160,10 @@ void cfservl_destroy(struct cflayer *layer)
 }
 
 void cfsrvl_init(struct cfsrvl *service,
-                u8 channel_id,
-                struct dev_info *dev_info)
+                       u8 channel_id,
+                       struct dev_info *dev_info,
+                       bool supports_flowctrl
+                       )
 {
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
        service->open = false;
@@ -164,6 +173,7 @@ void cfsrvl_init(struct cfsrvl *service,
        service->layer.ctrlcmd = cfservl_ctrlcmd;
        service->layer.modemcmd = cfservl_modemcmd;
        service->dev_info = *dev_info;
+       service->supports_flowctrl = supports_flowctrl;
        kref_init(&service->ref);
 }
 
index 5fd2c9ea8b42a8dc99e570326ebb60c7f50f2667..ce525cac9064f6fead36d45bc95d187fe4196ec4 100644 (file)
@@ -31,7 +31,7 @@ struct cflayer *cfutill_create(u8 channel_id, struct dev_info *dev_info)
        }
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
        memset(util, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(util, channel_id, dev_info);
+       cfsrvl_init(util, channel_id, dev_info, true);
        util->layer.receive = cfutill_receive;
        util->layer.transmit = cfutill_transmit;
        snprintf(util->layer.name, CAIF_LAYER_NAME_SZ - 1, "util1");
index e04f7d964e83ea8d0c88308bb0fcd2e3dd9dfbd6..637cb0eee13cf1ee0a84853e6b52779cd3ac9ccd 100644 (file)
@@ -30,7 +30,7 @@ struct cflayer *cfvei_create(u8 channel_id, struct dev_info *dev_info)
        }
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
        memset(vei, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(vei, channel_id, dev_info);
+       cfsrvl_init(vei, channel_id, dev_info, true);
        vei->layer.receive = cfvei_receive;
        vei->layer.transmit = cfvei_transmit;
        snprintf(vei->layer.name, CAIF_LAYER_NAME_SZ - 1, "vei%d", channel_id);
index 89ad4ea239f1f7105394787fca4af8d19d410b84..ada6ee2d48f50a3ab4df69f102778535c4292eba 100644 (file)
@@ -27,7 +27,7 @@ struct cflayer *cfvidl_create(u8 channel_id, struct dev_info *dev_info)
        caif_assert(offsetof(struct cfsrvl, layer) == 0);
 
        memset(vid, 0, sizeof(struct cfsrvl));
-       cfsrvl_init(vid, channel_id, dev_info);
+       cfsrvl_init(vid, channel_id, dev_info, false);
        vid->layer.receive = cfvidl_receive;
        vid->layer.transmit = cfvidl_transmit;
        snprintf(vid->layer.name, CAIF_LAYER_NAME_SZ - 1, "vid1");