in clients/ssi_protocol.c [770:814]
static void ssip_rx_strans(struct hsi_client *cl, u32 cmd)
{
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
struct sk_buff *skb;
struct hsi_msg *msg;
int len = SSIP_PDU_LENGTH(cmd);
dev_dbg(&cl->device, "RX strans: %d frames\n", len);
spin_lock_bh(&ssi->lock);
if (unlikely(ssi->main_state != ACTIVE)) {
dev_err(&cl->device, "START TRANS wrong state: S(%d) M(%d)\n",
ssi->send_state, ssi->main_state);
spin_unlock_bh(&ssi->lock);
return;
}
ssip_set_rxstate(ssi, RECEIVING);
if (unlikely(SSIP_MSG_ID(cmd) != ssi->rxid)) {
dev_err(&cl->device, "START TRANS id %d expected %d\n",
SSIP_MSG_ID(cmd), ssi->rxid);
spin_unlock_bh(&ssi->lock);
goto out1;
}
ssi->rxid++;
spin_unlock_bh(&ssi->lock);
skb = netdev_alloc_skb(ssi->netdev, len * 4);
if (unlikely(!skb)) {
dev_err(&cl->device, "No memory for rx skb\n");
goto out1;
}
skb->dev = ssi->netdev;
skb_put(skb, len * 4);
msg = ssip_alloc_data(ssi, skb, GFP_ATOMIC);
if (unlikely(!msg)) {
dev_err(&cl->device, "No memory for RX data msg\n");
goto out2;
}
msg->complete = ssip_rx_data_complete;
hsi_async_read(cl, msg);
return;
out2:
dev_kfree_skb(skb);
out1:
ssip_error(cl);
}