int hpsb_iso_xmit_sync(struct hpsb_iso *iso) { if (iso->type != HPSB_ISO_XMIT) return -EINVAL; return wait_event_interruptible(iso->waitq, hpsb_iso_n_ready(iso) == iso->buf_packets); }
static void rawiso_activity_cb(struct hpsb_iso *iso) { struct firedtv *f, *fdtv = NULL; unsigned int i, num, packet; unsigned char *buf; unsigned long flags; int count; spin_lock_irqsave(&node_list_lock, flags); list_for_each_entry(f, &node_list, list) if (f->backend_data == iso) { fdtv = f; break; } spin_unlock_irqrestore(&node_list_lock, flags); packet = iso->first_packet; num = hpsb_iso_n_ready(iso); if (!fdtv) { dev_err(fdtv->device, "received at unknown iso channel\n"); goto out; } for (i = 0; i < num; i++, packet = (packet + 1) % iso->buf_packets) { buf = dma_region_i(&iso->data_buf, unsigned char, iso->infos[packet].offset + CIP_HEADER_SIZE); count = (iso->infos[packet].len - CIP_HEADER_SIZE) / MPEG2_TS_SOURCE_PACKET_SIZE; /* ignore empty packet */ if (iso->infos[packet].len <= CIP_HEADER_SIZE) continue; while (count--) { if (buf[MPEG2_TS_HEADER_SIZE] == 0x47) dvb_dmx_swfilter_packets(&fdtv->demux, &buf[MPEG2_TS_HEADER_SIZE], 1); else dev_err(fdtv->device, "skipping invalid packet\n"); buf += MPEG2_TS_SOURCE_PACKET_SIZE; } } out: hpsb_iso_recv_release_packets(iso, num); }