Commit 5d023252 authored by Jasmin Jessich's avatar Jasmin Jessich Committed by Mauro Carvalho Chehab

media: dvb_ca_en50221: New function dvb_ca_en50221_poll_cam_gone

The CAM poll code for the budget-av is exactly the same on several
places. Extracting the code to a new function improves maintainability.
Signed-off-by: default avatarJasmin Jessich <jasmin@anw.at>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent a004b70e
...@@ -1063,6 +1063,37 @@ static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca) ...@@ -1063,6 +1063,37 @@ static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca)
ca->delay = curdelay; ca->delay = curdelay;
} }
/**
* Poll if the CAM is gone.
*
* @ca: CA instance.
* @slot: Slot to process.
* @return: 0 .. no change
* 1 .. CAM state changed
*/
static int dvb_ca_en50221_poll_cam_gone(struct dvb_ca_private *ca, int slot)
{
int changed = 0;
int status;
/*
* we need this extra check for annoying interfaces like the
* budget-av
*/
if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) &&
(ca->pub->poll_slot_status)) {
status = ca->pub->poll_slot_status(ca->pub, slot, 0);
if (!(status &
DVB_CA_EN50221_POLL_CAM_PRESENT)) {
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_NONE;
dvb_ca_en50221_thread_update_delay(ca);
changed = 1;
}
}
return changed;
}
/** /**
* Thread state machine for one CA slot to perform the data transfer. * Thread state machine for one CA slot to perform the data transfer.
* *
...@@ -1074,7 +1105,6 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca, ...@@ -1074,7 +1105,6 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca,
{ {
struct dvb_ca_slot *sl = &ca->slot_info[slot]; struct dvb_ca_slot *sl = &ca->slot_info[slot];
int flags; int flags;
int status;
int pktcount; int pktcount;
void *rxbuf; void *rxbuf;
...@@ -1124,21 +1154,8 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca, ...@@ -1124,21 +1154,8 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca,
case DVB_CA_SLOTSTATE_VALIDATE: case DVB_CA_SLOTSTATE_VALIDATE:
if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) { if (dvb_ca_en50221_parse_attributes(ca, slot) != 0) {
/* if (dvb_ca_en50221_poll_cam_gone(ca, slot))
* we need this extra check for annoying interfaces like
* the budget-av
*/
if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
&& (ca->pub->poll_slot_status)) {
status = ca->pub->poll_slot_status(ca->pub,
slot, 0);
if (!(status &
DVB_CA_EN50221_POLL_CAM_PRESENT)) {
sl->slot_state = DVB_CA_SLOTSTATE_NONE;
dvb_ca_en50221_thread_update_delay(ca);
break; break;
}
}
pr_err("dvb_ca adapter %d: Invalid PC card inserted :(\n", pr_err("dvb_ca adapter %d: Invalid PC card inserted :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
...@@ -1187,21 +1204,8 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca, ...@@ -1187,21 +1204,8 @@ static void dvb_ca_en50221_thread_state_machine(struct dvb_ca_private *ca,
case DVB_CA_SLOTSTATE_LINKINIT: case DVB_CA_SLOTSTATE_LINKINIT:
if (dvb_ca_en50221_link_init(ca, slot) != 0) { if (dvb_ca_en50221_link_init(ca, slot) != 0) {
/* if (dvb_ca_en50221_poll_cam_gone(ca, slot))
* we need this extra check for annoying interfaces like
* the budget-av
*/
if ((!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE))
&& (ca->pub->poll_slot_status)) {
status = ca->pub->poll_slot_status(ca->pub,
slot, 0);
if (!(status &
DVB_CA_EN50221_POLL_CAM_PRESENT)) {
sl->slot_state = DVB_CA_SLOTSTATE_NONE;
dvb_ca_en50221_thread_update_delay(ca);
break; break;
}
}
pr_err("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", pr_err("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment