in ps3av.c [287:332]
int ps3av_do_pkt(u32 cid, u16 send_len, size_t usr_buf_size,
struct ps3av_send_hdr *buf)
{
int res = 0;
u32 *table;
BUG_ON(!ps3av);
mutex_lock(&ps3av->mutex);
table = ps3av_search_cmd_table(cid, PS3AV_CID_MASK);
BUG_ON(!table);
BUG_ON(send_len < PS3AV_HDR_SIZE);
BUG_ON(usr_buf_size < send_len);
BUG_ON(usr_buf_size > PS3AV_BUF_SIZE);
/* create header */
ps3av_set_hdr(cid, send_len, buf);
/* send packet via vuart */
res = ps3av_send_cmd_pkt(buf, &ps3av->recv_buf.reply_hdr, send_len,
usr_buf_size);
if (res < 0) {
printk(KERN_ERR
"%s: ps3av_send_cmd_pkt() failed (result=%d)\n",
__func__, res);
goto err;
}
/* process reply packet */
res = ps3av_process_reply_packet(buf, &ps3av->recv_buf.reply_hdr,
usr_buf_size);
if (res < 0) {
printk(KERN_ERR "%s: put_return_status() failed (result=%d)\n",
__func__, res);
goto err;
}
mutex_unlock(&ps3av->mutex);
return 0;
err:
mutex_unlock(&ps3av->mutex);
printk(KERN_ERR "%s: failed cid:%x res:%d\n", __func__, cid, res);
return res;
}