• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/media/dvb/dvb-core/

Lines Matching refs:ca

164 static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
165 static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount);
166 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount);
202 static int dvb_ca_en50221_check_camstatus(struct dvb_ca_private *ca, int slot)
209 if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE) {
210 return (atomic_read(&ca->slot_info[slot].camchange_count) != 0);
214 slot_status = ca->pub->poll_slot_status(ca->pub, slot, ca->open);
219 int cam_present_old = (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE);
225 ca->slot_info[slot].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
227 ca->slot_info[slot].camchange_type = DVB_CA_EN50221_CAMCHANGE_INSERTED;
229 atomic_set(&ca->slot_info[slot].camchange_count, 1);
231 if ((ca->slot_info[slot].slot_state == DVB_CA_SLOTSTATE_WAITREADY) &&
234 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_VALIDATE;
246 * @param ca CA instance.
253 static int dvb_ca_en50221_wait_if_status(struct dvb_ca_private *ca, int slot,
266 int res = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
295 * @param ca CA instance.
300 static int dvb_ca_en50221_link_init(struct dvb_ca_private *ca, int slot)
309 ca->slot_info[slot].da_irq_supported = 0;
313 ca->slot_info[slot].link_buf_size = 2;
316 if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN | CMDREG_SR)) != 0)
318 if ((ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_DA, HZ / 10)) != 0)
320 if ((ret = dvb_ca_en50221_read_data(ca, slot, buf, 2)) != 2)
322 if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN)) != 0)
329 ca->slot_info[slot].link_buf_size = buf_size;
335 if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN | CMDREG_SW)) != 0)
337 if ((ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_FR, HZ / 10)) != 0)
339 if ((ret = dvb_ca_en50221_write_data(ca, slot, buf, 2)) != 2)
341 if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN)) != 0)
351 * @param ca CA instance.
360 static int dvb_ca_en50221_read_tuple(struct dvb_ca_private *ca, int slot,
369 if ((_tupleType = ca->pub->read_attribute_mem(ca->pub, slot, _address)) < 0)
378 if ((_tupleLength = ca->pub->read_attribute_mem(ca->pub, slot, _address + 2)) < 0)
386 tuple[i] = ca->pub->read_attribute_mem(ca->pub, slot, _address + (i * 2));
405 * @param ca CA instance.
410 static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
428 dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
437 dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
446 dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
454 if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
467 if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
479 ca->slot_info[slot].config_base = 0;
481 ca->slot_info[slot].config_base |= (tuple[2 + i] << (8 * i));
494 ca->dvbdev->adapter->num, dvb_str[8], dvb_str[9], dvb_str[10], dvb_str[11]);
500 if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
513 ca->slot_info[slot].config_option = tuple[0] & 0x3f;
541 manfid, devid, ca->slot_info[slot].config_base, ca->slot_info[slot].config_option);
551 * @param ca CA instance.
554 static int dvb_ca_en50221_set_configoption(struct dvb_ca_private *ca, int slot)
561 ca->pub->write_attribute_mem(ca->pub, slot,
562 ca->slot_info[slot].config_base,
563 ca->slot_info[slot].config_option);
566 configoption = ca->pub->read_attribute_mem(ca->pub, slot, ca->slot_info[slot].config_base);
568 ca->slot_info[slot].config_option, configoption & 0x3f);
581 * @param ca CA instance.
589 static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount)
602 if (ca->slot_info[slot].rx_buffer.data == NULL) {
606 buf_free = dvb_ringbuffer_free(&ca->slot_info[slot].rx_buffer);
608 if (buf_free < (ca->slot_info[slot].link_buf_size + DVB_RINGBUFFER_PKTHDRSIZE)) {
615 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
624 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_SIZE_HIGH)) < 0)
627 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_SIZE_LOW)) < 0)
633 if (bytes_read > ca->slot_info[slot].link_buf_size) {
635 ca->dvbdev->adapter->num, bytes_read, ca->slot_info[slot].link_buf_size);
636 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
642 ca->dvbdev->adapter->num);
643 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
650 ca->dvbdev->adapter->num);
659 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_DATA)) < 0)
667 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
670 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
677 if (ca->slot_info[slot].rx_buffer.data == NULL) {
681 dvb_ringbuffer_pkt_write(&ca->slot_info[slot].rx_buffer, buf, bytes_read);
691 wake_up_interruptible(&ca->wait_queue);
704 * @param ca CA instance.
712 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot, u8 * buf, int bytes_write)
721 if (bytes_write > ca->slot_info[slot].link_buf_size)
725 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
733 if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
738 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
747 if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_HIGH, bytes_write >> 8)) != 0)
749 if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_LOW,
755 if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_DATA, buf[i])) != 0)
760 if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
763 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
773 ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
789 * @param ca CA instance.
792 static int dvb_ca_en50221_slot_shutdown(struct dvb_ca_private *ca, int slot)
796 ca->pub->slot_shutdown(ca->pub, slot);
797 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
801 wake_up_interruptible(&ca->wait_queue);
814 * @param ca CA instance.
820 struct dvb_ca_private *ca = pubca->private;
833 ca->slot_info[slot].camchange_type = change_type;
834 atomic_inc(&ca->slot_info[slot].camchange_count);
835 dvb_ca_en50221_thread_wakeup(ca);
843 * @param ca CA instance.
848 struct dvb_ca_private *ca = pubca->private;
852 if (ca->slot_info[slot].slot_state == DVB_CA_SLOTSTATE_WAITREADY) {
853 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_VALIDATE;
854 dvb_ca_en50221_thread_wakeup(ca);
862 * @param ca CA instance.
867 struct dvb_ca_private *ca = pubca->private;
872 switch (ca->slot_info[slot].slot_state) {
874 flags = ca->pub->read_cam_control(pubca, slot, CTRLIF_STATUS);
877 ca->slot_info[slot].da_irq_supported = 1;
882 if (ca->open)
883 dvb_ca_en50221_thread_wakeup(ca);
896 * @param ca CA instance.
898 static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca)
903 ca->wakeup = 1;
905 wake_up_interruptible(&ca->thread_queue);
911 * @param ca CA instance.
913 static int dvb_ca_en50221_thread_should_wakeup(struct dvb_ca_private *ca)
915 if (ca->wakeup) {
916 ca->wakeup = 0;
919 if (ca->exit)
929 * @param ca CA instance.
931 static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca)
937 for (slot = 0; slot < ca->slot_count; slot++) {
938 switch (ca->slot_info[slot].slot_state) {
943 if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) {
958 if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) {
961 if (ca->open) {
962 if ((!ca->slot_info[slot].da_irq_supported) ||
963 (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_DA))) {
974 ca->delay = curdelay;
984 struct dvb_ca_private *ca = data;
995 snprintf(name, sizeof(name), "kdvb-ca-%i:%i", ca->dvbdev->adapter->num, ca->dvbdev->id);
1003 dvb_ca_en50221_thread_update_delay(ca);
1006 while (!ca->exit) {
1008 if (!ca->wakeup) {
1009 flags = wait_event_interruptible_timeout(ca->thread_queue,
1010 dvb_ca_en50221_thread_should_wakeup(ca),
1011 ca->delay);
1012 if ((flags == -ERESTARTSYS) || ca->exit) {
1017 ca->wakeup = 0;
1020 for (slot = 0; slot < ca->slot_count; slot++) {
1023 while (dvb_ca_en50221_check_camstatus(ca, slot)) {
1025 if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE)
1026 dvb_ca_en50221_slot_shutdown(ca, slot);
1029 if (ca->slot_info[slot].camchange_type == DVB_CA_EN50221_CAMCHANGE_INSERTED) {
1030 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_UNINITIALISED;
1034 dvb_ca_en50221_thread_update_delay(ca);
1035 atomic_dec(&ca->slot_info[slot].camchange_count);
1039 switch (ca->slot_info[slot].slot_state) {
1046 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_WAITREADY;
1047 ca->pub->slot_reset(ca->pub, slot);
1048 ca->slot_info[slot].timeout = jiffies + (INIT_TIMEOUT_SECS * HZ);
1052 if (time_after(jiffies, ca->slot_info[slot].timeout)) {
1054 ca->dvbdev->adapter->num);
1055 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1056 dvb_ca_en50221_thread_update_delay(ca);
1063 if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) {
1065 if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
1066 (ca->pub->poll_slot_status)) {
1067 int status = ca->pub->poll_slot_status(ca->pub, slot, 0);
1069 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
1070 dvb_ca_en50221_thread_update_delay(ca);
1076 ca->dvbdev->adapter->num);
1077 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1078 dvb_ca_en50221_thread_update_delay(ca);
1081 if (dvb_ca_en50221_set_configoption(ca, slot) != 0) {
1083 ca->dvbdev->adapter->num);
1084 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1085 dvb_ca_en50221_thread_update_delay(ca);
1088 if (ca->pub->write_cam_control(ca->pub, slot,
1091 ca->dvbdev->adapter->num);
1092 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1093 dvb_ca_en50221_thread_update_delay(ca);
1098 ca->slot_info[slot].timeout = jiffies + (INIT_TIMEOUT_SECS * HZ);
1099 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_WAITFR;
1100 ca->wakeup = 1;
1104 if (time_after(jiffies, ca->slot_info[slot].timeout)) {
1106 ca->dvbdev->adapter->num);
1107 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1108 dvb_ca_en50221_thread_update_delay(ca);
1112 flags = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
1114 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
1115 ca->wakeup = 1;
1120 if (dvb_ca_en50221_link_init(ca, slot) != 0) {
1122 if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
1123 (ca->pub->poll_slot_status)) {
1124 int status = ca->pub->poll_slot_status(ca->pub, slot, 0);
1126 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
1127 dvb_ca_en50221_thread_update_delay(ca);
1132 printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num);
1133 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1134 dvb_ca_en50221_thread_update_delay(ca);
1138 if (ca->slot_info[slot].rx_buffer.data == NULL) {
1141 printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
1142 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1143 dvb_ca_en50221_thread_update_delay(ca);
1146 dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
1149 ca->pub->slot_ts_enable(ca->pub, slot);
1150 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING;
1151 dvb_ca_en50221_thread_update_delay(ca);
1152 printk("dvb_ca adapter %d: DVB CAM detected and initialised successfully\n", ca->dvbdev->adapter->num);
1156 if (!ca->open)
1161 while ((status = dvb_ca_en50221_read_data(ca, slot, NULL, 0)) > 0) {
1162 if (!ca->open)
1166 if (dvb_ca_en50221_check_camstatus(ca, slot)) {
1168 ca->wakeup = 1;
1175 ca->wakeup = 1;
1185 ca->thread_pid = 0;
1187 wake_up_interruptible(&ca->thread_queue);
1211 struct dvb_ca_private *ca = dvbdev->priv;
1219 for (slot = 0; slot < ca->slot_count; slot++) {
1220 if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE) {
1221 dvb_ca_en50221_slot_shutdown(ca, slot);
1222 if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
1223 dvb_ca_en50221_camchange_irq(ca->pub,
1228 ca->next_read_slot = 0;
1229 dvb_ca_en50221_thread_wakeup(ca);
1235 caps->slot_num = ca->slot_count;
1245 if ((info->num > ca->slot_count) || (info->num < 0))
1250 if ((ca->slot_info[info->num].slot_state != DVB_CA_SLOTSTATE_NONE)
1251 && (ca->slot_info[info->num].slot_state != DVB_CA_SLOTSTATE_INVALID)) {
1254 if (ca->slot_info[info->num].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
1300 struct dvb_ca_private *ca = dvbdev->priv;
1324 if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
1329 fraglen = ca->slot_info[slot].link_buf_size - 2;
1342 if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING) {
1347 status = dvb_ca_en50221_write_data(ca, slot, fragbuf, fraglen + 2);
1374 static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca,
1385 slot = ca->next_read_slot;
1386 while ((slot_count < ca->slot_count) && (!found)) {
1387 if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
1390 if (ca->slot_info[slot].rx_buffer.data == NULL) {
1394 idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, -1, &fraglen);
1396 dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 0, hdr, 2, 0);
1405 idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
1409 slot = (slot + 1) % ca->slot_count;
1413 ca->next_read_slot = slot;
1432 struct dvb_ca_private *ca = dvbdev->priv;
1451 if ((status = dvb_ca_en50221_io_read_condition(ca, &result, &slot)) == 0) {
1458 status = wait_event_interruptible(ca->wait_queue,
1460 (ca, &result, &slot));
1468 idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, -1, &fraglen);
1472 printk("dvb_ca adapter %d: BUG: read packet ended before last_fragment encountered\n", ca->dvbdev->adapter->num);
1477 dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 0, hdr, 2, 0);
1488 if ((status = dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 2,
1500 idx2 = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
1502 dvb_ringbuffer_pkt_dispose(&ca->slot_info[slot].rx_buffer, idx);
1529 struct dvb_ca_private *ca = dvbdev->priv;
1535 if (!try_module_get(ca->pub->owner))
1542 for (i = 0; i < ca->slot_count; i++) {
1544 if (ca->slot_info[i].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
1545 if (ca->slot_info[i].rx_buffer.data != NULL) {
1547 * ca->open == 0. Data is not read in this case */
1548 dvb_ringbuffer_flush(&ca->slot_info[i].rx_buffer);
1553 ca->open = 1;
1554 dvb_ca_en50221_thread_update_delay(ca);
1555 dvb_ca_en50221_thread_wakeup(ca);
1572 struct dvb_ca_private *ca = dvbdev->priv;
1578 ca->open = 0;
1579 dvb_ca_en50221_thread_update_delay(ca);
1583 module_put(ca->pub->owner);
1600 struct dvb_ca_private *ca = dvbdev->priv;
1607 if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
1616 poll_wait(file, &ca->wait_queue, wait);
1618 if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
1654 * @param ca The dvb_ca instance.
1664 struct dvb_ca_private *ca = NULL;
1673 if ((ca = kzalloc(sizeof(struct dvb_ca_private), GFP_KERNEL)) == NULL) {
1677 ca->pub = pubca;
1678 ca->flags = flags;
1679 ca->slot_count = slot_count;
1680 if ((ca->slot_info = kcalloc(slot_count, sizeof(struct dvb_ca_slot), GFP_KERNEL)) == NULL) {
1684 init_waitqueue_head(&ca->wait_queue);
1685 ca->thread_pid = 0;
1686 init_waitqueue_head(&ca->thread_queue);
1687 ca->exit = 0;
1688 ca->open = 0;
1689 ca->wakeup = 0;
1690 ca->next_read_slot = 0;
1691 pubca->private = ca;
1694 ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca, DVB_DEVICE_CA);
1700 memset(&ca->slot_info[i], 0, sizeof(struct dvb_ca_slot));
1701 ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
1702 atomic_set(&ca->slot_info[i].camchange_count, 0);
1703 ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
1714 ret = kernel_thread(dvb_ca_en50221_thread, ca, 0);
1720 ca->thread_pid = ret;
1724 if (ca != NULL) {
1725 if (ca->dvbdev != NULL)
1726 dvb_unregister_device(ca->dvbdev);
1727 kfree(ca->slot_info);
1728 kfree(ca);
1741 * @param ca The associated dvb_ca instance.
1745 struct dvb_ca_private *ca = pubca->private;
1751 if (ca->thread_pid) {
1752 if (kill_proc(ca->thread_pid, 0, 1) == -ESRCH) {
1754 ca->dvbdev->adapter->num, ca->thread_pid);
1756 ca->exit = 1;
1758 dvb_ca_en50221_thread_wakeup(ca);
1759 wait_event_interruptible(ca->thread_queue, ca->thread_pid == 0);
1763 for (i = 0; i < ca->slot_count; i++) {
1764 dvb_ca_en50221_slot_shutdown(ca, i);
1765 vfree(ca->slot_info[i].rx_buffer.data);
1767 kfree(ca->slot_info);
1768 dvb_unregister_device(ca->dvbdev);
1769 kfree(ca);