caif: Bugfix - RFM must support segmentation.
[linux-2.6-block.git] / net / caif / cfsrvl.c
index 6e5b7079a68424ff414a5f33d0500267b59d489e..4c9f147c38af080e2512c55d15ddc82425689deb 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:
                {
@@ -152,9 +159,18 @@ void cfservl_destroy(struct cflayer *layer)
        kfree(layer);
 }
 
+void cfsrvl_release(struct kref *kref)
+{
+       struct cfsrvl *service = container_of(kref, struct cfsrvl, ref);
+       pr_info("CAIF: %s(): enter\n", __func__);
+       kfree(service);
+}
+
 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,14 +180,11 @@ 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;
+       service->release = cfsrvl_release;
        kref_init(&service->ref);
 }
 
-void cfsrvl_release(struct kref *kref)
-{
-       struct cfsrvl *service = container_of(kref, struct cfsrvl, ref);
-       kfree(service);
-}
 
 bool cfsrvl_ready(struct cfsrvl *service, int *err)
 {