int                     bundle;         /* bundle channels in one frm */
        int                     codec;          /* codec to use for transmis. */
        int                     limit;          /* limit number of bchannels */
+       bool                    shutdown;       /* if card is released */
 
        /* timer */
        struct timer_list       keep_tl;
 
        p = frame;
 
        /* restart timer */
-       if (time_before(hc->keep_tl.expires, jiffies + 5 * HZ))
+       if (time_before(hc->keep_tl.expires, jiffies + 5 * HZ) && !hc->shutdown)
                mod_timer(&hc->keep_tl, jiffies + L1OIP_KEEPALIVE * HZ);
        else
                hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE * HZ;
                goto multiframe;
 
        /* restart timer */
-       if (time_before(hc->timeout_tl.expires, jiffies + 5 * HZ) || !hc->timeout_on) {
+       if ((time_before(hc->timeout_tl.expires, jiffies + 5 * HZ) ||
+            !hc->timeout_on) &&
+           !hc->shutdown) {
                hc->timeout_on = 1;
                mod_timer(&hc->timeout_tl, jiffies + L1OIP_TIMEOUT * HZ);
        } else /* only adjust timer */
 {
        int     ch;
 
-       if (timer_pending(&hc->keep_tl))
-               del_timer(&hc->keep_tl);
+       hc->shutdown = true;
 
-       if (timer_pending(&hc->timeout_tl))
-               del_timer(&hc->timeout_tl);
+       del_timer_sync(&hc->keep_tl);
+       del_timer_sync(&hc->timeout_tl);
 
        cancel_work_sync(&hc->workq);