PageRenderTime 66ms CodeModel.GetById 9ms app.highlight 46ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/media/dvb/dvb-core/dvb_ca_en50221.c

https://bitbucket.org/abioy/linux
C | 1742 lines | 1070 code | 305 blank | 367 comment | 263 complexity | 9a7894a9166e14125ff973fcd997cbf4 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, GPL-2.0, LGPL-2.0, AGPL-1.0
   1/*
   2 * dvb_ca.c: generic DVB functions for EN50221 CAM interfaces
   3 *
   4 * Copyright (C) 2004 Andrew de Quincey
   5 *
   6 * Parts of this file were based on sources as follows:
   7 *
   8 * Copyright (C) 2003 Ralph Metzler <rjkm@metzlerbros.de>
   9 *
  10 * based on code:
  11 *
  12 * Copyright (C) 1999-2002 Ralph  Metzler
  13 *                       & Marcus Metzler for convergence integrated media GmbH
  14 *
  15 * This program is free software; you can redistribute it and/or
  16 * modify it under the terms of the GNU General Public License
  17 * as published by the Free Software Foundation; either version 2
  18 * of the License, or (at your option) any later version.
  19 *
  20 * This program is distributed in the hope that it will be useful,
  21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23 * GNU General Public License for more details.
  24 *
  25 * You should have received a copy of the GNU General Public License
  26 * along with this program; if not, write to the Free Software
  27 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  28 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  29 */
  30
  31#include <linux/errno.h>
  32#include <linux/slab.h>
  33#include <linux/list.h>
  34#include <linux/module.h>
  35#include <linux/vmalloc.h>
  36#include <linux/delay.h>
  37#include <linux/spinlock.h>
  38#include <linux/sched.h>
  39#include <linux/kthread.h>
  40
  41#include "dvb_ca_en50221.h"
  42#include "dvb_ringbuffer.h"
  43
  44static int dvb_ca_en50221_debug;
  45
  46module_param_named(cam_debug, dvb_ca_en50221_debug, int, 0644);
  47MODULE_PARM_DESC(cam_debug, "enable verbose debug messages");
  48
  49#define dprintk if (dvb_ca_en50221_debug) printk
  50
  51#define INIT_TIMEOUT_SECS 10
  52
  53#define HOST_LINK_BUF_SIZE 0x200
  54
  55#define RX_BUFFER_SIZE 65535
  56
  57#define MAX_RX_PACKETS_PER_ITERATION 10
  58
  59#define CTRLIF_DATA      0
  60#define CTRLIF_COMMAND   1
  61#define CTRLIF_STATUS    1
  62#define CTRLIF_SIZE_LOW  2
  63#define CTRLIF_SIZE_HIGH 3
  64
  65#define CMDREG_HC        1	/* Host control */
  66#define CMDREG_SW        2	/* Size write */
  67#define CMDREG_SR        4	/* Size read */
  68#define CMDREG_RS        8	/* Reset interface */
  69#define CMDREG_FRIE   0x40	/* Enable FR interrupt */
  70#define CMDREG_DAIE   0x80	/* Enable DA interrupt */
  71#define IRQEN (CMDREG_DAIE)
  72
  73#define STATUSREG_RE     1	/* read error */
  74#define STATUSREG_WE     2	/* write error */
  75#define STATUSREG_FR  0x40	/* module free */
  76#define STATUSREG_DA  0x80	/* data available */
  77#define STATUSREG_TXERR (STATUSREG_RE|STATUSREG_WE)	/* general transfer error */
  78
  79
  80#define DVB_CA_SLOTSTATE_NONE           0
  81#define DVB_CA_SLOTSTATE_UNINITIALISED  1
  82#define DVB_CA_SLOTSTATE_RUNNING        2
  83#define DVB_CA_SLOTSTATE_INVALID        3
  84#define DVB_CA_SLOTSTATE_WAITREADY      4
  85#define DVB_CA_SLOTSTATE_VALIDATE       5
  86#define DVB_CA_SLOTSTATE_WAITFR         6
  87#define DVB_CA_SLOTSTATE_LINKINIT       7
  88
  89
  90/* Information on a CA slot */
  91struct dvb_ca_slot {
  92
  93	/* current state of the CAM */
  94	int slot_state;
  95
  96	/* mutex used for serializing access to one CI slot */
  97	struct mutex slot_lock;
  98
  99	/* Number of CAMCHANGES that have occurred since last processing */
 100	atomic_t camchange_count;
 101
 102	/* Type of last CAMCHANGE */
 103	int camchange_type;
 104
 105	/* base address of CAM config */
 106	u32 config_base;
 107
 108	/* value to write into Config Control register */
 109	u8 config_option;
 110
 111	/* if 1, the CAM supports DA IRQs */
 112	u8 da_irq_supported:1;
 113
 114	/* size of the buffer to use when talking to the CAM */
 115	int link_buf_size;
 116
 117	/* buffer for incoming packets */
 118	struct dvb_ringbuffer rx_buffer;
 119
 120	/* timer used during various states of the slot */
 121	unsigned long timeout;
 122};
 123
 124/* Private CA-interface information */
 125struct dvb_ca_private {
 126
 127	/* pointer back to the public data structure */
 128	struct dvb_ca_en50221 *pub;
 129
 130	/* the DVB device */
 131	struct dvb_device *dvbdev;
 132
 133	/* Flags describing the interface (DVB_CA_FLAG_*) */
 134	u32 flags;
 135
 136	/* number of slots supported by this CA interface */
 137	unsigned int slot_count;
 138
 139	/* information on each slot */
 140	struct dvb_ca_slot *slot_info;
 141
 142	/* wait queues for read() and write() operations */
 143	wait_queue_head_t wait_queue;
 144
 145	/* PID of the monitoring thread */
 146	struct task_struct *thread;
 147
 148	/* Flag indicating if the CA device is open */
 149	unsigned int open:1;
 150
 151	/* Flag indicating the thread should wake up now */
 152	unsigned int wakeup:1;
 153
 154	/* Delay the main thread should use */
 155	unsigned long delay;
 156
 157	/* Slot to start looking for data to read from in the next user-space read operation */
 158	int next_read_slot;
 159};
 160
 161static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
 162static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount);
 163static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount);
 164
 165
 166/**
 167 * Safely find needle in haystack.
 168 *
 169 * @param haystack Buffer to look in.
 170 * @param hlen Number of bytes in haystack.
 171 * @param needle Buffer to find.
 172 * @param nlen Number of bytes in needle.
 173 * @return Pointer into haystack needle was found at, or NULL if not found.
 174 */
 175static char *findstr(char * haystack, int hlen, char * needle, int nlen)
 176{
 177	int i;
 178
 179	if (hlen < nlen)
 180		return NULL;
 181
 182	for (i = 0; i <= hlen - nlen; i++) {
 183		if (!strncmp(haystack + i, needle, nlen))
 184			return haystack + i;
 185	}
 186
 187	return NULL;
 188}
 189
 190
 191
 192/* ******************************************************************************** */
 193/* EN50221 physical interface functions */
 194
 195
 196/**
 197 * Check CAM status.
 198 */
 199static int dvb_ca_en50221_check_camstatus(struct dvb_ca_private *ca, int slot)
 200{
 201	int slot_status;
 202	int cam_present_now;
 203	int cam_changed;
 204
 205	/* IRQ mode */
 206	if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE) {
 207		return (atomic_read(&ca->slot_info[slot].camchange_count) != 0);
 208	}
 209
 210	/* poll mode */
 211	slot_status = ca->pub->poll_slot_status(ca->pub, slot, ca->open);
 212
 213	cam_present_now = (slot_status & DVB_CA_EN50221_POLL_CAM_PRESENT) ? 1 : 0;
 214	cam_changed = (slot_status & DVB_CA_EN50221_POLL_CAM_CHANGED) ? 1 : 0;
 215	if (!cam_changed) {
 216		int cam_present_old = (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE);
 217		cam_changed = (cam_present_now != cam_present_old);
 218	}
 219
 220	if (cam_changed) {
 221		if (!cam_present_now) {
 222			ca->slot_info[slot].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
 223		} else {
 224			ca->slot_info[slot].camchange_type = DVB_CA_EN50221_CAMCHANGE_INSERTED;
 225		}
 226		atomic_set(&ca->slot_info[slot].camchange_count, 1);
 227	} else {
 228		if ((ca->slot_info[slot].slot_state == DVB_CA_SLOTSTATE_WAITREADY) &&
 229		    (slot_status & DVB_CA_EN50221_POLL_CAM_READY)) {
 230			// move to validate state if reset is completed
 231			ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_VALIDATE;
 232		}
 233	}
 234
 235	return cam_changed;
 236}
 237
 238
 239/**
 240 * Wait for flags to become set on the STATUS register on a CAM interface,
 241 * checking for errors and timeout.
 242 *
 243 * @param ca CA instance.
 244 * @param slot Slot on interface.
 245 * @param waitfor Flags to wait for.
 246 * @param timeout_ms Timeout in milliseconds.
 247 *
 248 * @return 0 on success, nonzero on error.
 249 */
 250static int dvb_ca_en50221_wait_if_status(struct dvb_ca_private *ca, int slot,
 251					 u8 waitfor, int timeout_hz)
 252{
 253	unsigned long timeout;
 254	unsigned long start;
 255
 256	dprintk("%s\n", __func__);
 257
 258	/* loop until timeout elapsed */
 259	start = jiffies;
 260	timeout = jiffies + timeout_hz;
 261	while (1) {
 262		/* read the status and check for error */
 263		int res = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
 264		if (res < 0)
 265			return -EIO;
 266
 267		/* if we got the flags, it was successful! */
 268		if (res & waitfor) {
 269			dprintk("%s succeeded timeout:%lu\n", __func__, jiffies - start);
 270			return 0;
 271		}
 272
 273		/* check for timeout */
 274		if (time_after(jiffies, timeout)) {
 275			break;
 276		}
 277
 278		/* wait for a bit */
 279		msleep(1);
 280	}
 281
 282	dprintk("%s failed timeout:%lu\n", __func__, jiffies - start);
 283
 284	/* if we get here, we've timed out */
 285	return -ETIMEDOUT;
 286}
 287
 288
 289/**
 290 * Initialise the link layer connection to a CAM.
 291 *
 292 * @param ca CA instance.
 293 * @param slot Slot id.
 294 *
 295 * @return 0 on success, nonzero on failure.
 296 */
 297static int dvb_ca_en50221_link_init(struct dvb_ca_private *ca, int slot)
 298{
 299	int ret;
 300	int buf_size;
 301	u8 buf[2];
 302
 303	dprintk("%s\n", __func__);
 304
 305	/* we'll be determining these during this function */
 306	ca->slot_info[slot].da_irq_supported = 0;
 307
 308	/* set the host link buffer size temporarily. it will be overwritten with the
 309	 * real negotiated size later. */
 310	ca->slot_info[slot].link_buf_size = 2;
 311
 312	/* read the buffer size from the CAM */
 313	if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN | CMDREG_SR)) != 0)
 314		return ret;
 315	if ((ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_DA, HZ / 10)) != 0)
 316		return ret;
 317	if ((ret = dvb_ca_en50221_read_data(ca, slot, buf, 2)) != 2)
 318		return -EIO;
 319	if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN)) != 0)
 320		return ret;
 321
 322	/* store it, and choose the minimum of our buffer and the CAM's buffer size */
 323	buf_size = (buf[0] << 8) | buf[1];
 324	if (buf_size > HOST_LINK_BUF_SIZE)
 325		buf_size = HOST_LINK_BUF_SIZE;
 326	ca->slot_info[slot].link_buf_size = buf_size;
 327	buf[0] = buf_size >> 8;
 328	buf[1] = buf_size & 0xff;
 329	dprintk("Chosen link buffer size of %i\n", buf_size);
 330
 331	/* write the buffer size to the CAM */
 332	if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN | CMDREG_SW)) != 0)
 333		return ret;
 334	if ((ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_FR, HZ / 10)) != 0)
 335		return ret;
 336	if ((ret = dvb_ca_en50221_write_data(ca, slot, buf, 2)) != 2)
 337		return -EIO;
 338	if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN)) != 0)
 339		return ret;
 340
 341	/* success */
 342	return 0;
 343}
 344
 345/**
 346 * Read a tuple from attribute memory.
 347 *
 348 * @param ca CA instance.
 349 * @param slot Slot id.
 350 * @param address Address to read from. Updated.
 351 * @param tupleType Tuple id byte. Updated.
 352 * @param tupleLength Tuple length. Updated.
 353 * @param tuple Dest buffer for tuple (must be 256 bytes). Updated.
 354 *
 355 * @return 0 on success, nonzero on error.
 356 */
 357static int dvb_ca_en50221_read_tuple(struct dvb_ca_private *ca, int slot,
 358				     int *address, int *tupleType, int *tupleLength, u8 * tuple)
 359{
 360	int i;
 361	int _tupleType;
 362	int _tupleLength;
 363	int _address = *address;
 364
 365	/* grab the next tuple length and type */
 366	if ((_tupleType = ca->pub->read_attribute_mem(ca->pub, slot, _address)) < 0)
 367		return _tupleType;
 368	if (_tupleType == 0xff) {
 369		dprintk("END OF CHAIN TUPLE type:0x%x\n", _tupleType);
 370		*address += 2;
 371		*tupleType = _tupleType;
 372		*tupleLength = 0;
 373		return 0;
 374	}
 375	if ((_tupleLength = ca->pub->read_attribute_mem(ca->pub, slot, _address + 2)) < 0)
 376		return _tupleLength;
 377	_address += 4;
 378
 379	dprintk("TUPLE type:0x%x length:%i\n", _tupleType, _tupleLength);
 380
 381	/* read in the whole tuple */
 382	for (i = 0; i < _tupleLength; i++) {
 383		tuple[i] = ca->pub->read_attribute_mem(ca->pub, slot, _address + (i * 2));
 384		dprintk("  0x%02x: 0x%02x %c\n",
 385			i, tuple[i] & 0xff,
 386			((tuple[i] > 31) && (tuple[i] < 127)) ? tuple[i] : '.');
 387	}
 388	_address += (_tupleLength * 2);
 389
 390	// success
 391	*tupleType = _tupleType;
 392	*tupleLength = _tupleLength;
 393	*address = _address;
 394	return 0;
 395}
 396
 397
 398/**
 399 * Parse attribute memory of a CAM module, extracting Config register, and checking
 400 * it is a DVB CAM module.
 401 *
 402 * @param ca CA instance.
 403 * @param slot Slot id.
 404 *
 405 * @return 0 on success, <0 on failure.
 406 */
 407static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
 408{
 409	int address = 0;
 410	int tupleLength;
 411	int tupleType;
 412	u8 tuple[257];
 413	char *dvb_str;
 414	int rasz;
 415	int status;
 416	int got_cftableentry = 0;
 417	int end_chain = 0;
 418	int i;
 419	u16 manfid = 0;
 420	u16 devid = 0;
 421
 422
 423	// CISTPL_DEVICE_0A
 424	if ((status =
 425	     dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
 426		return status;
 427	if (tupleType != 0x1D)
 428		return -EINVAL;
 429
 430
 431
 432	// CISTPL_DEVICE_0C
 433	if ((status =
 434	     dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
 435		return status;
 436	if (tupleType != 0x1C)
 437		return -EINVAL;
 438
 439
 440
 441	// CISTPL_VERS_1
 442	if ((status =
 443	     dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType, &tupleLength, tuple)) < 0)
 444		return status;
 445	if (tupleType != 0x15)
 446		return -EINVAL;
 447
 448
 449
 450	// CISTPL_MANFID
 451	if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
 452						&tupleLength, tuple)) < 0)
 453		return status;
 454	if (tupleType != 0x20)
 455		return -EINVAL;
 456	if (tupleLength != 4)
 457		return -EINVAL;
 458	manfid = (tuple[1] << 8) | tuple[0];
 459	devid = (tuple[3] << 8) | tuple[2];
 460
 461
 462
 463	// CISTPL_CONFIG
 464	if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
 465						&tupleLength, tuple)) < 0)
 466		return status;
 467	if (tupleType != 0x1A)
 468		return -EINVAL;
 469	if (tupleLength < 3)
 470		return -EINVAL;
 471
 472	/* extract the configbase */
 473	rasz = tuple[0] & 3;
 474	if (tupleLength < (3 + rasz + 14))
 475		return -EINVAL;
 476	ca->slot_info[slot].config_base = 0;
 477	for (i = 0; i < rasz + 1; i++) {
 478		ca->slot_info[slot].config_base |= (tuple[2 + i] << (8 * i));
 479	}
 480
 481	/* check it contains the correct DVB string */
 482	dvb_str = findstr((char *)tuple, tupleLength, "DVB_CI_V", 8);
 483	if (dvb_str == NULL)
 484		return -EINVAL;
 485	if (tupleLength < ((dvb_str - (char *) tuple) + 12))
 486		return -EINVAL;
 487
 488	/* is it a version we support? */
 489	if (strncmp(dvb_str + 8, "1.00", 4)) {
 490		printk("dvb_ca adapter %d: Unsupported DVB CAM module version %c%c%c%c\n",
 491		       ca->dvbdev->adapter->num, dvb_str[8], dvb_str[9], dvb_str[10], dvb_str[11]);
 492		return -EINVAL;
 493	}
 494
 495	/* process the CFTABLE_ENTRY tuples, and any after those */
 496	while ((!end_chain) && (address < 0x1000)) {
 497		if ((status = dvb_ca_en50221_read_tuple(ca, slot, &address, &tupleType,
 498							&tupleLength, tuple)) < 0)
 499			return status;
 500		switch (tupleType) {
 501		case 0x1B:	// CISTPL_CFTABLE_ENTRY
 502			if (tupleLength < (2 + 11 + 17))
 503				break;
 504
 505			/* if we've already parsed one, just use it */
 506			if (got_cftableentry)
 507				break;
 508
 509			/* get the config option */
 510			ca->slot_info[slot].config_option = tuple[0] & 0x3f;
 511
 512			/* OK, check it contains the correct strings */
 513			if ((findstr((char *)tuple, tupleLength, "DVB_HOST", 8) == NULL) ||
 514			    (findstr((char *)tuple, tupleLength, "DVB_CI_MODULE", 13) == NULL))
 515				break;
 516
 517			got_cftableentry = 1;
 518			break;
 519
 520		case 0x14:	// CISTPL_NO_LINK
 521			break;
 522
 523		case 0xFF:	// CISTPL_END
 524			end_chain = 1;
 525			break;
 526
 527		default:	/* Unknown tuple type - just skip this tuple and move to the next one */
 528			dprintk("dvb_ca: Skipping unknown tuple type:0x%x length:0x%x\n", tupleType,
 529				tupleLength);
 530			break;
 531		}
 532	}
 533
 534	if ((address > 0x1000) || (!got_cftableentry))
 535		return -EINVAL;
 536
 537	dprintk("Valid DVB CAM detected MANID:%x DEVID:%x CONFIGBASE:0x%x CONFIGOPTION:0x%x\n",
 538		manfid, devid, ca->slot_info[slot].config_base, ca->slot_info[slot].config_option);
 539
 540	// success!
 541	return 0;
 542}
 543
 544
 545/**
 546 * Set CAM's configoption correctly.
 547 *
 548 * @param ca CA instance.
 549 * @param slot Slot containing the CAM.
 550 */
 551static int dvb_ca_en50221_set_configoption(struct dvb_ca_private *ca, int slot)
 552{
 553	int configoption;
 554
 555	dprintk("%s\n", __func__);
 556
 557	/* set the config option */
 558	ca->pub->write_attribute_mem(ca->pub, slot,
 559				     ca->slot_info[slot].config_base,
 560				     ca->slot_info[slot].config_option);
 561
 562	/* check it */
 563	configoption = ca->pub->read_attribute_mem(ca->pub, slot, ca->slot_info[slot].config_base);
 564	dprintk("Set configoption 0x%x, read configoption 0x%x\n",
 565		ca->slot_info[slot].config_option, configoption & 0x3f);
 566
 567	/* fine! */
 568	return 0;
 569
 570}
 571
 572
 573/**
 574 * This function talks to an EN50221 CAM control interface. It reads a buffer of
 575 * data from the CAM. The data can either be stored in a supplied buffer, or
 576 * automatically be added to the slot's rx_buffer.
 577 *
 578 * @param ca CA instance.
 579 * @param slot Slot to read from.
 580 * @param ebuf If non-NULL, the data will be written to this buffer. If NULL,
 581 * the data will be added into the buffering system as a normal fragment.
 582 * @param ecount Size of ebuf. Ignored if ebuf is NULL.
 583 *
 584 * @return Number of bytes read, or < 0 on error
 585 */
 586static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * ebuf, int ecount)
 587{
 588	int bytes_read;
 589	int status;
 590	u8 buf[HOST_LINK_BUF_SIZE];
 591	int i;
 592
 593	dprintk("%s\n", __func__);
 594
 595	/* check if we have space for a link buf in the rx_buffer */
 596	if (ebuf == NULL) {
 597		int buf_free;
 598
 599		if (ca->slot_info[slot].rx_buffer.data == NULL) {
 600			status = -EIO;
 601			goto exit;
 602		}
 603		buf_free = dvb_ringbuffer_free(&ca->slot_info[slot].rx_buffer);
 604
 605		if (buf_free < (ca->slot_info[slot].link_buf_size + DVB_RINGBUFFER_PKTHDRSIZE)) {
 606			status = -EAGAIN;
 607			goto exit;
 608		}
 609	}
 610
 611	/* check if there is data available */
 612	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
 613		goto exit;
 614	if (!(status & STATUSREG_DA)) {
 615		/* no data */
 616		status = 0;
 617		goto exit;
 618	}
 619
 620	/* read the amount of data */
 621	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_SIZE_HIGH)) < 0)
 622		goto exit;
 623	bytes_read = status << 8;
 624	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_SIZE_LOW)) < 0)
 625		goto exit;
 626	bytes_read |= status;
 627
 628	/* check it will fit */
 629	if (ebuf == NULL) {
 630		if (bytes_read > ca->slot_info[slot].link_buf_size) {
 631			printk("dvb_ca adapter %d: CAM tried to send a buffer larger than the link buffer size (%i > %i)!\n",
 632			       ca->dvbdev->adapter->num, bytes_read, ca->slot_info[slot].link_buf_size);
 633			ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
 634			status = -EIO;
 635			goto exit;
 636		}
 637		if (bytes_read < 2) {
 638			printk("dvb_ca adapter %d: CAM sent a buffer that was less than 2 bytes!\n",
 639			       ca->dvbdev->adapter->num);
 640			ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
 641			status = -EIO;
 642			goto exit;
 643		}
 644	} else {
 645		if (bytes_read > ecount) {
 646			printk("dvb_ca adapter %d: CAM tried to send a buffer larger than the ecount size!\n",
 647			       ca->dvbdev->adapter->num);
 648			status = -EIO;
 649			goto exit;
 650		}
 651	}
 652
 653	/* fill the buffer */
 654	for (i = 0; i < bytes_read; i++) {
 655		/* read byte and check */
 656		if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_DATA)) < 0)
 657			goto exit;
 658
 659		/* OK, store it in the buffer */
 660		buf[i] = status;
 661	}
 662
 663	/* check for read error (RE should now be 0) */
 664	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
 665		goto exit;
 666	if (status & STATUSREG_RE) {
 667		ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
 668		status = -EIO;
 669		goto exit;
 670	}
 671
 672	/* OK, add it to the receive buffer, or copy into external buffer if supplied */
 673	if (ebuf == NULL) {
 674		if (ca->slot_info[slot].rx_buffer.data == NULL) {
 675			status = -EIO;
 676			goto exit;
 677		}
 678		dvb_ringbuffer_pkt_write(&ca->slot_info[slot].rx_buffer, buf, bytes_read);
 679	} else {
 680		memcpy(ebuf, buf, bytes_read);
 681	}
 682
 683	dprintk("Received CA packet for slot %i connection id 0x%x last_frag:%i size:0x%x\n", slot,
 684		buf[0], (buf[1] & 0x80) == 0, bytes_read);
 685
 686	/* wake up readers when a last_fragment is received */
 687	if ((buf[1] & 0x80) == 0x00) {
 688		wake_up_interruptible(&ca->wait_queue);
 689	}
 690	status = bytes_read;
 691
 692exit:
 693	return status;
 694}
 695
 696
 697/**
 698 * This function talks to an EN50221 CAM control interface. It writes a buffer of data
 699 * to a CAM.
 700 *
 701 * @param ca CA instance.
 702 * @param slot Slot to write to.
 703 * @param ebuf The data in this buffer is treated as a complete link-level packet to
 704 * be written.
 705 * @param count Size of ebuf.
 706 *
 707 * @return Number of bytes written, or < 0 on error.
 708 */
 709static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot, u8 * buf, int bytes_write)
 710{
 711	int status;
 712	int i;
 713
 714	dprintk("%s\n", __func__);
 715
 716
 717	/* sanity check */
 718	if (bytes_write > ca->slot_info[slot].link_buf_size)
 719		return -EINVAL;
 720
 721	/* it is possible we are dealing with a single buffer implementation,
 722	   thus if there is data available for read or if there is even a read
 723	   already in progress, we do nothing but awake the kernel thread to
 724	   process the data if necessary. */
 725	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
 726		goto exitnowrite;
 727	if (status & (STATUSREG_DA | STATUSREG_RE)) {
 728		if (status & STATUSREG_DA)
 729			dvb_ca_en50221_thread_wakeup(ca);
 730
 731		status = -EAGAIN;
 732		goto exitnowrite;
 733	}
 734
 735	/* OK, set HC bit */
 736	if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
 737						 IRQEN | CMDREG_HC)) != 0)
 738		goto exit;
 739
 740	/* check if interface is still free */
 741	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
 742		goto exit;
 743	if (!(status & STATUSREG_FR)) {
 744		/* it wasn't free => try again later */
 745		status = -EAGAIN;
 746		goto exit;
 747	}
 748
 749	/* send the amount of data */
 750	if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_HIGH, bytes_write >> 8)) != 0)
 751		goto exit;
 752	if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_SIZE_LOW,
 753						 bytes_write & 0xff)) != 0)
 754		goto exit;
 755
 756	/* send the buffer */
 757	for (i = 0; i < bytes_write; i++) {
 758		if ((status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_DATA, buf[i])) != 0)
 759			goto exit;
 760	}
 761
 762	/* check for write error (WE should now be 0) */
 763	if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
 764		goto exit;
 765	if (status & STATUSREG_WE) {
 766		ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
 767		status = -EIO;
 768		goto exit;
 769	}
 770	status = bytes_write;
 771
 772	dprintk("Wrote CA packet for slot %i, connection id 0x%x last_frag:%i size:0x%x\n", slot,
 773		buf[0], (buf[1] & 0x80) == 0, bytes_write);
 774
 775exit:
 776	ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
 777
 778exitnowrite:
 779	return status;
 780}
 781EXPORT_SYMBOL(dvb_ca_en50221_camchange_irq);
 782
 783
 784
 785/* ******************************************************************************** */
 786/* EN50221 higher level functions */
 787
 788
 789/**
 790 * A CAM has been removed => shut it down.
 791 *
 792 * @param ca CA instance.
 793 * @param slot Slot to shut down.
 794 */
 795static int dvb_ca_en50221_slot_shutdown(struct dvb_ca_private *ca, int slot)
 796{
 797	dprintk("%s\n", __func__);
 798
 799	ca->pub->slot_shutdown(ca->pub, slot);
 800	ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
 801
 802	/* need to wake up all processes to check if they're now
 803	   trying to write to a defunct CAM */
 804	wake_up_interruptible(&ca->wait_queue);
 805
 806	dprintk("Slot %i shutdown\n", slot);
 807
 808	/* success */
 809	return 0;
 810}
 811EXPORT_SYMBOL(dvb_ca_en50221_camready_irq);
 812
 813
 814/**
 815 * A CAMCHANGE IRQ has occurred.
 816 *
 817 * @param ca CA instance.
 818 * @param slot Slot concerned.
 819 * @param change_type One of the DVB_CA_CAMCHANGE_* values.
 820 */
 821void dvb_ca_en50221_camchange_irq(struct dvb_ca_en50221 *pubca, int slot, int change_type)
 822{
 823	struct dvb_ca_private *ca = pubca->private;
 824
 825	dprintk("CAMCHANGE IRQ slot:%i change_type:%i\n", slot, change_type);
 826
 827	switch (change_type) {
 828	case DVB_CA_EN50221_CAMCHANGE_REMOVED:
 829	case DVB_CA_EN50221_CAMCHANGE_INSERTED:
 830		break;
 831
 832	default:
 833		return;
 834	}
 835
 836	ca->slot_info[slot].camchange_type = change_type;
 837	atomic_inc(&ca->slot_info[slot].camchange_count);
 838	dvb_ca_en50221_thread_wakeup(ca);
 839}
 840EXPORT_SYMBOL(dvb_ca_en50221_frda_irq);
 841
 842
 843/**
 844 * A CAMREADY IRQ has occurred.
 845 *
 846 * @param ca CA instance.
 847 * @param slot Slot concerned.
 848 */
 849void dvb_ca_en50221_camready_irq(struct dvb_ca_en50221 *pubca, int slot)
 850{
 851	struct dvb_ca_private *ca = pubca->private;
 852
 853	dprintk("CAMREADY IRQ slot:%i\n", slot);
 854
 855	if (ca->slot_info[slot].slot_state == DVB_CA_SLOTSTATE_WAITREADY) {
 856		ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_VALIDATE;
 857		dvb_ca_en50221_thread_wakeup(ca);
 858	}
 859}
 860
 861
 862/**
 863 * An FR or DA IRQ has occurred.
 864 *
 865 * @param ca CA instance.
 866 * @param slot Slot concerned.
 867 */
 868void dvb_ca_en50221_frda_irq(struct dvb_ca_en50221 *pubca, int slot)
 869{
 870	struct dvb_ca_private *ca = pubca->private;
 871	int flags;
 872
 873	dprintk("FR/DA IRQ slot:%i\n", slot);
 874
 875	switch (ca->slot_info[slot].slot_state) {
 876	case DVB_CA_SLOTSTATE_LINKINIT:
 877		flags = ca->pub->read_cam_control(pubca, slot, CTRLIF_STATUS);
 878		if (flags & STATUSREG_DA) {
 879			dprintk("CAM supports DA IRQ\n");
 880			ca->slot_info[slot].da_irq_supported = 1;
 881		}
 882		break;
 883
 884	case DVB_CA_SLOTSTATE_RUNNING:
 885		if (ca->open)
 886			dvb_ca_en50221_thread_wakeup(ca);
 887		break;
 888	}
 889}
 890
 891
 892
 893/* ******************************************************************************** */
 894/* EN50221 thread functions */
 895
 896/**
 897 * Wake up the DVB CA thread
 898 *
 899 * @param ca CA instance.
 900 */
 901static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca)
 902{
 903
 904	dprintk("%s\n", __func__);
 905
 906	ca->wakeup = 1;
 907	mb();
 908	wake_up_process(ca->thread);
 909}
 910
 911/**
 912 * Update the delay used by the thread.
 913 *
 914 * @param ca CA instance.
 915 */
 916static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca)
 917{
 918	int delay;
 919	int curdelay = 100000000;
 920	int slot;
 921
 922	/* Beware of too high polling frequency, because one polling
 923	 * call might take several hundred milliseconds until timeout!
 924	 */
 925	for (slot = 0; slot < ca->slot_count; slot++) {
 926		switch (ca->slot_info[slot].slot_state) {
 927		default:
 928		case DVB_CA_SLOTSTATE_NONE:
 929			delay = HZ * 60;  /* 60s */
 930			if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
 931				delay = HZ * 5;  /* 5s */
 932			break;
 933		case DVB_CA_SLOTSTATE_INVALID:
 934			delay = HZ * 60;  /* 60s */
 935			if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
 936				delay = HZ / 10;  /* 100ms */
 937			break;
 938
 939		case DVB_CA_SLOTSTATE_UNINITIALISED:
 940		case DVB_CA_SLOTSTATE_WAITREADY:
 941		case DVB_CA_SLOTSTATE_VALIDATE:
 942		case DVB_CA_SLOTSTATE_WAITFR:
 943		case DVB_CA_SLOTSTATE_LINKINIT:
 944			delay = HZ / 10;  /* 100ms */
 945			break;
 946
 947		case DVB_CA_SLOTSTATE_RUNNING:
 948			delay = HZ * 60;  /* 60s */
 949			if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
 950				delay = HZ / 10;  /* 100ms */
 951			if (ca->open) {
 952				if ((!ca->slot_info[slot].da_irq_supported) ||
 953				    (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_DA)))
 954					delay = HZ / 10;  /* 100ms */
 955			}
 956			break;
 957		}
 958
 959		if (delay < curdelay)
 960			curdelay = delay;
 961	}
 962
 963	ca->delay = curdelay;
 964}
 965
 966
 967
 968/**
 969 * Kernel thread which monitors CA slots for CAM changes, and performs data transfers.
 970 */
 971static int dvb_ca_en50221_thread(void *data)
 972{
 973	struct dvb_ca_private *ca = data;
 974	int slot;
 975	int flags;
 976	int status;
 977	int pktcount;
 978	void *rxbuf;
 979
 980	dprintk("%s\n", __func__);
 981
 982	/* choose the correct initial delay */
 983	dvb_ca_en50221_thread_update_delay(ca);
 984
 985	/* main loop */
 986	while (!kthread_should_stop()) {
 987		/* sleep for a bit */
 988		if (!ca->wakeup) {
 989			set_current_state(TASK_INTERRUPTIBLE);
 990			schedule_timeout(ca->delay);
 991			if (kthread_should_stop())
 992				return 0;
 993		}
 994		ca->wakeup = 0;
 995
 996		/* go through all the slots processing them */
 997		for (slot = 0; slot < ca->slot_count; slot++) {
 998
 999			mutex_lock(&ca->slot_info[slot].slot_lock);
1000
1001			// check the cam status + deal with CAMCHANGEs
1002			while (dvb_ca_en50221_check_camstatus(ca, slot)) {
1003				/* clear down an old CI slot if necessary */
1004				if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE)
1005					dvb_ca_en50221_slot_shutdown(ca, slot);
1006
1007				/* if a CAM is NOW present, initialise it */
1008				if (ca->slot_info[slot].camchange_type == DVB_CA_EN50221_CAMCHANGE_INSERTED) {
1009					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_UNINITIALISED;
1010				}
1011
1012				/* we've handled one CAMCHANGE */
1013				dvb_ca_en50221_thread_update_delay(ca);
1014				atomic_dec(&ca->slot_info[slot].camchange_count);
1015			}
1016
1017			// CAM state machine
1018			switch (ca->slot_info[slot].slot_state) {
1019			case DVB_CA_SLOTSTATE_NONE:
1020			case DVB_CA_SLOTSTATE_INVALID:
1021				// no action needed
1022				break;
1023
1024			case DVB_CA_SLOTSTATE_UNINITIALISED:
1025				ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_WAITREADY;
1026				ca->pub->slot_reset(ca->pub, slot);
1027				ca->slot_info[slot].timeout = jiffies + (INIT_TIMEOUT_SECS * HZ);
1028				break;
1029
1030			case DVB_CA_SLOTSTATE_WAITREADY:
1031				if (time_after(jiffies, ca->slot_info[slot].timeout)) {
1032					printk("dvb_ca adaptor %d: PC card did not respond :(\n",
1033					       ca->dvbdev->adapter->num);
1034					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1035					dvb_ca_en50221_thread_update_delay(ca);
1036					break;
1037				}
1038				// no other action needed; will automatically change state when ready
1039				break;
1040
1041			case DVB_CA_SLOTSTATE_VALIDATE:
1042				if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) {
1043					/* we need this extra check for annoying interfaces like the budget-av */
1044					if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
1045					    (ca->pub->poll_slot_status)) {
1046						status = ca->pub->poll_slot_status(ca->pub, slot, 0);
1047						if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) {
1048							ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
1049							dvb_ca_en50221_thread_update_delay(ca);
1050							break;
1051						}
1052					}
1053
1054					printk("dvb_ca adapter %d: Invalid PC card inserted :(\n",
1055					       ca->dvbdev->adapter->num);
1056					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1057					dvb_ca_en50221_thread_update_delay(ca);
1058					break;
1059				}
1060				if (dvb_ca_en50221_set_configoption(ca, slot) != 0) {
1061					printk("dvb_ca adapter %d: Unable to initialise CAM :(\n",
1062					       ca->dvbdev->adapter->num);
1063					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1064					dvb_ca_en50221_thread_update_delay(ca);
1065					break;
1066				}
1067				if (ca->pub->write_cam_control(ca->pub, slot,
1068							       CTRLIF_COMMAND, CMDREG_RS) != 0) {
1069					printk("dvb_ca adapter %d: Unable to reset CAM IF\n",
1070					       ca->dvbdev->adapter->num);
1071					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1072					dvb_ca_en50221_thread_update_delay(ca);
1073					break;
1074				}
1075				dprintk("DVB CAM validated successfully\n");
1076
1077				ca->slot_info[slot].timeout = jiffies + (INIT_TIMEOUT_SECS * HZ);
1078				ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_WAITFR;
1079				ca->wakeup = 1;
1080				break;
1081
1082			case DVB_CA_SLOTSTATE_WAITFR:
1083				if (time_after(jiffies, ca->slot_info[slot].timeout)) {
1084					printk("dvb_ca adapter %d: DVB CAM did not respond :(\n",
1085					       ca->dvbdev->adapter->num);
1086					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1087					dvb_ca_en50221_thread_update_delay(ca);
1088					break;
1089				}
1090
1091				flags = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS);
1092				if (flags & STATUSREG_FR) {
1093					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
1094					ca->wakeup = 1;
1095				}
1096				break;
1097
1098			case DVB_CA_SLOTSTATE_LINKINIT:
1099				if (dvb_ca_en50221_link_init(ca, slot) != 0) {
1100					/* we need this extra check for annoying interfaces like the budget-av */
1101					if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
1102					    (ca->pub->poll_slot_status)) {
1103						status = ca->pub->poll_slot_status(ca->pub, slot, 0);
1104						if (!(status & DVB_CA_EN50221_POLL_CAM_PRESENT)) {
1105							ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
1106							dvb_ca_en50221_thread_update_delay(ca);
1107							break;
1108						}
1109					}
1110
1111					printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num);
1112					ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1113					dvb_ca_en50221_thread_update_delay(ca);
1114					break;
1115				}
1116
1117				if (ca->slot_info[slot].rx_buffer.data == NULL) {
1118					rxbuf = vmalloc(RX_BUFFER_SIZE);
1119					if (rxbuf == NULL) {
1120						printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num);
1121						ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
1122						dvb_ca_en50221_thread_update_delay(ca);
1123						break;
1124					}
1125					dvb_ringbuffer_init(&ca->slot_info[slot].rx_buffer, rxbuf, RX_BUFFER_SIZE);
1126				}
1127
1128				ca->pub->slot_ts_enable(ca->pub, slot);
1129				ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING;
1130				dvb_ca_en50221_thread_update_delay(ca);
1131				printk("dvb_ca adapter %d: DVB CAM detected and initialised successfully\n", ca->dvbdev->adapter->num);
1132				break;
1133
1134			case DVB_CA_SLOTSTATE_RUNNING:
1135				if (!ca->open)
1136					break;
1137
1138				// poll slots for data
1139				pktcount = 0;
1140				while ((status = dvb_ca_en50221_read_data(ca, slot, NULL, 0)) > 0) {
1141					if (!ca->open)
1142						break;
1143
1144					/* if a CAMCHANGE occurred at some point, do not do any more processing of this slot */
1145					if (dvb_ca_en50221_check_camstatus(ca, slot)) {
1146						// we dont want to sleep on the next iteration so we can handle the cam change
1147						ca->wakeup = 1;
1148						break;
1149					}
1150
1151					/* check if we've hit our limit this time */
1152					if (++pktcount >= MAX_RX_PACKETS_PER_ITERATION) {
1153						// dont sleep; there is likely to be more data to read
1154						ca->wakeup = 1;
1155						break;
1156					}
1157				}
1158				break;
1159			}
1160
1161			mutex_unlock(&ca->slot_info[slot].slot_lock);
1162		}
1163	}
1164
1165	return 0;
1166}
1167
1168
1169
1170/* ******************************************************************************** */
1171/* EN50221 IO interface functions */
1172
1173/**
1174 * Real ioctl implementation.
1175 * NOTE: CA_SEND_MSG/CA_GET_MSG ioctls have userspace buffers passed to them.
1176 *
1177 * @param inode Inode concerned.
1178 * @param file File concerned.
1179 * @param cmd IOCTL command.
1180 * @param arg Associated argument.
1181 *
1182 * @return 0 on success, <0 on error.
1183 */
1184static int dvb_ca_en50221_io_do_ioctl(struct inode *inode, struct file *file,
1185				      unsigned int cmd, void *parg)
1186{
1187	struct dvb_device *dvbdev = file->private_data;
1188	struct dvb_ca_private *ca = dvbdev->priv;
1189	int err = 0;
1190	int slot;
1191
1192	dprintk("%s\n", __func__);
1193
1194	switch (cmd) {
1195	case CA_RESET:
1196		for (slot = 0; slot < ca->slot_count; slot++) {
1197			mutex_lock(&ca->slot_info[slot].slot_lock);
1198			if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE) {
1199				dvb_ca_en50221_slot_shutdown(ca, slot);
1200				if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
1201					dvb_ca_en50221_camchange_irq(ca->pub,
1202								     slot,
1203								     DVB_CA_EN50221_CAMCHANGE_INSERTED);
1204			}
1205			mutex_unlock(&ca->slot_info[slot].slot_lock);
1206		}
1207		ca->next_read_slot = 0;
1208		dvb_ca_en50221_thread_wakeup(ca);
1209		break;
1210
1211	case CA_GET_CAP: {
1212		struct ca_caps *caps = parg;
1213
1214		caps->slot_num = ca->slot_count;
1215		caps->slot_type = CA_CI_LINK;
1216		caps->descr_num = 0;
1217		caps->descr_type = 0;
1218		break;
1219	}
1220
1221	case CA_GET_SLOT_INFO: {
1222		struct ca_slot_info *info = parg;
1223
1224		if ((info->num > ca->slot_count) || (info->num < 0))
1225			return -EINVAL;
1226
1227		info->type = CA_CI_LINK;
1228		info->flags = 0;
1229		if ((ca->slot_info[info->num].slot_state != DVB_CA_SLOTSTATE_NONE)
1230			&& (ca->slot_info[info->num].slot_state != DVB_CA_SLOTSTATE_INVALID)) {
1231			info->flags = CA_CI_MODULE_PRESENT;
1232		}
1233		if (ca->slot_info[info->num].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
1234			info->flags |= CA_CI_MODULE_READY;
1235		}
1236		break;
1237	}
1238
1239	default:
1240		err = -EINVAL;
1241		break;
1242	}
1243
1244	return err;
1245}
1246
1247
1248/**
1249 * Wrapper for ioctl implementation.
1250 *
1251 * @param inode Inode concerned.
1252 * @param file File concerned.
1253 * @param cmd IOCTL command.
1254 * @param arg Associated argument.
1255 *
1256 * @return 0 on success, <0 on error.
1257 */
1258static int dvb_ca_en50221_io_ioctl(struct inode *inode, struct file *file,
1259				   unsigned int cmd, unsigned long arg)
1260{
1261	return dvb_usercopy(inode, file, cmd, arg, dvb_ca_en50221_io_do_ioctl);
1262}
1263
1264
1265/**
1266 * Implementation of write() syscall.
1267 *
1268 * @param file File structure.
1269 * @param buf Source buffer.
1270 * @param count Size of source buffer.
1271 * @param ppos Position in file (ignored).
1272 *
1273 * @return Number of bytes read, or <0 on error.
1274 */
1275static ssize_t dvb_ca_en50221_io_write(struct file *file,
1276				       const char __user * buf, size_t count, loff_t * ppos)
1277{
1278	struct dvb_device *dvbdev = file->private_data;
1279	struct dvb_ca_private *ca = dvbdev->priv;
1280	u8 slot, connection_id;
1281	int status;
1282	u8 fragbuf[HOST_LINK_BUF_SIZE];
1283	int fragpos = 0;
1284	int fraglen;
1285	unsigned long timeout;
1286	int written;
1287
1288	dprintk("%s\n", __func__);
1289
1290	/* Incoming packet has a 2 byte header. hdr[0] = slot_id, hdr[1] = connection_id */
1291	if (count < 2)
1292		return -EINVAL;
1293
1294	/* extract slot & connection id */
1295	if (copy_from_user(&slot, buf, 1))
1296		return -EFAULT;
1297	if (copy_from_user(&connection_id, buf + 1, 1))
1298		return -EFAULT;
1299	buf += 2;
1300	count -= 2;
1301
1302	/* check if the slot is actually running */
1303	if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
1304		return -EINVAL;
1305
1306	/* fragment the packets & store in the buffer */
1307	while (fragpos < count) {
1308		fraglen = ca->slot_info[slot].link_buf_size - 2;
1309		if ((count - fragpos) < fraglen)
1310			fraglen = count - fragpos;
1311
1312		fragbuf[0] = connection_id;
1313		fragbuf[1] = ((fragpos + fraglen) < count) ? 0x80 : 0x00;
1314		if ((status = copy_from_user(fragbuf + 2, buf + fragpos, fraglen)) != 0)
1315			goto exit;
1316
1317		timeout = jiffies + HZ / 2;
1318		written = 0;
1319		while (!time_after(jiffies, timeout)) {
1320			/* check the CAM hasn't been removed/reset in the meantime */
1321			if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING) {
1322				status = -EIO;
1323				goto exit;
1324			}
1325
1326			mutex_lock(&ca->slot_info[slot].slot_lock);
1327			status = dvb_ca_en50221_write_data(ca, slot, fragbuf, fraglen + 2);
1328			mutex_unlock(&ca->slot_info[slot].slot_lock);
1329			if (status == (fraglen + 2)) {
1330				written = 1;
1331				break;
1332			}
1333			if (status != -EAGAIN)
1334				goto exit;
1335
1336			msleep(1);
1337		}
1338		if (!written) {
1339			status = -EIO;
1340			goto exit;
1341		}
1342
1343		fragpos += fraglen;
1344	}
1345	status = count + 2;
1346
1347exit:
1348	return status;
1349}
1350
1351
1352/**
1353 * Condition for waking up in dvb_ca_en50221_io_read_condition
1354 */
1355static int dvb_ca_en50221_io_read_condition(struct dvb_ca_private *ca,
1356					    int *result, int *_slot)
1357{
1358	int slot;
1359	int slot_count = 0;
1360	int idx;
1361	size_t fraglen;
1362	int connection_id = -1;
1363	int found = 0;
1364	u8 hdr[2];
1365
1366	slot = ca->next_read_slot;
1367	while ((slot_count < ca->slot_count) && (!found)) {
1368		if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_RUNNING)
1369			goto nextslot;
1370
1371		if (ca->slot_info[slot].rx_buffer.data == NULL) {
1372			return 0;
1373		}
1374
1375		idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, -1, &fraglen);
1376		while (idx != -1) {
1377			dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 0, hdr, 2);
1378			if (connection_id == -1)
1379				connection_id = hdr[0];
1380			if ((hdr[0] == connection_id) && ((hdr[1] & 0x80) == 0)) {
1381				*_slot = slot;
1382				found = 1;
1383				break;
1384			}
1385
1386			idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
1387		}
1388
1389nextslot:
1390		slot = (slot + 1) % ca->slot_count;
1391		slot_count++;
1392	}
1393
1394	ca->next_read_slot = slot;
1395	return found;
1396}
1397
1398
1399/**
1400 * Implementation of read() syscall.
1401 *
1402 * @param file File structure.
1403 * @param buf Destination buffer.
1404 * @param count Size of destination buffer.
1405 * @param ppos Position in file (ignored).
1406 *
1407 * @return Number of bytes read, or <0 on error.
1408 */
1409static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
1410				      size_t count, loff_t * ppos)
1411{
1412	struct dvb_device *dvbdev = file->private_data;
1413	struct dvb_ca_private *ca = dvbdev->priv;
1414	int status;
1415	int result = 0;
1416	u8 hdr[2];
1417	int slot;
1418	int connection_id = -1;
1419	size_t idx, idx2;
1420	int last_fragment = 0;
1421	size_t fraglen;
1422	int pktlen;
1423	int dispose = 0;
1424
1425	dprintk("%s\n", __func__);
1426
1427	/* Outgoing packet has a 2 byte header. hdr[0] = slot_id, hdr[1] = connection_id */
1428	if (count < 2)
1429		return -EINVAL;
1430
1431	/* wait for some data */
1432	if ((status = dvb_ca_en50221_io_read_condition(ca, &result, &slot)) == 0) {
1433
1434		/* if we're in nonblocking mode, exit immediately */
1435		if (file->f_flags & O_NONBLOCK)
1436			return -EWOULDBLOCK;
1437
1438		/* wait for some data */
1439		status = wait_event_interruptible(ca->wait_queue,
1440						  dvb_ca_en50221_io_read_condition
1441						  (ca, &result, &slot));
1442	}
1443	if ((status < 0) || (result < 0)) {
1444		if (result)
1445			return result;
1446		return status;
1447	}
1448
1449	idx = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, -1, &fraglen);
1450	pktlen = 2;
1451	do {
1452		if (idx == -1) {
1453			printk("dvb_ca adapter %d: BUG: read packet ended before last_fragment encountered\n", ca->dvbdev->adapter->num);
1454			status = -EIO;
1455			goto exit;
1456		}
1457
1458		dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 0, hdr, 2);
1459		if (connection_id == -1)
1460			connection_id = hdr[0];
1461		if (hdr[0] == connection_id) {
1462			if (pktlen < count) {
1463				if ((pktlen + fraglen - 2) > count) {
1464					fraglen = count - pktlen;
1465				} else {
1466					fraglen -= 2;
1467				}
1468
1469				if ((status = dvb_ringbuffer_pkt_read_user(&ca->slot_info[slot].rx_buffer, idx, 2,
1470								      buf + pktlen, fraglen)) < 0) {
1471					goto exit;
1472				}
1473				pktlen += fraglen;
1474			}
1475
1476			if ((hdr[1] & 0x80) == 0)
1477				last_fragment = 1;
1478			dispose = 1;
1479		}
1480
1481		idx2 = dvb_ringbuffer_pkt_next(&ca->slot_info[slot].rx_buffer, idx, &fraglen);
1482		if (dispose)
1483			dvb_ringbuffer_pkt_dispose(&ca->slot_info[slot].rx_buffer, idx);
1484		idx = idx2;
1485		dispose = 0;
1486	} while (!last_fragment);
1487
1488	hdr[0] = slot;
1489	hdr[1] = connection_id;
1490	if ((status = copy_to_user(buf, hdr, 2)) != 0)
1491		goto exit;
1492	status = pktlen;
1493
1494exit:
1495	return status;
1496}
1497
1498
1499/**
1500 * Implementation of file open syscall.
1501 *
1502 * @param inode Inode concerned.
1503 * @param file File concerned.
1504 *
1505 * @return 0 on success, <0 on failure.
1506 */
1507static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
1508{
1509	struct dvb_device *dvbdev = file->private_data;
1510	struct dvb_ca_private *ca = dvbdev->priv;
1511	int err;
1512	int i;
1513
1514	dprintk("%s\n", __func__);
1515
1516	if (!try_module_get(ca->pub->owner))
1517		return -EIO;
1518
1519	err = dvb_generic_open(inode, file);
1520	if (err < 0) {
1521		module_put(ca->pub->owner);
1522		return err;
1523	}
1524
1525	for (i = 0; i < ca->slot_count; i++) {
1526
1527		if (ca->slot_info[i].slot_state == DVB_CA_SLOTSTATE_RUNNING) {
1528			if (ca->slot_info[i].rx_buffer.data != NULL) {
1529				/* it is safe to call this here without locks because
1530				 * ca->open == 0. Data is not read in this case */
1531				dvb_ringbuffer_flush(&ca->slot_info[i].rx_buffer);
1532			}
1533		}
1534	}
1535
1536	ca->open = 1;
1537	dvb_ca_en50221_thread_update_delay(ca);
1538	dvb_ca_en50221_thread_wakeup(ca);
1539
1540	return 0;
1541}
1542
1543
1544/**
1545 * Implementation of file close syscall.
1546 *
1547 * @param inode Inode concerned.
1548 * @param file File concerned.
1549 *
1550 * @return 0 on success, <0 on failure.
1551 */
1552static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)
1553{
1554	struct dvb_device *dvbdev = file->private_data;
1555	struct dvb_ca_private *ca = dvbdev->priv;
1556	int err;
1557
1558	dprintk("%s\n", __func__);
1559
1560	/* mark the CA device as closed */
1561	ca->open = 0;
1562	dvb_ca_en50221_thread_update_delay(ca);
1563
1564	err = dvb_generic_release(inode, file);
1565
1566	module_put(ca->pub->owner);
1567
1568	return err;
1569}
1570
1571
1572/**
1573 * Implementation of poll() syscall.
1574 *
1575 * @param file File concerned.
1576 * @param wait poll wait table.
1577 *
1578 * @return Standard poll mask.
1579 */
1580static unsigned int dvb_ca_en50221_io_poll(struct file *file, poll_table * wait)
1581{
1582	struct dvb_device *dvbdev = file->private_data;
1583	struct dvb_ca_private *ca = dvbdev->priv;
1584	unsigned int mask = 0;
1585	int slot;
1586	int result = 0;
1587
1588	dprintk("%s\n", __func__);
1589
1590	if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
1591		mask |= POLLIN;
1592	}
1593
1594	/* if there is something, return now */
1595	if (mask)
1596		return mask;
1597
1598	/* wait for something to happen */
1599	poll_wait(file, &ca->wait_queue, wait);
1600
1601	if (dvb_ca_en50221_io_read_condition(ca, &result, &slot) == 1) {
1602		mask |= POLLIN;
1603	}
1604
1605	return mask;
1606}
1607EXPORT_SYMBOL(dvb_ca_en50221_init);
1608
1609
1610static const struct file_operations dvb_ca_fops = {
1611	.owner = THIS_MODULE,
1612	.read = dvb_ca_en50221_io_read,
1613	.write = dvb_ca_en50221_io_write,
1614	.ioctl = dvb_ca_en50221_io_ioctl,
1615	.open = dvb_ca_en50221_io_open,
1616	.release = dvb_ca_en50221_io_release,
1617	.poll = dvb_ca_en50221_io_poll,
1618};
1619
1620static struct dvb_device dvbdev_ca = {
1621	.priv = NULL,
1622	.users = 1,
1623	.readers = 1,
1624	.writers = 1,
1625	.fops = &dvb_ca_fops,
1626};
1627
1628
1629/* ******************************************************************************** */
1630/* Initialisation/shutdown functions */
1631
1632
1633/**
1634 * Initialise a new DVB CA EN50221 interface device.
1635 *
1636 * @param dvb_adapter DVB adapter to attach the new CA device to.
1637 * @param ca The dvb_ca instance.
1638 * @param flags Flags describing the CA device (DVB_CA_FLAG_*).
1639 * @param slot_count Number of slots supported.
1640 *
1641 * @return 0 on success, nonzero on failure
1642 */
1643int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
1644			struct dvb_ca_en50221 *pubca, int flags, int slot_count)
1645{
1646	int ret;
1647	struct dvb_ca_private *ca = NULL;
1648	int i;
1649
1650	dprintk("%s\n", __func__);
1651
1652	if (slot_count < 1)
1653		return -EINVAL;
1654
1655	/* initialise the system data */
1656	if ((ca = kzalloc(sizeof(struct dvb_ca_private), GFP_KERNEL)) == NULL) {
1657		ret = -ENOMEM;
1658		goto error;
1659	}
1660	ca->pub = pubca;
1661	ca->flags = flags;
1662	ca->slot_count = slot_count;
1663	if ((ca->slot_info = kcalloc(slot_count, sizeof(struct dvb_ca_slot), GFP_KERNEL)) == NULL) {
1664		ret = -ENOMEM;
1665		goto error;
1666	}
1667	init_waitqueue_head(&ca->wait_queue);
1668	ca->open = 0;
1669	ca->wakeup = 0;
1670	ca->next_read_slot = 0;
1671	pubca->private = ca;
1672
1673	/* register the DVB device */
1674	ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca, DVB_DEVICE_CA);
1675	if (ret)
1676		goto error;
1677
1678	/* now initialise each slot */
1679	for (i = 0; i < slot_count; i++) {
1680		memset(&ca->slot_info[i], 0, sizeof(struct dvb_ca_slot));
1681		ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
1682		atomic_set(&ca->slot_info[i].camchange_count, 0);
1683		ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
1684		mutex_init(&ca->slot_info[i].slot_lock);
1685	}
1686
1687	if (signal_pending(current)) {
1688		ret = -EINTR;
1689		goto error;
1690	}
1691	mb();
1692
1693	/* create a kthread for monitoring this CA device */
1694	ca->thread = kthread_run(dvb_ca_en50221_thread, ca, "kdvb-ca-%i:%i",
1695				 ca->dvbdev->adapter->num, ca->dvbdev->id);
1696	if (IS_ERR(ca->thread)) {
1697		ret = PTR_ERR(ca->thread);
1698		printk("dvb_ca_init: failed to start kernel_thread (%d)\n",
1699			ret);
1700		goto error;
1701	}
1702	return 0;
1703
1704error:
1705	if (ca != NULL) {
1706		if (ca->dvbdev != NULL)
1707			dvb_unregister_device(ca->dvbdev);
1708		kfree(ca->slot_info);
1709		kfree(ca);
1710	}
1711	pubca->private = NULL;
1712	return ret;
1713}
1714EXPORT_SYMBOL(dvb_ca_en50221_release);
1715
1716
1717
1718/**
1719 * Release a DVB CA EN50221 interface device.
1720 *
1721 * @param ca_dev The dvb_device_t instance for the CA device.
1722 * @param ca The associated dvb_ca instance.
1723 */
1724void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
1725{
1726	struct dvb_ca_private *ca = pubca->private;
1727	int i;
1728
1729	dprintk("%s\n", __func__);
1730
1731	/* shutdown the thread if there was one */
1732	kthread_stop(ca->thread);
1733
1734	for (i = 0; i < ca->slot_count; i++) {
1735		dvb_ca_en50221_slot_shutdown(ca, i);
1736		vfree(ca->slot_info[i].rx_buffer.data);
1737	}
1738	kfree(ca->slot_info);
1739	dvb_unregister_device(ca->dvbdev);
1740	kfree(ca);
1741	pubca->private = NULL;
1742}