]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/caif/cfrfml.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[karo-tx-linux.git] / net / caif / cfrfml.c
index 6dc75d4f8d942a183123b8720fdfe42c1e42888d..2b563ad04597de1b049e8d52c4944d9ed48b5da3 100644 (file)
@@ -184,6 +184,11 @@ out:
                                        rfml->serv.dev_info.id);
        }
        spin_unlock(&rfml->sync);
+
+       if (unlikely(err == -EAGAIN))
+               /* It is not possible to recover after drop of a fragment */
+               err = -EIO;
+
        return err;
 }
 
@@ -218,7 +223,7 @@ static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt)
        caif_assert(layr->dn->transmit != NULL);
 
        if (!cfsrvl_ready(&rfml->serv, &err))
-               return err;
+               goto out;
 
        err = -EPROTO;
        if (cfpkt_getlen(pkt) <= RFM_HEAD_SIZE-1)
@@ -251,8 +256,11 @@ static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt)
 
                err = cfrfml_transmit_segment(rfml, frontpkt);
 
-               if (err != 0)
+               if (err != 0) {
+                       frontpkt = NULL;
                        goto out;
+               }
+
                frontpkt = rearpkt;
                rearpkt = NULL;
 
@@ -286,19 +294,8 @@ out:
                if (rearpkt)
                        cfpkt_destroy(rearpkt);
 
-               if (frontpkt && frontpkt != pkt) {
-
+               if (frontpkt)
                        cfpkt_destroy(frontpkt);
-                       /*
-                        * Socket layer will free the original packet,
-                        * but this packet may already be sent and
-                        * freed. So we have to return 0 in this case
-                        * to avoid socket layer to re-free this packet.
-                        * The return of shutdown indication will
-                        * cause connection to be invalidated anyhow.
-                        */
-                       err = 0;
-               }
        }
 
        return err;