From ad3c73f596d27fb1191d8d0178064de3077601d6 Mon Sep 17 00:00:00 2001 From: Christophe Massiot Date: Wed, 21 Dec 2005 15:50:58 +0000 Subject: [PATCH] * modules/access/dvb: Fixed link-level CAM API. --- modules/access/dvb/en50221.c | 46 ++++++++++++++++++++++++++++------ modules/access/dvb/linux_dvb.c | 40 ++++------------------------- 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/modules/access/dvb/en50221.c b/modules/access/dvb/en50221.c index 75715eb656..fa4d61b761 100644 --- a/modules/access/dvb/en50221.c +++ b/modules/access/dvb/en50221.c @@ -1132,7 +1132,7 @@ static void CAPMTDelete( access_t * p_access, int i_session_id, uint8_t *p_capmt; int i_capmt_size; - p_access->p_sys->i_selected_programs++; + p_access->p_sys->i_selected_programs--; msg_Dbg( p_access, "deleting CAPMT for SID %d on session %d", p_pmt->i_program_number, i_session_id ); @@ -1554,13 +1554,45 @@ int E_(en50221_Init)( access_t * p_access ) { access_sys_t *p_sys = p_access->p_sys; - - if( p_sys->i_ca_type != CA_CI ) /* Link level init is done in Poll() */ + if( p_sys->i_ca_type & CA_CI_LINK ) { + int i_slot; + for ( i_slot = 0; i_slot < p_sys->i_nb_slots; i_slot++ ) + { + if ( ioctl( p_sys->i_ca_handle, CA_RESET, 1 << i_slot) != 0 ) + { + msg_Err( p_access, "en50221_Init: couldn't reset slot %d", + i_slot ); + } + } + + p_sys->i_ca_timeout = 100000; + /* Wait a bit otherwise it doesn't initialize properly... */ + msleep( 1000000 ); + return VLC_SUCCESS; } else { + struct ca_slot_info info; + + /* We don't reset the CAM in that case because it's done by the + * ASIC. */ + if ( ioctl( p_sys->i_ca_handle, CA_GET_SLOT_INFO, &info ) < 0 ) + { + msg_Err( p_access, "en50221_Init: couldn't get slot info" ); + close( p_sys->i_ca_handle ); + p_sys->i_ca_handle = 0; + return VLC_EGENERIC; + } + if( info.flags == 0 ) + { + msg_Err( p_access, "en50221_Init: no CAM inserted" ); + close( p_sys->i_ca_handle ); + p_sys->i_ca_handle = 0; + return VLC_EGENERIC; + } + /* Allocate a dummy sessions */ p_sys->p_sessions[ 0 ].i_resource_id = RI_CONDITIONAL_ACCESS_SUPPORT; @@ -1575,9 +1607,10 @@ int E_(en50221_Init)( access_t * p_access ) APDUSend( p_access, 1, AOT_APPLICATION_INFO_ENQ, NULL, 0 ); if ( ioctl( p_sys->i_ca_handle, CA_GET_MSG, &ca_msg ) < 0 ) { - msg_Err( p_access, "CAM: failed getting message" ); + msg_Err( p_access, "en50221_Init: failed getting message" ); return VLC_EGENERIC; } + #if HLCI_WAIT_CAM_READY while( ca_msg.msg[8] == 0xff && ca_msg.msg[9] == 0xff ) { @@ -1592,10 +1625,10 @@ int E_(en50221_Init)( access_t * p_access ) memset( &ca_msg.msg[3], 0, 253 ); if ( ioctl( p_sys->i_ca_handle, CA_GET_MSG, &ca_msg ) < 0 ) { - msg_Err( p_access, "CAM: failed getting message" ); + msg_Err( p_access, "en50221_Init: failed getting message" ); return VLC_EGENERIC; } - msg_Dbg( p_access, "CAM: Got length: %d, tag: 0x%x", ca_msg.length, APDUGetTag( ca_msg.msg, ca_msg.length ) ); + msg_Dbg( p_access, "en50221_Init: Got length: %d, tag: 0x%x", ca_msg.length, APDUGetTag( ca_msg.msg, ca_msg.length ) ); } #else if( ca_msg.msg[8] == 0xff && ca_msg.msg[9] == 0xff ) @@ -1607,7 +1640,6 @@ int E_(en50221_Init)( access_t * p_access ) msg_Dbg( p_access, "found CAM %s using id 0x%x", &ca_msg.msg[12], (ca_msg.msg[8]<<8)|ca_msg.msg[9] ); return VLC_SUCCESS; - } } diff --git a/modules/access/dvb/linux_dvb.c b/modules/access/dvb/linux_dvb.c index 64aac74d04..2a1b37668a 100644 --- a/modules/access/dvb/linux_dvb.c +++ b/modules/access/dvb/linux_dvb.c @@ -74,8 +74,6 @@ struct frontend_t #define FRONTEND_LOCK_TIMEOUT 10000000 /* 10 s */ -#define RESET_CAM_SLOTS 1 /* Do we want to reset cam upon opening */ - /* Local prototypes */ static int FrontendInfo( access_t * ); static int FrontendSetQPSK( access_t * ); @@ -1210,9 +1208,8 @@ int E_(CAMOpen)( access_t *p_access ) { access_sys_t *p_sys = p_access->p_sys; char ca[128]; - int i_adapter, i_device, i_slot; + int i_adapter, i_device; ca_caps_t caps; - struct ca_slot_info info; i_adapter = var_GetInteger( p_access, "dvb-adapter" ); i_device = var_GetInteger( p_access, "dvb-device" ); @@ -1273,44 +1270,17 @@ int E_(CAMOpen)( access_t *p_access ) } p_sys->i_ca_type = caps.slot_type; - if( caps.slot_type != CA_CI_LINK && - caps.slot_type != CA_CI ) - { - msg_Err( p_access, "CAMInit: incompatible CAM module" ); - close( p_sys->i_ca_handle ); - p_sys->i_ca_handle = 0; - return VLC_EGENERIC; - } - if( ioctl( p_sys->i_ca_handle, CA_GET_SLOT_INFO, &info ) < 0 ) - { - msg_Err( p_access, "CAMInit: Couldn't get slot info" ); - close( p_sys->i_ca_handle ); - p_sys->i_ca_handle = 0; - return VLC_EGENERIC; - } - if( info.flags == 0 ) + if ( !(caps.slot_type & CA_CI_LINK) && + !(caps.slot_type & CA_CI) ) { - msg_Err( p_access, "CAMInit: No CAM inserted" ); + msg_Err( p_access, "CAMInit: incompatible CAM interface" ); close( p_sys->i_ca_handle ); p_sys->i_ca_handle = 0; return VLC_EGENERIC; } - + p_sys->i_nb_slots = caps.slot_num; memset( p_sys->pb_active_slot, 0, sizeof(vlc_bool_t) * MAX_CI_SLOTS ); -#if(RESET_CAM_SLOTS) - for ( i_slot = 0; i_slot < p_sys->i_nb_slots; i_slot++ ) - { - if ( ioctl( p_sys->i_ca_handle, CA_RESET, 1 << i_slot) != 0 ) - { - msg_Err( p_access, "CAMInit: couldn't reset slot %d", i_slot ); - } - } -#endif - - p_sys->i_ca_timeout = 100000; - /* Wait a bit otherwise it doesn't initialize properly... */ - msleep( 1000000 ); return E_(en50221_Init)( p_access ); } -- 2.39.2