Lines Matching defs:ca

162 static void dvb_ca_private_free(struct dvb_ca_private *ca)
166 dvb_device_put(ca->dvbdev);
167 for (i = 0; i < ca->slot_count; i++)
168 vfree(ca->slot_info[i].rx_buffer.data);
170 kfree(ca->slot_info);
171 kfree(ca);
176 struct dvb_ca_private *ca;
178 ca = container_of(ref, struct dvb_ca_private, refcount);
179 dvb_ca_private_free(ca);
182 static void dvb_ca_private_get(struct dvb_ca_private *ca)
184 kref_get(&ca->refcount);
187 static void dvb_ca_private_put(struct dvb_ca_private *ca)
189 kref_put(&ca->refcount, dvb_ca_private_release);
192 static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
193 static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot,
195 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,
228 static int dvb_ca_en50221_check_camstatus(struct dvb_ca_private *ca, int slot)
230 struct dvb_ca_slot *sl = &ca->slot_info[slot];
236 if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
240 slot_status = ca->pub->poll_slot_status(ca->pub, slot, ca->open);
271 * @ca: CA instance.
278 static int dvb_ca_en50221_wait_if_status(struct dvb_ca_private *ca, int slot,
293 res = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
321 * @ca: CA instance.
326 static int dvb_ca_en50221_link_init(struct dvb_ca_private *ca, int slot)
328 struct dvb_ca_slot *sl = &ca->slot_info[slot];
345 ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
349 ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_DA, HZ);
352 ret = dvb_ca_en50221_read_data(ca, slot, buf, 2);
355 ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
372 ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
376 ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_FR, HZ / 10);
379 ret = dvb_ca_en50221_write_data(ca, slot, buf, 2, CMDREG_SW);
382 ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
393 * @ca: CA instance.
402 static int dvb_ca_en50221_read_tuple(struct dvb_ca_private *ca, int slot,
412 _tuple_type = ca->pub->read_attribute_mem(ca->pub, slot, _address);
422 _tuple_length = ca->pub->read_attribute_mem(ca->pub, slot,
432 tuple[i] = ca->pub->read_attribute_mem(ca->pub, slot,
451 * @ca: CA instance.
456 static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
473 status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tuple_type,
481 status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tuple_type,
489 status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tuple_type,
497 status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tuple_type,
509 status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tuple_type,
522 sl = &ca->slot_info[slot];
537 ca->dvbdev->adapter->num, dvb_str[8], dvb_str[9],
544 status = dvb_ca_en50221_read_tuple(ca, slot, &address,
598 * @ca: CA instance.
601 static int dvb_ca_en50221_set_configoption(struct dvb_ca_private *ca, int slot)
603 struct dvb_ca_slot *sl = &ca->slot_info[slot];
609 ca->pub->write_attribute_mem(ca->pub, slot, sl->config_base,
613 configoption = ca->pub->read_attribute_mem(ca->pub, slot,
628 * @ca: CA instance.
637 static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot,
640 struct dvb_ca_slot *sl = &ca->slot_info[slot];
665 if (ca->pub->read_data &&
668 status = ca->pub->read_data(ca->pub, slot, buf,
671 status = ca->pub->read_data(ca->pub, slot, buf, ecount);
679 status = ca->pub->read_cam_control(ca->pub, slot,
690 status = ca->pub->read_cam_control(ca->pub, slot,
695 status = ca->pub->read_cam_control(ca->pub, slot,
705 ca->dvbdev->adapter->num, bytes_read,
713 ca->dvbdev->adapter->num);
721 ca->dvbdev->adapter->num);
730 status = ca->pub->read_cam_control(ca->pub, slot,
740 status = ca->pub->read_cam_control(ca->pub, slot,
770 wake_up_interruptible(&ca->wait_queue);
782 * @ca: CA instance.
792 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,
795 struct dvb_ca_slot *sl = &ca->slot_info[slot];
805 if (ca->pub->write_data &&
807 return ca->pub->write_data(ca->pub, slot, buf, bytes_write);
815 status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
820 dvb_ca_en50221_thread_wakeup(ca);
827 status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
833 status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
853 status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
859 dvb_ca_en50221_thread_wakeup(ca);
866 status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_HIGH,
870 status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_LOW,
877 status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_DATA,
884 status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
898 ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
910 * @ca: CA instance.
913 static int dvb_ca_en50221_slot_shutdown(struct dvb_ca_private *ca, int slot)
917 ca->pub->slot_shutdown(ca->pub, slot);
918 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
924 wake_up_interruptible(&ca->wait_queue);
942 struct dvb_ca_private *ca = pubca->private;
943 struct dvb_ca_slot *sl = &ca->slot_info[slot];
958 dvb_ca_en50221_thread_wakeup(ca);
970 struct dvb_ca_private *ca = pubca->private;
971 struct dvb_ca_slot *sl = &ca->slot_info[slot];
977 dvb_ca_en50221_thread_wakeup(ca);
990 struct dvb_ca_private *ca = pubca->private;
991 struct dvb_ca_slot *sl = &ca->slot_info[slot];
998 flags = ca->pub->read_cam_control(pubca, slot, CTRLIF_STATUS);
1006 if (ca->open)
1007 dvb_ca_en50221_thread_wakeup(ca);
1019 * @ca: CA instance.
1021 static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca)
1025 ca->wakeup = 1;
1027 wake_up_process(ca->thread);
1033 * @ca: CA instance.
1035 static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca)
1045 for (slot = 0; slot < ca->slot_count; slot++) {
1046 struct dvb_ca_slot *sl = &ca->slot_info[slot];
1052 if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
1057 if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
1071 if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
1073 if (ca->open) {
1075 (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_DA)))
1085 ca->delay = curdelay;
1091 * @ca: CA instance.
1097 static int dvb_ca_en50221_poll_cam_gone(struct dvb_ca_private *ca, int slot)
1106 if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
1107 (ca->pub->poll_slot_status)) {
1108 status = ca->pub->poll_slot_status(ca->pub, slot, 0);
1111 ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
1112 dvb_ca_en50221_thread_update_delay(ca);
1123 * @ca: CA instance.
1126 static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca,
1129 struct dvb_ca_slot *sl = &ca->slot_info[slot];
1137 while (dvb_ca_en50221_check_camstatus(ca, slot)) {
1140 dvb_ca_en50221_slot_shutdown(ca, slot);
1147 dvb_ca_en50221_thread_update_delay(ca);
1160 ca->pub->slot_reset(ca->pub, slot);
1167 ca->dvbdev->adapter->num);
1169 dvb_ca_en50221_thread_update_delay(ca);
1179 if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) {
1180 if (dvb_ca_en50221_poll_cam_gone(ca, slot))
1184 ca->dvbdev->adapter->num);
1186 dvb_ca_en50221_thread_update_delay(ca);
1189 if (dvb_ca_en50221_set_configoption(ca, slot) != 0) {
1191 ca->dvbdev->adapter->num);
1193 dvb_ca_en50221_thread_update_delay(ca);
1196 if (ca->pub->write_cam_control(ca->pub, slot,
1200 ca->dvbdev->adapter->num);
1202 dvb_ca_en50221_thread_update_delay(ca);
1209 ca->wakeup = 1;
1215 ca->dvbdev->adapter->num);
1217 dvb_ca_en50221_thread_update_delay(ca);
1221 flags = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
1224 ca->wakeup = 1;
1229 if (dvb_ca_en50221_link_init(ca, slot) != 0) {
1230 if (dvb_ca_en50221_poll_cam_gone(ca, slot))
1234 ca->dvbdev->adapter->num);
1236 dvb_ca_en50221_thread_update_delay(ca);
1244 ca->dvbdev->adapter->num);
1246 dvb_ca_en50221_thread_update_delay(ca);
1253 ca->pub->slot_ts_enable(ca->pub, slot);
1255 dvb_ca_en50221_thread_update_delay(ca);
1257 ca->dvbdev->adapter->num);
1261 if (!ca->open)
1266 while (dvb_ca_en50221_read_data(ca, slot, NULL, 0) > 0) {
1267 if (!ca->open)
1274 if (dvb_ca_en50221_check_camstatus(ca, slot)) {
1279 ca->wakeup = 1;
1289 ca->wakeup = 1;
1305 struct dvb_ca_private *ca = data;
1311 dvb_ca_en50221_thread_update_delay(ca);
1316 if (!ca->wakeup) {
1318 schedule_timeout(ca->delay);
1322 ca->wakeup = 0;
1325 for (slot = 0; slot < ca->slot_count; slot++)
1326 dvb_ca_en50221_thread_state_machine(ca, slot);
1350 struct dvb_ca_private *ca = dvbdev->priv;
1356 if (mutex_lock_interruptible(&ca->ioctl_mutex))
1361 for (slot = 0; slot < ca->slot_count; slot++) {
1362 struct dvb_ca_slot *sl = &ca->slot_info[slot];
1366 dvb_ca_en50221_slot_shutdown(ca, slot);
1367 if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
1368 dvb_ca_en50221_camchange_irq(ca->pub,
1374 ca->next_read_slot = 0;
1375 dvb_ca_en50221_thread_wakeup(ca);
1381 caps->slot_num = ca->slot_count;
1393 if ((slot >= ca->slot_count) || (slot < 0)) {
1397 slot = array_index_nospec(slot, ca->slot_count);
1401 sl = &ca->slot_info[slot];
1417 mutex_unlock(&ca->ioctl_mutex);
1451 struct dvb_ca_private *ca = dvbdev->priv;
1478 if (slot >= ca->slot_count)
1480 slot = array_index_nospec(slot, ca->slot_count);
1481 sl = &ca->slot_info[slot];
1518 status = dvb_ca_en50221_write_data(ca, slot, fragbuf,
1546 static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca,
1557 slot = ca->next_read_slot;
1558 while ((slot_count < ca->slot_count) && (!found)) {
1559 struct dvb_ca_slot *sl = &ca->slot_info[slot];
1584 slot = (slot + 1) % ca->slot_count;
1588 ca->next_read_slot = slot;
1606 struct dvb_ca_private *ca = dvbdev->priv;
1629 status = dvb_ca_en50221_io_read_condition(ca, &result, &slot);
1636 status = wait_event_interruptible(ca->wait_queue,
1638 (ca, &result, &slot));
1646 sl = &ca->slot_info[slot];
1652 ca->dvbdev->adapter->num);
1714 struct dvb_ca_private *ca = dvbdev->priv;
1720 mutex_lock(&ca->remove_mutex);
1722 if (ca->exit) {
1723 mutex_unlock(&ca->remove_mutex);
1727 if (!try_module_get(ca->pub->owner)) {
1728 mutex_unlock(&ca->remove_mutex);
1734 module_put(ca->pub->owner);
1735 mutex_unlock(&ca->remove_mutex);
1739 for (i = 0; i < ca->slot_count; i++) {
1740 struct dvb_ca_slot *sl = &ca->slot_info[i];
1746 * because ca->open == 0. Data is not read in
1754 ca->open = 1;
1755 dvb_ca_en50221_thread_update_delay(ca);
1756 dvb_ca_en50221_thread_wakeup(ca);
1758 dvb_ca_private_get(ca);
1760 mutex_unlock(&ca->remove_mutex);
1775 struct dvb_ca_private *ca = dvbdev->priv;
1780 mutex_lock(&ca->remove_mutex);
1783 ca->open = 0;
1784 dvb_ca_en50221_thread_update_delay(ca);
1788 module_put(ca->pub->owner);
1790 dvb_ca_private_put(ca);
1792 if (dvbdev->users == 1 && ca->exit == 1) {
1793 mutex_unlock(&ca->remove_mutex);
1796 mutex_unlock(&ca->remove_mutex);
1813 struct dvb_ca_private *ca = dvbdev->priv;
1820 poll_wait(file, &ca->wait_queue, wait);
1822 if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1)
1829 if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1)
1852 .name = "dvb-ca-en50221",
1874 struct dvb_ca_private *ca = NULL;
1883 ca = kzalloc(sizeof(*ca), GFP_KERNEL);
1884 if (!ca) {
1888 kref_init(&ca->refcount);
1889 ca->pub = pubca;
1890 ca->flags = flags;
1891 ca->slot_count = slot_count;
1892 ca->slot_info = kcalloc(slot_count, sizeof(struct dvb_ca_slot),
1894 if (!ca->slot_info) {
1898 init_waitqueue_head(&ca->wait_queue);
1899 ca->open = 0;
1900 ca->wakeup = 0;
1901 ca->next_read_slot = 0;
1902 pubca->private = ca;
1905 ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca,
1912 struct dvb_ca_slot *sl = &ca->slot_info[i];
1921 mutex_init(&ca->ioctl_mutex);
1922 mutex_init(&ca->remove_mutex);
1931 ca->thread = kthread_run(dvb_ca_en50221_thread, ca, "kdvb-ca-%i:%i",
1932 ca->dvbdev->adapter->num, ca->dvbdev->id);
1933 if (IS_ERR(ca->thread)) {
1934 ret = PTR_ERR(ca->thread);
1942 dvb_unregister_device(ca->dvbdev);
1944 kfree(ca->slot_info);
1946 kfree(ca);
1960 struct dvb_ca_private *ca = pubca->private;
1965 mutex_lock(&ca->remove_mutex);
1966 ca->exit = 1;
1967 mutex_unlock(&ca->remove_mutex);
1969 if (ca->dvbdev->users < 1)
1970 wait_event(ca->dvbdev->wait_queue,
1971 ca->dvbdev->users == 1);
1974 kthread_stop(ca->thread);
1976 for (i = 0; i < ca->slot_count; i++)
1977 dvb_ca_en50221_slot_shutdown(ca, i);
1979 dvb_remove_device(ca->dvbdev);
1980 dvb_ca_private_put(ca);