]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/caif/cffrml.c
caif: Handle dev_queue_xmit errors.
[karo-tx-linux.git] / net / caif / cffrml.c
index 4f4f756c49ac2d30edf28b24e5a0c6013207e319..04204b2027186ef84df3ca116f849a35d902e3e9 100644 (file)
@@ -33,7 +33,6 @@ static void cffrml_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
 static u32 cffrml_rcv_error;
 static u32 cffrml_rcv_checsum_error;
 struct cflayer *cffrml_create(u16 phyid, bool use_fcs)
-
 {
        struct cffrml *this = kmalloc(sizeof(struct cffrml), GFP_ATOMIC);
        if (!this) {
@@ -128,6 +127,13 @@ static int cffrml_receive(struct cflayer *layr, struct cfpkt *pkt)
                cfpkt_destroy(pkt);
                return -EPROTO;
        }
+
+       if (layr->up == NULL) {
+               pr_err("Layr up is missing!\n");
+               cfpkt_destroy(pkt);
+               return -EINVAL;
+       }
+
        return layr->up->receive(layr->up, pkt);
 }
 
@@ -150,15 +156,22 @@ static int cffrml_transmit(struct cflayer *layr, struct cfpkt *pkt)
        cfpkt_info(pkt)->hdr_len += 2;
        if (cfpkt_erroneous(pkt)) {
                pr_err("Packet is erroneous!\n");
+               cfpkt_destroy(pkt);
                return -EPROTO;
        }
+
+       if (layr->dn == NULL) {
+               cfpkt_destroy(pkt);
+               return -ENODEV;
+
+       }
        return layr->dn->transmit(layr->dn, pkt);
 }
 
 static void cffrml_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
                                        int phyid)
 {
-       if (layr->up->ctrlcmd)
+       if (layr->up && layr->up->ctrlcmd)
                layr->up->ctrlcmd(layr->up, ctrl, layr->id);
 }