static int pvr2_ioread_start(struct pvr2_ioread *cp) { int stat; struct pvr2_buffer *bp; if (cp->enabled) return 0; if (!(cp->stream)) return 0; pvr2_trace(PVR2_TRACE_START_STOP, "/*---TRACE_READ---*/ pvr2_ioread_start id=%p",cp); while ((bp = pvr2_stream_get_idle_buffer(cp->stream)) != NULL) { stat = pvr2_buffer_queue(bp); if (stat < 0) { pvr2_trace(PVR2_TRACE_DATA_FLOW, "/*---TRACE_READ---*/ pvr2_ioread_start id=%p error=%d", cp,stat); pvr2_ioread_stop(cp); return stat; } } cp->enabled = !0; cp->c_buf = NULL; cp->c_data_ptr = NULL; cp->c_data_len = 0; cp->c_data_offs = 0; cp->stream_running = 0; if (cp->sync_key_len) { pvr2_trace(PVR2_TRACE_DATA_FLOW, "/*---TRACE_READ---*/ sync_state <== 1"); cp->sync_state = 1; cp->sync_trashed_count = 0; cp->sync_buf_offs = 0; } cp->spigot_open = 0; return 0; }
static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap) { struct pvr2_context *pvr = adap->channel.mc_head; unsigned int idx; int ret; struct pvr2_buffer *bp; struct pvr2_stream *stream = NULL; if (adap->stream_run) return -EIO; ret = pvr2_channel_claim_stream(&adap->channel, &pvr->video_stream); /* */ if (ret < 0) return ret; stream = adap->channel.stream->stream; for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) { adap->buffer_storage[idx] = kmalloc(PVR2_DVB_BUFFER_SIZE, GFP_KERNEL); if (!(adap->buffer_storage[idx])) return -ENOMEM; } pvr2_stream_set_callback(pvr->video_stream.stream, (pvr2_stream_callback) pvr2_dvb_notify, adap); ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT); if (ret < 0) return ret; for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) { bp = pvr2_stream_get_buffer(stream, idx); pvr2_buffer_set_buffer(bp, adap->buffer_storage[idx], PVR2_DVB_BUFFER_SIZE); } ret = pvr2_hdw_set_streaming(adap->channel.hdw, 1); if (ret < 0) return ret; while ((bp = pvr2_stream_get_idle_buffer(stream)) != NULL) { ret = pvr2_buffer_queue(bp); if (ret < 0) return ret; } adap->thread = kthread_run(pvr2_dvb_feed_thread, adap, "pvrusb2-dvb"); if (IS_ERR(adap->thread)) { ret = PTR_ERR(adap->thread); adap->thread = NULL; return ret; } adap->stream_run = !0; return 0; }