Lines Matching refs:dlci

112 	struct gsm_dlci *dlci;  member
186 void (*data)(struct gsm_dlci *dlci, const u8 *data, int len);
187 void (*prev_data)(struct gsm_dlci *dlci, const u8 *data, int len);
304 struct gsm_dlci *dlci[NUM_DLCI]; member
452 static void gsm_dlci_close(struct gsm_dlci *dlci);
454 static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk);
540 static u8 gsm_encode_modem(const struct gsm_dlci *dlci) in gsm_encode_modem() argument
544 if (dlci->throttled) in gsm_encode_modem()
546 if (dlci->modem_tx & TIOCM_DTR) in gsm_encode_modem()
548 if (dlci->modem_tx & TIOCM_RTS) in gsm_encode_modem()
550 if (dlci->modem_tx & TIOCM_RI) in gsm_encode_modem()
552 if (dlci->modem_tx & TIOCM_CD || dlci->gsm->initiator) in gsm_encode_modem()
555 if (dlci->modem_tx & TIOCM_OUT1) in gsm_encode_modem()
557 if (dlci->modem_tx & TIOCM_OUT2) in gsm_encode_modem()
589 static int gsm_encode_params(const struct gsm_dlci *dlci, in gsm_encode_params() argument
592 const struct gsm_mux *gsm = dlci->gsm; in gsm_encode_params()
595 switch (dlci->ftype) { in gsm_encode_params()
603 pr_debug("unsupported frame type %d\n", dlci->ftype); in gsm_encode_params()
607 switch (dlci->adaption) { in gsm_encode_params()
615 pr_debug("unsupported adaption %d\n", dlci->adaption); in gsm_encode_params()
619 params->d_bits = FIELD_PREP(PN_D_FIELD_DLCI, dlci->addr); in gsm_encode_params()
623 params->p_bits = FIELD_PREP(PN_P_FIELD_PRIO, dlci->prio); in gsm_encode_params()
625 params->n_bits = cpu_to_le16(FIELD_PREP(PN_N_FIELD_N1, dlci->mtu)); in gsm_encode_params()
627 params->k_bits = FIELD_PREP(PN_K_FIELD_K, dlci->k); in gsm_encode_params()
851 static void gsm_dlci_clear_queues(struct gsm_mux *gsm, struct gsm_dlci *dlci) in gsm_dlci_clear_queues() argument
854 int addr = dlci->addr; in gsm_dlci_clear_queues()
858 spin_lock_irqsave(&dlci->lock, flags); in gsm_dlci_clear_queues()
859 kfifo_reset(&dlci->fifo); in gsm_dlci_clear_queues()
860 spin_unlock_irqrestore(&dlci->lock, flags); in gsm_dlci_clear_queues()
1016 struct gsm_dlci *dlci; in gsm_data_kick() local
1051 dlci = gsm->dlci[msg->addr]; in gsm_data_kick()
1053 if (dlci->state != DLCI_OPEN) { in gsm_data_kick()
1091 static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) in __gsm_data_queue() argument
1093 struct gsm_mux *gsm = dlci->gsm; in __gsm_data_queue()
1155 static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) in gsm_data_queue() argument
1158 spin_lock_irqsave(&dlci->gsm->tx_lock, flags); in gsm_data_queue()
1159 __gsm_data_queue(dlci, msg); in gsm_data_queue()
1160 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags); in gsm_data_queue()
1175 static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci) in gsm_dlci_data_output() argument
1182 h = ((dlci->adaption == 1) ? 0 : 1); in gsm_dlci_data_output()
1184 len = kfifo_len(&dlci->fifo); in gsm_dlci_data_output()
1189 if ((len + h) > dlci->mtu) in gsm_dlci_data_output()
1190 len = dlci->mtu - h; in gsm_dlci_data_output()
1194 msg = gsm_data_alloc(gsm, dlci->addr, size, dlci->ftype); in gsm_dlci_data_output()
1198 switch (dlci->adaption) { in gsm_dlci_data_output()
1204 *dp++ = (gsm_encode_modem(dlci) << 1) | EA; in gsm_dlci_data_output()
1208 dlci->adaption); in gsm_dlci_data_output()
1212 WARN_ON(len != kfifo_out_locked(&dlci->fifo, dp, len, in gsm_dlci_data_output()
1213 &dlci->lock)); in gsm_dlci_data_output()
1216 tty_port_tty_wakeup(&dlci->port); in gsm_dlci_data_output()
1218 __gsm_data_queue(dlci, msg); in gsm_dlci_data_output()
1236 struct gsm_dlci *dlci) in gsm_dlci_data_output_framed() argument
1245 if (dlci->adaption == 4) in gsm_dlci_data_output_framed()
1249 if (dlci->skb == NULL) { in gsm_dlci_data_output_framed()
1250 dlci->skb = skb_dequeue_tail(&dlci->skb_list); in gsm_dlci_data_output_framed()
1251 if (dlci->skb == NULL) in gsm_dlci_data_output_framed()
1255 len = dlci->skb->len + overhead; in gsm_dlci_data_output_framed()
1258 if (len > dlci->mtu) { in gsm_dlci_data_output_framed()
1259 if (dlci->adaption == 3) { in gsm_dlci_data_output_framed()
1261 dev_kfree_skb_any(dlci->skb); in gsm_dlci_data_output_framed()
1262 dlci->skb = NULL; in gsm_dlci_data_output_framed()
1265 len = dlci->mtu; in gsm_dlci_data_output_framed()
1270 msg = gsm_data_alloc(gsm, dlci->addr, size, dlci->ftype); in gsm_dlci_data_output_framed()
1272 skb_queue_tail(&dlci->skb_list, dlci->skb); in gsm_dlci_data_output_framed()
1273 dlci->skb = NULL; in gsm_dlci_data_output_framed()
1278 if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */ in gsm_dlci_data_output_framed()
1283 memcpy(dp, dlci->skb->data, len); in gsm_dlci_data_output_framed()
1284 skb_pull(dlci->skb, len); in gsm_dlci_data_output_framed()
1285 __gsm_data_queue(dlci, msg); in gsm_dlci_data_output_framed()
1287 dev_kfree_skb_any(dlci->skb); in gsm_dlci_data_output_framed()
1288 dlci->skb = NULL; in gsm_dlci_data_output_framed()
1305 static int gsm_dlci_modem_output(struct gsm_mux *gsm, struct gsm_dlci *dlci, in gsm_dlci_modem_output() argument
1313 switch (dlci->adaption) { in gsm_dlci_modem_output()
1323 dlci->adaption); in gsm_dlci_modem_output()
1327 msg = gsm_data_alloc(gsm, dlci->addr, size, dlci->ftype); in gsm_dlci_modem_output()
1333 switch (dlci->adaption) { in gsm_dlci_modem_output()
1338 *dp++ = (gsm_encode_modem(dlci) << 1) | EA; in gsm_dlci_modem_output()
1340 *dp++ = gsm_encode_modem(dlci) << 1; in gsm_dlci_modem_output()
1349 __gsm_data_queue(dlci, msg); in gsm_dlci_modem_output()
1371 struct gsm_dlci *dlci; in gsm_dlci_data_sweep() local
1375 dlci = gsm->dlci[i]; in gsm_dlci_data_sweep()
1377 if (!dlci || dlci->constipated) in gsm_dlci_data_sweep()
1380 if (dlci->state != DLCI_OPEN) in gsm_dlci_data_sweep()
1383 if (dlci->adaption < 3 && !dlci->net) in gsm_dlci_data_sweep()
1384 len = gsm_dlci_data_output(gsm, dlci); in gsm_dlci_data_sweep()
1386 len = gsm_dlci_data_output_framed(gsm, dlci); in gsm_dlci_data_sweep()
1414 static void gsm_dlci_data_kick(struct gsm_dlci *dlci) in gsm_dlci_data_kick() argument
1419 if (dlci->constipated) in gsm_dlci_data_kick()
1422 spin_lock_irqsave(&dlci->gsm->tx_lock, flags); in gsm_dlci_data_kick()
1424 sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO); in gsm_dlci_data_kick()
1425 if (dlci->gsm->tx_bytes == 0) { in gsm_dlci_data_kick()
1426 if (dlci->net) in gsm_dlci_data_kick()
1427 gsm_dlci_data_output_framed(dlci->gsm, dlci); in gsm_dlci_data_kick()
1429 gsm_dlci_data_output(dlci->gsm, dlci); in gsm_dlci_data_kick()
1432 gsm_dlci_data_sweep(dlci->gsm); in gsm_dlci_data_kick()
1433 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags); in gsm_dlci_data_kick()
1454 struct gsm_dlci *dlci = gsm->dlci[0]; in gsm_control_command() local
1456 msg = gsm_data_alloc(gsm, 0, dlen + 2, dlci->ftype); in gsm_control_command()
1463 gsm_data_queue(dlci, msg); in gsm_control_command()
1482 struct gsm_dlci *dlci = gsm->dlci[0]; in gsm_control_reply() local
1484 msg = gsm_data_alloc(gsm, 0, dlen + 2, dlci->ftype); in gsm_control_reply()
1490 gsm_data_queue(dlci, msg); in gsm_control_reply()
1504 static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, in gsm_process_modem() argument
1525 if (fc && !dlci->constipated) { in gsm_process_modem()
1527 dlci->constipated = true; in gsm_process_modem()
1528 } else if (!fc && dlci->constipated) { in gsm_process_modem()
1529 dlci->constipated = false; in gsm_process_modem()
1530 gsm_dlci_data_kick(dlci); in gsm_process_modem()
1545 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) in gsm_process_modem()
1550 tty_insert_flip_char(&dlci->port, 0, TTY_BREAK); in gsm_process_modem()
1551 dlci->modem_rx = mlines; in gsm_process_modem()
1552 wake_up_interruptible(&dlci->gsm->event); in gsm_process_modem()
1569 struct gsm_dlci *dlci = gsm->dlci[addr]; in gsm_process_negotiation() local
1604 if (adaption != dlci->adaption) { in gsm_process_negotiation()
1610 if (prio != dlci->prio) { in gsm_process_negotiation()
1616 if (n1 > gsm->mru || n1 > dlci->mtu) { in gsm_process_negotiation()
1626 dlci->mtu = n1; in gsm_process_negotiation()
1627 if (ftype != dlci->ftype) { in gsm_process_negotiation()
1632 if (ftype != UI && ftype != UIH && k > dlci->k) { in gsm_process_negotiation()
1637 dlci->k = k; in gsm_process_negotiation()
1646 dlci->adaption = adaption; in gsm_process_negotiation()
1649 dlci->mtu = gsm->mru; in gsm_process_negotiation()
1652 dlci->mtu = MAX_MTU; in gsm_process_negotiation()
1654 dlci->mtu = n1; in gsm_process_negotiation()
1656 dlci->prio = prio; in gsm_process_negotiation()
1657 dlci->ftype = ftype; in gsm_process_negotiation()
1658 dlci->k = k; in gsm_process_negotiation()
1682 struct gsm_dlci *dlci; in gsm_control_modem() local
1694 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL) in gsm_control_modem()
1696 dlci = gsm->dlci[addr]; in gsm_control_modem()
1710 tty = tty_port_tty_get(&dlci->port); in gsm_control_modem()
1711 gsm_process_modem(tty, dlci, modem, cl); in gsm_control_modem()
1734 struct gsm_dlci *dlci; in gsm_control_negotiation() local
1745 if (addr == 0 || addr >= NUM_DLCI || !gsm->dlci[addr]) { in gsm_control_negotiation()
1749 dlci = gsm->dlci[addr]; in gsm_control_negotiation()
1752 if ((!cr && dlci->state == DLCI_OPENING) || dlci->state == DLCI_OPEN) { in gsm_control_negotiation()
1763 gsm_dlci_close(dlci); in gsm_control_negotiation()
1769 if (gsm_encode_params(dlci, &pn_reply) == 0) in gsm_control_negotiation()
1774 } else if (dlci->state == DLCI_CONFIGURE) { in gsm_control_negotiation()
1776 dlci->state = DLCI_OPENING; in gsm_control_negotiation()
1777 gsm_command(gsm, dlci->addr, SABM|PF); in gsm_control_negotiation()
1778 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_control_negotiation()
1816 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL) in gsm_control_rls()
1823 port = &gsm->dlci[addr]->port; in gsm_control_rls()
1837 static void gsm_dlci_begin_close(struct gsm_dlci *dlci);
1858 struct gsm_dlci *dlci = gsm->dlci[0]; in gsm_control_message() local
1860 if (dlci) { in gsm_control_message()
1861 dlci->dead = true; in gsm_control_message()
1863 gsm_dlci_begin_close(dlci); in gsm_control_message()
1930 struct gsm_dlci *dlci; in gsm_control_response() local
1936 dlci = gsm->dlci[0]; in gsm_control_response()
1954 if (dlci && !dlci->dead) in gsm_control_response()
1980 if (gsm->dlci[0]) in gsm_control_keep_alive()
1981 gsm_dlci_begin_close(gsm->dlci[0]); in gsm_control_keep_alive()
1983 } else if (gsm->keep_alive && gsm->dlci[0] && !gsm->dlci[0]->dead) { in gsm_control_keep_alive()
2034 if (gsm->cretries == 0 || !gsm->dlci[0] || gsm->dlci[0]->dead) { in gsm_control_retransmit()
2082 if (gsm->dlci[0]->mode == DLCI_MODE_ADM) in gsm_control_send()
2129 static void gsm_dlci_close(struct gsm_dlci *dlci) in gsm_dlci_close() argument
2131 del_timer(&dlci->t1); in gsm_dlci_close()
2133 pr_debug("DLCI %d goes closed.\n", dlci->addr); in gsm_dlci_close()
2134 dlci->state = DLCI_CLOSED; in gsm_dlci_close()
2136 dlci->constipated = true; in gsm_dlci_close()
2137 if (dlci->addr != 0) { in gsm_dlci_close()
2138 tty_port_tty_hangup(&dlci->port, false); in gsm_dlci_close()
2139 gsm_dlci_clear_queues(dlci->gsm, dlci); in gsm_dlci_close()
2141 tty_port_set_initialized(&dlci->port, false); in gsm_dlci_close()
2142 wake_up_interruptible(&dlci->port.open_wait); in gsm_dlci_close()
2144 del_timer(&dlci->gsm->ka_timer); in gsm_dlci_close()
2145 dlci->gsm->dead = true; in gsm_dlci_close()
2149 gsm_dlci_data_kick(dlci); in gsm_dlci_close()
2150 wake_up_all(&dlci->gsm->event); in gsm_dlci_close()
2160 static void gsm_dlci_open(struct gsm_dlci *dlci) in gsm_dlci_open() argument
2162 struct gsm_mux *gsm = dlci->gsm; in gsm_dlci_open()
2166 del_timer(&dlci->t1); in gsm_dlci_open()
2168 dlci->state = DLCI_OPEN; in gsm_dlci_open()
2169 dlci->constipated = false; in gsm_dlci_open()
2171 pr_debug("DLCI %d goes open.\n", dlci->addr); in gsm_dlci_open()
2173 if (dlci->addr) { in gsm_dlci_open()
2174 gsm_modem_update(dlci, 0); in gsm_dlci_open()
2182 gsm_dlci_data_kick(dlci); in gsm_dlci_open()
2183 wake_up(&dlci->gsm->event); in gsm_dlci_open()
2193 static int gsm_dlci_negotiate(struct gsm_dlci *dlci) in gsm_dlci_negotiate() argument
2195 struct gsm_mux *gsm = dlci->gsm; in gsm_dlci_negotiate()
2199 ret = gsm_encode_params(dlci, &params); in gsm_dlci_negotiate()
2229 struct gsm_dlci *dlci = from_timer(dlci, t, t1); in gsm_dlci_t1() local
2230 struct gsm_mux *gsm = dlci->gsm; in gsm_dlci_t1()
2232 switch (dlci->state) { in gsm_dlci_t1()
2234 if (dlci->retries && gsm_dlci_negotiate(dlci) == 0) { in gsm_dlci_t1()
2235 dlci->retries--; in gsm_dlci_t1()
2236 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_dlci_t1()
2239 gsm_dlci_begin_close(dlci); /* prevent half open link */ in gsm_dlci_t1()
2243 if (dlci->retries) { in gsm_dlci_t1()
2244 dlci->retries--; in gsm_dlci_t1()
2245 gsm_command(dlci->gsm, dlci->addr, SABM|PF); in gsm_dlci_t1()
2246 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_dlci_t1()
2247 } else if (!dlci->addr && gsm->control == (DM | PF)) { in gsm_dlci_t1()
2250 dlci->addr); in gsm_dlci_t1()
2251 dlci->mode = DLCI_MODE_ADM; in gsm_dlci_t1()
2252 gsm_dlci_open(dlci); in gsm_dlci_t1()
2255 gsm_dlci_begin_close(dlci); /* prevent half open link */ in gsm_dlci_t1()
2260 if (dlci->retries) { in gsm_dlci_t1()
2261 dlci->retries--; in gsm_dlci_t1()
2262 gsm_command(dlci->gsm, dlci->addr, DISC|PF); in gsm_dlci_t1()
2263 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_dlci_t1()
2265 gsm_dlci_close(dlci); in gsm_dlci_t1()
2268 pr_debug("%s: unhandled state: %d\n", __func__, dlci->state); in gsm_dlci_t1()
2284 static void gsm_dlci_begin_open(struct gsm_dlci *dlci) in gsm_dlci_begin_open() argument
2286 struct gsm_mux *gsm = dlci ? dlci->gsm : NULL; in gsm_dlci_begin_open()
2292 if (dlci->addr != 0) { in gsm_dlci_begin_open()
2293 if (gsm->adaption != 1 || gsm->adaption != dlci->adaption) in gsm_dlci_begin_open()
2295 if (dlci->prio != (roundup(dlci->addr + 1, 8) - 1)) in gsm_dlci_begin_open()
2297 if (gsm->ftype != dlci->ftype) in gsm_dlci_begin_open()
2301 switch (dlci->state) { in gsm_dlci_begin_open()
2305 dlci->retries = gsm->n2; in gsm_dlci_begin_open()
2307 dlci->state = DLCI_OPENING; in gsm_dlci_begin_open()
2308 gsm_command(gsm, dlci->addr, SABM|PF); in gsm_dlci_begin_open()
2311 dlci->state = DLCI_CONFIGURE; in gsm_dlci_begin_open()
2312 if (gsm_dlci_negotiate(dlci) != 0) { in gsm_dlci_begin_open()
2313 gsm_dlci_close(dlci); in gsm_dlci_begin_open()
2317 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_dlci_begin_open()
2331 static void gsm_dlci_set_opening(struct gsm_dlci *dlci) in gsm_dlci_set_opening() argument
2333 switch (dlci->state) { in gsm_dlci_set_opening()
2337 dlci->state = DLCI_OPENING; in gsm_dlci_set_opening()
2350 static void gsm_dlci_set_wait_config(struct gsm_dlci *dlci) in gsm_dlci_set_wait_config() argument
2352 switch (dlci->state) { in gsm_dlci_set_wait_config()
2355 dlci->state = DLCI_WAITING_CONFIG; in gsm_dlci_set_wait_config()
2373 static void gsm_dlci_begin_close(struct gsm_dlci *dlci) in gsm_dlci_begin_close() argument
2375 struct gsm_mux *gsm = dlci->gsm; in gsm_dlci_begin_close()
2376 if (dlci->state == DLCI_CLOSED || dlci->state == DLCI_CLOSING) in gsm_dlci_begin_close()
2378 dlci->retries = gsm->n2; in gsm_dlci_begin_close()
2379 dlci->state = DLCI_CLOSING; in gsm_dlci_begin_close()
2380 gsm_command(dlci->gsm, dlci->addr, DISC|PF); in gsm_dlci_begin_close()
2381 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); in gsm_dlci_begin_close()
2396 static void gsm_dlci_data(struct gsm_dlci *dlci, const u8 *data, int clen) in gsm_dlci_data() argument
2399 struct tty_port *port = &dlci->port; in gsm_dlci_data()
2406 switch (dlci->adaption) { in gsm_dlci_data()
2418 gsm_process_modem(tty, dlci, modem, len); in gsm_dlci_data()
2445 static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len) in gsm_dlci_command() argument
2464 dlci->gsm->malformed++; in gsm_dlci_command()
2469 gsm_control_message(dlci->gsm, command, data, clen); in gsm_dlci_command()
2471 gsm_control_response(dlci->gsm, command, data, clen); in gsm_dlci_command()
2503 static void gsm_dlci_copy_config_values(struct gsm_dlci *dlci, struct gsm_dlci_config *dc) in gsm_dlci_copy_config_values() argument
2506 dc->channel = (u32)dlci->addr; in gsm_dlci_copy_config_values()
2507 dc->adaption = (u32)dlci->adaption; in gsm_dlci_copy_config_values()
2508 dc->mtu = (u32)dlci->mtu; in gsm_dlci_copy_config_values()
2509 dc->priority = (u32)dlci->prio; in gsm_dlci_copy_config_values()
2510 if (dlci->ftype == UIH) in gsm_dlci_copy_config_values()
2514 dc->k = (u32)dlci->k; in gsm_dlci_copy_config_values()
2523 static int gsm_dlci_config(struct gsm_dlci *dlci, struct gsm_dlci_config *dc, int open) in gsm_dlci_config() argument
2538 if (!dlci) in gsm_dlci_config()
2540 gsm = dlci->gsm; in gsm_dlci_config()
2560 if (dc->adaption != dlci->adaption) in gsm_dlci_config()
2562 if (dc->mtu != dlci->mtu) in gsm_dlci_config()
2564 if (dc->i != dlci->ftype) in gsm_dlci_config()
2567 if (dc->priority != dlci->prio) in gsm_dlci_config()
2574 if (dlci->state == DLCI_WAITING_CONFIG) { in gsm_dlci_config()
2584 gsm_dlci_begin_close(dlci); in gsm_dlci_config()
2585 wait_event_interruptible(gsm->event, dlci->state == DLCI_CLOSED); in gsm_dlci_config()
2592 dlci->adaption = (int)dc->adaption; in gsm_dlci_config()
2595 dlci->mtu = (unsigned int)dc->mtu; in gsm_dlci_config()
2597 dlci->mtu = gsm->mtu; in gsm_dlci_config()
2600 dlci->prio = (u8)dc->priority; in gsm_dlci_config()
2602 dlci->prio = roundup(dlci->addr + 1, 8) - 1; in gsm_dlci_config()
2605 dlci->ftype = UIH; in gsm_dlci_config()
2607 dlci->ftype = UI; in gsm_dlci_config()
2610 dlci->k = (u8)dc->k; in gsm_dlci_config()
2612 dlci->k = gsm->k; in gsm_dlci_config()
2616 gsm_dlci_begin_open(dlci); in gsm_dlci_config()
2618 gsm_dlci_set_opening(dlci); in gsm_dlci_config()
2640 struct gsm_dlci *dlci = kzalloc(sizeof(struct gsm_dlci), GFP_ATOMIC); in gsm_dlci_alloc() local
2641 if (dlci == NULL) in gsm_dlci_alloc()
2643 spin_lock_init(&dlci->lock); in gsm_dlci_alloc()
2644 mutex_init(&dlci->mutex); in gsm_dlci_alloc()
2645 if (kfifo_alloc(&dlci->fifo, TX_SIZE, GFP_KERNEL) < 0) { in gsm_dlci_alloc()
2646 kfree(dlci); in gsm_dlci_alloc()
2650 skb_queue_head_init(&dlci->skb_list); in gsm_dlci_alloc()
2651 timer_setup(&dlci->t1, gsm_dlci_t1, 0); in gsm_dlci_alloc()
2652 tty_port_init(&dlci->port); in gsm_dlci_alloc()
2653 dlci->port.ops = &gsm_port_ops; in gsm_dlci_alloc()
2654 dlci->gsm = gsm; in gsm_dlci_alloc()
2655 dlci->addr = addr; in gsm_dlci_alloc()
2656 dlci->adaption = gsm->adaption; in gsm_dlci_alloc()
2657 dlci->mtu = gsm->mtu; in gsm_dlci_alloc()
2659 dlci->prio = 0; in gsm_dlci_alloc()
2661 dlci->prio = roundup(addr + 1, 8) - 1; in gsm_dlci_alloc()
2662 dlci->ftype = gsm->ftype; in gsm_dlci_alloc()
2663 dlci->k = gsm->k; in gsm_dlci_alloc()
2664 dlci->state = DLCI_CLOSED; in gsm_dlci_alloc()
2666 dlci->data = gsm_dlci_data; in gsm_dlci_alloc()
2668 dlci->constipated = true; in gsm_dlci_alloc()
2670 dlci->data = gsm_dlci_command; in gsm_dlci_alloc()
2672 gsm->dlci[addr] = dlci; in gsm_dlci_alloc()
2673 return dlci; in gsm_dlci_alloc()
2686 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); in gsm_dlci_free() local
2688 timer_shutdown_sync(&dlci->t1); in gsm_dlci_free()
2689 dlci->gsm->dlci[dlci->addr] = NULL; in gsm_dlci_free()
2690 kfifo_free(&dlci->fifo); in gsm_dlci_free()
2691 while ((dlci->skb = skb_dequeue(&dlci->skb_list))) in gsm_dlci_free()
2692 dev_kfree_skb(dlci->skb); in gsm_dlci_free()
2693 kfree(dlci); in gsm_dlci_free()
2696 static inline void dlci_get(struct gsm_dlci *dlci) in dlci_get() argument
2698 tty_port_get(&dlci->port); in dlci_get()
2701 static inline void dlci_put(struct gsm_dlci *dlci) in dlci_put() argument
2703 tty_port_put(&dlci->port); in dlci_put()
2706 static void gsm_destroy_network(struct gsm_dlci *dlci);
2717 static void gsm_dlci_release(struct gsm_dlci *dlci) in gsm_dlci_release() argument
2719 struct tty_struct *tty = tty_port_tty_get(&dlci->port); in gsm_dlci_release()
2721 mutex_lock(&dlci->mutex); in gsm_dlci_release()
2722 gsm_destroy_network(dlci); in gsm_dlci_release()
2723 mutex_unlock(&dlci->mutex); in gsm_dlci_release()
2732 tty_port_tty_set(&dlci->port, NULL); in gsm_dlci_release()
2735 dlci->state = DLCI_CLOSED; in gsm_dlci_release()
2736 dlci_put(dlci); in gsm_dlci_release()
2755 struct gsm_dlci *dlci; in gsm_queue() local
2774 dlci = gsm->dlci[address]; in gsm_queue()
2782 if (dlci == NULL) in gsm_queue()
2783 dlci = gsm_dlci_alloc(gsm, address); in gsm_queue()
2784 if (dlci == NULL) { in gsm_queue()
2788 if (dlci->dead) in gsm_queue()
2792 gsm_dlci_open(dlci); in gsm_queue()
2798 if (dlci == NULL || dlci->state == DLCI_CLOSED) { in gsm_queue()
2804 gsm_dlci_close(dlci); in gsm_queue()
2807 if (cr == 0 || dlci == NULL) in gsm_queue()
2809 switch (dlci->state) { in gsm_queue()
2811 gsm_dlci_close(dlci); in gsm_queue()
2814 gsm_dlci_open(dlci); in gsm_queue()
2818 dlci->state); in gsm_queue()
2826 if (dlci == NULL) in gsm_queue()
2828 gsm_dlci_close(dlci); in gsm_queue()
2834 if (dlci == NULL || dlci->state != DLCI_OPEN) { in gsm_queue()
2838 dlci->data(dlci, gsm->buf, gsm->len); in gsm_queue()
3071 struct gsm_dlci *dlci; in gsm_cleanup_mux() local
3077 dlci = gsm->dlci[0]; in gsm_cleanup_mux()
3078 if (dlci) { in gsm_cleanup_mux()
3079 if (disc && dlci->state != DLCI_CLOSED) { in gsm_cleanup_mux()
3080 gsm_dlci_begin_close(dlci); in gsm_cleanup_mux()
3081 wait_event(gsm->event, dlci->state == DLCI_CLOSED); in gsm_cleanup_mux()
3083 dlci->dead = true; in gsm_cleanup_mux()
3100 if (gsm->dlci[i]) in gsm_cleanup_mux()
3101 gsm_dlci_release(gsm->dlci[i]); in gsm_cleanup_mux()
3124 struct gsm_dlci *dlci; in gsm_activate_mux() local
3127 dlci = gsm_dlci_alloc(gsm, 0); in gsm_activate_mux()
3128 if (dlci == NULL) in gsm_activate_mux()
3385 gsm_dlci_begin_open(gsm->dlci[0]); in gsm_config()
3436 gsm_dlci_begin_open(gsm->dlci[0]); in gsm_config_ext()
3470 if (!gsm || !gsm->dlci[0] || gsm->dlci[0]->dead) in gsmld_write_trigger()
3500 if (gsm->dlci[i]) in gsmld_write_task()
3501 tty_port_tty_wakeup(&gsm->dlci[i]->port); in gsmld_write_task()
3773 struct gsm_dlci *dlci; in gsmld_ioctl() local
3803 dlci = gsm->dlci[addr]; in gsmld_ioctl()
3804 if (!dlci) { in gsmld_ioctl()
3805 dlci = gsm_dlci_alloc(gsm, addr); in gsmld_ioctl()
3806 if (!dlci) in gsmld_ioctl()
3809 gsm_dlci_copy_config_values(dlci, &dc); in gsmld_ioctl()
3819 dlci = gsm->dlci[addr]; in gsmld_ioctl()
3820 if (!dlci) { in gsmld_ioctl()
3821 dlci = gsm_dlci_alloc(gsm, addr); in gsmld_ioctl()
3822 if (!dlci) in gsmld_ioctl()
3825 return gsm_dlci_config(dlci, &dc, 0); in gsmld_ioctl()
3849 static void dlci_net_free(struct gsm_dlci *dlci) in dlci_net_free() argument
3851 if (!dlci->net) { in dlci_net_free()
3855 dlci->adaption = dlci->prev_adaption; in dlci_net_free()
3856 dlci->data = dlci->prev_data; in dlci_net_free()
3857 free_netdev(dlci->net); in dlci_net_free()
3858 dlci->net = NULL; in dlci_net_free()
3863 struct gsm_dlci *dlci; in net_free() local
3866 dlci = mux_net->dlci; in net_free()
3868 if (dlci->net) { in net_free()
3869 unregister_netdev(dlci->net); in net_free()
3870 dlci_net_free(dlci); in net_free()
3888 struct gsm_dlci *dlci = mux_net->dlci; in gsm_mux_net_start_xmit() local
3891 skb_queue_head(&dlci->skb_list, skb); in gsm_mux_net_start_xmit()
3894 gsm_dlci_data_kick(dlci); in gsm_mux_net_start_xmit()
3911 static void gsm_mux_rx_netchar(struct gsm_dlci *dlci, in gsm_mux_rx_netchar() argument
3914 struct net_device *net = dlci->net; in gsm_mux_rx_netchar()
3963 static void gsm_destroy_network(struct gsm_dlci *dlci) in gsm_destroy_network() argument
3968 if (!dlci->net) in gsm_destroy_network()
3970 mux_net = netdev_priv(dlci->net); in gsm_destroy_network()
3976 static int gsm_create_network(struct gsm_dlci *dlci, struct gsm_netconfig *nc) in gsm_create_network() argument
3987 if (dlci->adaption > 2) in gsm_create_network()
4007 net->mtu = dlci->mtu; in gsm_create_network()
4009 net->max_mtu = dlci->mtu; in gsm_create_network()
4011 mux_net->dlci = dlci; in gsm_create_network()
4016 dlci->prev_adaption = dlci->adaption; in gsm_create_network()
4017 dlci->prev_data = dlci->data; in gsm_create_network()
4018 dlci->adaption = nc->adaption; in gsm_create_network()
4019 dlci->data = gsm_mux_rx_netchar; in gsm_create_network()
4020 dlci->net = net; in gsm_create_network()
4026 dlci_net_free(dlci); in gsm_create_network()
4061 static void gsm_modem_upd_via_data(struct gsm_dlci *dlci, u8 brk) in gsm_modem_upd_via_data() argument
4063 struct gsm_mux *gsm = dlci->gsm; in gsm_modem_upd_via_data()
4066 if (dlci->state != DLCI_OPEN || dlci->adaption != 2) in gsm_modem_upd_via_data()
4070 gsm_dlci_modem_output(gsm, dlci, brk); in gsm_modem_upd_via_data()
4080 static int gsm_modem_upd_via_msc(struct gsm_dlci *dlci, u8 brk) in gsm_modem_upd_via_msc() argument
4086 if (dlci->gsm->encoding != GSM_BASIC_OPT) in gsm_modem_upd_via_msc()
4089 modembits[0] = (dlci->addr << 2) | 2 | EA; /* DLCI, Valid, EA */ in gsm_modem_upd_via_msc()
4091 modembits[1] = (gsm_encode_modem(dlci) << 1) | EA; in gsm_modem_upd_via_msc()
4093 modembits[1] = gsm_encode_modem(dlci) << 1; in gsm_modem_upd_via_msc()
4097 ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len); in gsm_modem_upd_via_msc()
4100 return gsm_control_wait(dlci->gsm, ctrl); in gsm_modem_upd_via_msc()
4109 static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk) in gsm_modem_update() argument
4111 if (dlci->adaption == 2) { in gsm_modem_update()
4113 gsm_modem_upd_via_data(dlci, brk); in gsm_modem_update()
4115 } else if (dlci->gsm->encoding == GSM_BASIC_OPT) { in gsm_modem_update()
4117 return gsm_modem_upd_via_msc(dlci, brk); in gsm_modem_update()
4135 static int gsm_wait_modem_change(struct gsm_dlci *dlci, u32 mask) in gsm_wait_modem_change() argument
4137 struct gsm_mux *gsm = dlci->gsm; in gsm_wait_modem_change()
4138 u32 old = dlci->modem_rx; in gsm_wait_modem_change()
4142 dlci->state != DLCI_OPEN || in gsm_wait_modem_change()
4143 (old ^ dlci->modem_rx) & mask); in gsm_wait_modem_change()
4146 if (dlci->state != DLCI_OPEN) in gsm_wait_modem_change()
4153 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); in gsm_carrier_raised() local
4154 struct gsm_mux *gsm = dlci->gsm; in gsm_carrier_raised()
4157 if (dlci->state != DLCI_OPEN) in gsm_carrier_raised()
4167 gsm->dlci[0]->mode == DLCI_MODE_ADM && !dlci->modem_rx) in gsm_carrier_raised()
4170 return dlci->modem_rx & TIOCM_CD; in gsm_carrier_raised()
4175 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); in gsm_dtr_rts() local
4176 unsigned int modem_tx = dlci->modem_tx; in gsm_dtr_rts()
4181 if (modem_tx != dlci->modem_tx) { in gsm_dtr_rts()
4182 dlci->modem_tx = modem_tx; in gsm_dtr_rts()
4183 gsm_modem_update(dlci, 0); in gsm_dtr_rts()
4196 struct gsm_dlci *dlci; in gsmtty_install() local
4219 if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) { in gsmtty_install()
4223 dlci = gsm->dlci[line]; in gsmtty_install()
4224 if (dlci == NULL) { in gsmtty_install()
4226 dlci = gsm_dlci_alloc(gsm, line); in gsmtty_install()
4228 if (dlci == NULL) { in gsmtty_install()
4232 ret = tty_port_install(&dlci->port, driver, tty); in gsmtty_install()
4235 dlci_put(dlci); in gsmtty_install()
4240 dlci_get(dlci); in gsmtty_install()
4241 dlci_get(gsm->dlci[0]); in gsmtty_install()
4243 tty->driver_data = dlci; in gsmtty_install()
4251 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_open() local
4252 struct tty_port *port = &dlci->port; in gsmtty_open()
4257 dlci->modem_rx = 0; in gsmtty_open()
4262 if (!dlci->gsm->wait_config) { in gsmtty_open()
4264 if (dlci->gsm->initiator) in gsmtty_open()
4265 gsm_dlci_begin_open(dlci); in gsmtty_open()
4267 gsm_dlci_set_opening(dlci); in gsmtty_open()
4269 gsm_dlci_set_wait_config(dlci); in gsmtty_open()
4277 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_close() local
4279 if (dlci == NULL) in gsmtty_close()
4281 if (dlci->state == DLCI_CLOSED) in gsmtty_close()
4283 mutex_lock(&dlci->mutex); in gsmtty_close()
4284 gsm_destroy_network(dlci); in gsmtty_close()
4285 mutex_unlock(&dlci->mutex); in gsmtty_close()
4286 if (tty_port_close_start(&dlci->port, tty, filp) == 0) in gsmtty_close()
4288 gsm_dlci_begin_close(dlci); in gsmtty_close()
4289 if (tty_port_initialized(&dlci->port) && C_HUPCL(tty)) in gsmtty_close()
4290 tty_port_lower_dtr_rts(&dlci->port); in gsmtty_close()
4291 tty_port_close_end(&dlci->port, tty); in gsmtty_close()
4292 tty_port_tty_set(&dlci->port, NULL); in gsmtty_close()
4298 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_hangup() local
4299 if (dlci->state == DLCI_CLOSED) in gsmtty_hangup()
4301 tty_port_hangup(&dlci->port); in gsmtty_hangup()
4302 gsm_dlci_begin_close(dlci); in gsmtty_hangup()
4308 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_write() local
4309 if (dlci->state == DLCI_CLOSED) in gsmtty_write()
4312 sent = kfifo_in_locked(&dlci->fifo, buf, len, &dlci->lock); in gsmtty_write()
4314 gsm_dlci_data_kick(dlci); in gsmtty_write()
4320 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_write_room() local
4321 if (dlci->state == DLCI_CLOSED) in gsmtty_write_room()
4323 return kfifo_avail(&dlci->fifo); in gsmtty_write_room()
4328 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_chars_in_buffer() local
4329 if (dlci->state == DLCI_CLOSED) in gsmtty_chars_in_buffer()
4331 return kfifo_len(&dlci->fifo); in gsmtty_chars_in_buffer()
4336 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_flush_buffer() local
4339 if (dlci->state == DLCI_CLOSED) in gsmtty_flush_buffer()
4345 spin_lock_irqsave(&dlci->lock, flags); in gsmtty_flush_buffer()
4346 kfifo_reset(&dlci->fifo); in gsmtty_flush_buffer()
4347 spin_unlock_irqrestore(&dlci->lock, flags); in gsmtty_flush_buffer()
4360 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_tiocmget() local
4361 if (dlci->state == DLCI_CLOSED) in gsmtty_tiocmget()
4363 return dlci->modem_rx; in gsmtty_tiocmget()
4369 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_tiocmset() local
4370 unsigned int modem_tx = dlci->modem_tx; in gsmtty_tiocmset()
4372 if (dlci->state == DLCI_CLOSED) in gsmtty_tiocmset()
4377 if (modem_tx != dlci->modem_tx) { in gsmtty_tiocmset()
4378 dlci->modem_tx = modem_tx; in gsmtty_tiocmset()
4379 return gsm_modem_update(dlci, 0); in gsmtty_tiocmset()
4388 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_ioctl() local
4393 if (dlci->state == DLCI_CLOSED) in gsmtty_ioctl()
4401 mutex_lock(&dlci->mutex); in gsmtty_ioctl()
4402 index = gsm_create_network(dlci, &nc); in gsmtty_ioctl()
4403 mutex_unlock(&dlci->mutex); in gsmtty_ioctl()
4410 mutex_lock(&dlci->mutex); in gsmtty_ioctl()
4411 gsm_destroy_network(dlci); in gsmtty_ioctl()
4412 mutex_unlock(&dlci->mutex); in gsmtty_ioctl()
4417 if (dc.channel != dlci->addr) in gsmtty_ioctl()
4419 gsm_dlci_copy_config_values(dlci, &dc); in gsmtty_ioctl()
4428 if (dc.channel != 0 && dc.channel != dlci->addr) in gsmtty_ioctl()
4430 return gsm_dlci_config(dlci, &dc, 1); in gsmtty_ioctl()
4432 return gsm_wait_modem_change(dlci, (u32)arg); in gsmtty_ioctl()
4441 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_set_termios() local
4442 if (dlci->state == DLCI_CLOSED) in gsmtty_set_termios()
4454 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_throttle() local
4455 if (dlci->state == DLCI_CLOSED) in gsmtty_throttle()
4458 dlci->modem_tx &= ~TIOCM_RTS; in gsmtty_throttle()
4459 dlci->throttled = true; in gsmtty_throttle()
4461 gsm_modem_update(dlci, 0); in gsmtty_throttle()
4466 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_unthrottle() local
4467 if (dlci->state == DLCI_CLOSED) in gsmtty_unthrottle()
4470 dlci->modem_tx |= TIOCM_RTS; in gsmtty_unthrottle()
4471 dlci->throttled = false; in gsmtty_unthrottle()
4473 gsm_modem_update(dlci, 0); in gsmtty_unthrottle()
4478 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_break_ctl() local
4480 if (dlci->state == DLCI_CLOSED) in gsmtty_break_ctl()
4491 return gsm_modem_update(dlci, encode); in gsmtty_break_ctl()
4496 struct gsm_dlci *dlci = tty->driver_data; in gsmtty_cleanup() local
4497 struct gsm_mux *gsm = dlci->gsm; in gsmtty_cleanup()
4499 dlci_put(dlci); in gsmtty_cleanup()
4500 dlci_put(gsm->dlci[0]); in gsmtty_cleanup()