|
@@ -121,6 +121,9 @@ struct gsm_dlci {
|
|
|
struct mutex mutex;
|
|
|
|
|
|
/* Link layer */
|
|
|
+ int mode;
|
|
|
+#define DLCI_MODE_ABM 0 /* Normal Asynchronous Balanced Mode */
|
|
|
+#define DLCI_MODE_ADM 1 /* Asynchronous Disconnected Mode */
|
|
|
spinlock_t lock; /* Protects the internal state */
|
|
|
struct timer_list t1; /* Retransmit timer for SABM and UA */
|
|
|
int retries;
|
|
@@ -1364,7 +1367,13 @@ retry:
|
|
|
ctrl->data = data;
|
|
|
ctrl->len = clen;
|
|
|
gsm->pending_cmd = ctrl;
|
|
|
- gsm->cretries = gsm->n2;
|
|
|
+
|
|
|
+ /* If DLCI0 is in ADM mode skip retries, it won't respond */
|
|
|
+ if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
|
|
|
+ gsm->cretries = 1;
|
|
|
+ else
|
|
|
+ gsm->cretries = gsm->n2;
|
|
|
+
|
|
|
mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
|
|
|
gsm_control_transmit(gsm, ctrl);
|
|
|
spin_unlock_irqrestore(&gsm->control_lock, flags);
|
|
@@ -1472,6 +1481,7 @@ static void gsm_dlci_t1(struct timer_list *t)
|
|
|
if (debug & 8)
|
|
|
pr_info("DLCI %d opening in ADM mode.\n",
|
|
|
dlci->addr);
|
|
|
+ dlci->mode = DLCI_MODE_ADM;
|
|
|
gsm_dlci_open(dlci);
|
|
|
} else {
|
|
|
gsm_dlci_close(dlci);
|