]> git.sesse.net Git - vlc/commitdiff
* modules/access/dvb: Fixed link-level CAM API.
authorChristophe Massiot <massiot@videolan.org>
Wed, 21 Dec 2005 15:50:58 +0000 (15:50 +0000)
committerChristophe Massiot <massiot@videolan.org>
Wed, 21 Dec 2005 15:50:58 +0000 (15:50 +0000)
modules/access/dvb/en50221.c
modules/access/dvb/linux_dvb.c

index 75715eb6565407d3d3c31062a7c01866ffa9dd10..fa4d61b76199a481ffe4cafd4c187db800dec863 100644 (file)
@@ -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;
-        
     }
 }
 
index 64aac74d04d3668bee1fb4ed1512f156474884de..2a1b37668a1081a631a58b7303bff9fac3abadd3 100644 (file)
@@ -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 );
 }