in clients/ssi_protocol.c [573:606]
static int ssip_xmit(struct hsi_client *cl)
{
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
struct hsi_msg *msg, *dmsg;
struct sk_buff *skb;
spin_lock_bh(&ssi->lock);
if (list_empty(&ssi->txqueue)) {
spin_unlock_bh(&ssi->lock);
return 0;
}
dmsg = list_first_entry(&ssi->txqueue, struct hsi_msg, link);
list_del(&dmsg->link);
ssi->txqueue_len--;
spin_unlock_bh(&ssi->lock);
msg = ssip_claim_cmd(ssi);
skb = dmsg->context;
msg->context = dmsg;
msg->complete = ssip_strans_complete;
msg->destructor = ssip_free_strans;
spin_lock_bh(&ssi->lock);
ssip_set_cmd(msg, SSIP_START_TRANS_CMD(SSIP_BYTES_TO_FRAMES(skb->len),
ssi->txid));
ssi->txid++;
ssip_set_txstate(ssi, SENDING);
spin_unlock_bh(&ssi->lock);
dev_dbg(&cl->device, "Send STRANS (%d frames)\n",
SSIP_BYTES_TO_FRAMES(skb->len));
return hsi_async_write(cl, msg);
}