static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client, void *buffer, size_t size, struct completion *completion) { int rc = smsclient_sendrequest(client->smsclient, buffer, size); if (rc < 0) return rc; return wait_for_completion_timeout(completion, msecs_to_jiffies(2000)) ? 0 : -ETIME; }
static int smsdvb_stop_feed(struct dvb_demux_feed *feed) { struct smsdvb_client_t *client = container_of(feed->demux, struct smsdvb_client_t, demux); struct SmsMsgData_ST PidMsg; sms_debug("remove pid %d(%x)", feed->pid, feed->pid); PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; PidMsg.xMsgHeader.msgDstId = HIF_TASK; PidMsg.xMsgHeader.msgFlags = 0; PidMsg.xMsgHeader.msgType = MSG_SMS_REMOVE_PID_FILTER_REQ; PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); PidMsg.msgData[0] = feed->pid; return smsclient_sendrequest(client->smsclient, &PidMsg, sizeof(PidMsg)); }
static int smsdvb_stop_feed(struct dvb_demux_feed *feed) { struct smsdvb_client_t *client = container_of(feed->demux, struct smsdvb_client_t, demux); struct sms_msg_data pid_msg; pr_debug("remove pid %d(%x)\n", feed->pid, feed->pid); client->feed_users--; pid_msg.x_msg_header.msg_src_id = DVBT_BDA_CONTROL_MSG_ID; pid_msg.x_msg_header.msg_dst_id = HIF_TASK; pid_msg.x_msg_header.msg_flags = 0; pid_msg.x_msg_header.msg_type = MSG_SMS_REMOVE_PID_FILTER_REQ; pid_msg.x_msg_header.msg_length = sizeof(pid_msg); pid_msg.msg_data[0] = feed->pid; return smsclient_sendrequest(client->smsclient, &pid_msg, sizeof(pid_msg)); }
/** * sends the buffer to the associated device * * @param file File structure. * @param buf Source buffer. * @param count Size of source buffer. * @param f_pos Position in file (ignored). * * @return Number of bytes read, or <0 on error. */ static ssize_t smschar_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos) { struct smschar_device_t *dev; void *buffer; if (file == NULL) { sms_err("file is NULL\n"); return EINVAL; } if (file->private_data == NULL) { sms_err("file->private_data is NULL\n"); return -EINVAL; } dev = file->private_data; if (!dev->smsclient) { sms_err("no client\n"); return -ENODEV; } buffer = kmalloc(ALIGN(count, SMS_ALLOC_ALIGNMENT) + SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA); if (buffer) { void *msg_buffer = (void *)SMS_ALIGN_ADDRESS(buffer); if (!copy_from_user(msg_buffer, buf, count)) smsclient_sendrequest(dev->smsclient, msg_buffer, count); else count = 0; kfree(buffer); } return count; }