len = CAPIMSG_LEN(cmsg->buf);
skb = alloc_skb(len, GFP_ATOMIC);
memcpy(skb_put(skb, len), cmsg->buf, len);
- capi20_put_message(&global.ap, skb);
+ if (capi20_put_message(&global.ap, skb) != CAPI_NOERROR)
+ kfree_skb(skb);
}
/* -------- state machine -------------------------------------------- */
CAPIMSG_NCCI(skb->data),
CAPIMSG_MSGID(skb->data));
if (retval != CAPI_NOERROR)
- goto out;
+ return retval;
dlen = CAPIMSG_DATALEN(skb->data);
b1_put_slice(port, skb->data + len, dlen);
spin_unlock_irqrestore(&card->lock, flags);
} else {
- retval = CAPI_NOERROR;
-
spin_lock_irqsave(&card->lock, flags);
b1_put_byte(port, SEND_MESSAGE);
b1_put_slice(port, skb->data, len);
spin_unlock_irqrestore(&card->lock, flags);
}
- out:
+
dev_kfree_skb_any(skb);
- return retval;
+ return CAPI_NOERROR;
}
/* ------------------------------------------------------------- */
}
if (retval == CAPI_NOERROR)
b1dma_queue_tx(card, skb);
- else
- dev_kfree_skb_any(skb);
return retval;
}
spin_lock_irqsave(&card->lock, flags);
c4_dispatch_tx(card);
spin_unlock_irqrestore(&card->lock, flags);
- } else {
- dev_kfree_skb_any(skb);
}
return retval;
}
CAPIMSG_NCCI(skb->data),
CAPIMSG_MSGID(skb->data));
if (retval != CAPI_NOERROR)
- goto out;
+ return retval;
dlen = CAPIMSG_DATALEN(skb->data);
t1_put_slice(port, skb->data + len, dlen);
spin_unlock_irqrestore(&card->lock, flags);
} else {
- retval = CAPI_NOERROR;
spin_lock_irqsave(&card->lock, flags);
b1_put_byte(port, SEND_MESSAGE);
t1_put_slice(port, skb->data, len);
spin_unlock_irqrestore(&card->lock, flags);
}
- out:
+
dev_kfree_skb_any(skb);
- return retval;
+ return CAPI_NOERROR;
}
/* ------------------------------------------------------------- */
-/* $Id: capifunc.c,v 1.61.4.2 2004/05/05 16:09:25 armin Exp $
+/* $Id: capifunc.c,v 1.61.4.5 2004/08/27 20:10:12 armin Exp $
*
* ISDN interface module for Eicon active cards DIVA.
* CAPI Interface common functions
write_end:
diva_os_leave_spin_lock(&api_lock, &old_irql, "send message");
- diva_os_free_message_buffer(dmb);
+ if (retval == CAPI_NOERROR)
+ diva_os_free_message_buffer(dmb);
return retval;
}