|
@@ -1451,6 +1451,10 @@ static void gsm_dlci_open(struct gsm_dlci *dlci)
|
|
|
* in which case an opening port goes back to closed and a closing port
|
|
|
* is simply put into closed state (any further frames from the other
|
|
|
* end will get a DM response)
|
|
|
+ *
|
|
|
+ * Some control dlci can stay in ADM mode with other dlci working just
|
|
|
+ * fine. In that case we can just keep the control dlci open after the
|
|
|
+ * DLCI_OPENING retries time out.
|
|
|
*/
|
|
|
|
|
|
static void gsm_dlci_t1(struct timer_list *t)
|
|
@@ -1464,8 +1468,15 @@ static void gsm_dlci_t1(struct timer_list *t)
|
|
|
if (dlci->retries) {
|
|
|
gsm_command(dlci->gsm, dlci->addr, SABM|PF);
|
|
|
mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
|
|
|
- } else
|
|
|
+ } else if (!dlci->addr && gsm->control == (DM | PF)) {
|
|
|
+ if (debug & 8)
|
|
|
+ pr_info("DLCI %d opening in ADM mode.\n",
|
|
|
+ dlci->addr);
|
|
|
+ gsm_dlci_open(dlci);
|
|
|
+ } else {
|
|
|
gsm_dlci_close(dlci);
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
case DLCI_CLOSING:
|
|
|
dlci->retries--;
|
|
@@ -1483,8 +1494,8 @@ static void gsm_dlci_t1(struct timer_list *t)
|
|
|
* @dlci: DLCI to open
|
|
|
*
|
|
|
* Commence opening a DLCI from the Linux side. We issue SABM messages
|
|
|
- * to the modem which should then reply with a UA, at which point we
|
|
|
- * will move into open state. Opening is done asynchronously with retry
|
|
|
+ * to the modem which should then reply with a UA or ADM, at which point
|
|
|
+ * we will move into open state. Opening is done asynchronously with retry
|
|
|
* running off timers and the responses.
|
|
|
*/
|
|
|
|