Lines Matching refs:nu

51 static inline struct sk_buff *nci_uart_dequeue(struct nci_uart *nu)  in nci_uart_dequeue()  argument
53 struct sk_buff *skb = nu->tx_skb; in nci_uart_dequeue()
56 skb = skb_dequeue(&nu->tx_q); in nci_uart_dequeue()
58 nu->tx_skb = NULL; in nci_uart_dequeue()
63 static inline int nci_uart_queue_empty(struct nci_uart *nu) in nci_uart_queue_empty() argument
65 if (nu->tx_skb) in nci_uart_queue_empty()
68 return skb_queue_empty(&nu->tx_q); in nci_uart_queue_empty()
71 static int nci_uart_tx_wakeup(struct nci_uart *nu) in nci_uart_tx_wakeup() argument
73 if (test_and_set_bit(NCI_UART_SENDING, &nu->tx_state)) { in nci_uart_tx_wakeup()
74 set_bit(NCI_UART_TX_WAKEUP, &nu->tx_state); in nci_uart_tx_wakeup()
78 schedule_work(&nu->write_work); in nci_uart_tx_wakeup()
85 struct nci_uart *nu = container_of(work, struct nci_uart, write_work); in nci_uart_write_work() local
86 struct tty_struct *tty = nu->tty; in nci_uart_write_work()
90 clear_bit(NCI_UART_TX_WAKEUP, &nu->tx_state); in nci_uart_write_work()
92 if (nu->ops.tx_start) in nci_uart_write_work()
93 nu->ops.tx_start(nu); in nci_uart_write_work()
95 while ((skb = nci_uart_dequeue(nu))) { in nci_uart_write_work()
102 nu->tx_skb = skb; in nci_uart_write_work()
108 if (test_bit(NCI_UART_TX_WAKEUP, &nu->tx_state)) in nci_uart_write_work()
111 if (nu->ops.tx_done && nci_uart_queue_empty(nu)) in nci_uart_write_work()
112 nu->ops.tx_done(nu); in nci_uart_write_work()
114 clear_bit(NCI_UART_SENDING, &nu->tx_state); in nci_uart_write_work()
119 struct nci_uart *nu = NULL; in nci_uart_set_driver() local
128 nu = kzalloc(sizeof(*nu), GFP_KERNEL); in nci_uart_set_driver()
129 if (!nu) in nci_uart_set_driver()
132 memcpy(nu, nci_uart_drivers[driver], sizeof(struct nci_uart)); in nci_uart_set_driver()
133 nu->tty = tty; in nci_uart_set_driver()
134 tty->disc_data = nu; in nci_uart_set_driver()
135 skb_queue_head_init(&nu->tx_q); in nci_uart_set_driver()
136 INIT_WORK(&nu->write_work, nci_uart_write_work); in nci_uart_set_driver()
137 spin_lock_init(&nu->rx_lock); in nci_uart_set_driver()
139 ret = nu->ops.open(nu); in nci_uart_set_driver()
142 kfree(nu); in nci_uart_set_driver()
143 } else if (!try_module_get(nu->owner)) { in nci_uart_set_driver()
144 nu->ops.close(nu); in nci_uart_set_driver()
146 kfree(nu); in nci_uart_set_driver()
194 struct nci_uart *nu = (void *)tty->disc_data; in nci_uart_tty_close() local
199 if (!nu) in nci_uart_tty_close()
202 if (nu->tx_skb) in nci_uart_tty_close()
203 kfree_skb(nu->tx_skb); in nci_uart_tty_close()
204 if (nu->rx_skb) in nci_uart_tty_close()
205 kfree_skb(nu->rx_skb); in nci_uart_tty_close()
207 skb_queue_purge(&nu->tx_q); in nci_uart_tty_close()
209 nu->ops.close(nu); in nci_uart_tty_close()
210 nu->tty = NULL; in nci_uart_tty_close()
211 module_put(nu->owner); in nci_uart_tty_close()
213 cancel_work_sync(&nu->write_work); in nci_uart_tty_close()
215 kfree(nu); in nci_uart_tty_close()
228 struct nci_uart *nu = (void *)tty->disc_data; in nci_uart_tty_wakeup() local
230 if (!nu) in nci_uart_tty_wakeup()
235 if (tty != nu->tty) in nci_uart_tty_wakeup()
238 nci_uart_tx_wakeup(nu); in nci_uart_tty_wakeup()
256 struct nci_uart *nu = (void *)tty->disc_data; in nci_uart_tty_receive() local
258 if (!nu || tty != nu->tty) in nci_uart_tty_receive()
261 spin_lock(&nu->rx_lock); in nci_uart_tty_receive()
262 nu->ops.recv_buf(nu, (void *)data, flags, count); in nci_uart_tty_receive()
263 spin_unlock(&nu->rx_lock); in nci_uart_tty_receive()
284 struct nci_uart *nu = (void *)tty->disc_data; in nci_uart_tty_ioctl() local
289 if (!nu) in nci_uart_tty_ioctl()
321 static int nci_uart_send(struct nci_uart *nu, struct sk_buff *skb) in nci_uart_send() argument
324 skb_queue_tail(&nu->tx_q, skb); in nci_uart_send()
327 nci_uart_tx_wakeup(nu); in nci_uart_send()
338 static int nci_uart_default_recv_buf(struct nci_uart *nu, const u8 *data, in nci_uart_default_recv_buf() argument
343 if (!nu->ndev) { in nci_uart_default_recv_buf()
344 nfc_err(nu->tty->dev, in nci_uart_default_recv_buf()
354 if (!nu->rx_skb) { in nci_uart_default_recv_buf()
355 nu->rx_packet_len = -1; in nci_uart_default_recv_buf()
356 nu->rx_skb = nci_skb_alloc(nu->ndev, in nci_uart_default_recv_buf()
359 if (!nu->rx_skb) in nci_uart_default_recv_buf()
364 if (nu->rx_skb->len < NCI_CTRL_HDR_SIZE) { in nci_uart_default_recv_buf()
365 *skb_put(nu->rx_skb, 1) = *data++; in nci_uart_default_recv_buf()
371 if (nu->rx_packet_len < 0) in nci_uart_default_recv_buf()
372 nu->rx_packet_len = NCI_CTRL_HDR_SIZE + in nci_uart_default_recv_buf()
373 nci_plen(nu->rx_skb->data); in nci_uart_default_recv_buf()
378 chunk_len = nu->rx_packet_len - nu->rx_skb->len; in nci_uart_default_recv_buf()
381 memcpy(skb_put(nu->rx_skb, chunk_len), data, chunk_len); in nci_uart_default_recv_buf()
386 if (nu->rx_packet_len == nu->rx_skb->len) { in nci_uart_default_recv_buf()
388 if (nu->ops.recv(nu, nu->rx_skb) != 0) in nci_uart_default_recv_buf()
389 nfc_err(nu->tty->dev, "corrupted RX packet\n"); in nci_uart_default_recv_buf()
391 nu->rx_skb = NULL; in nci_uart_default_recv_buf()
399 static int nci_uart_default_recv(struct nci_uart *nu, struct sk_buff *skb) in nci_uart_default_recv() argument
401 return nci_recv_frame(nu->ndev, skb); in nci_uart_default_recv()
404 int nci_uart_register(struct nci_uart *nu) in nci_uart_register() argument
406 if (!nu || !nu->ops.open || in nci_uart_register()
407 !nu->ops.recv || !nu->ops.close) in nci_uart_register()
411 nu->ops.send = nci_uart_send; in nci_uart_register()
414 if (!nu->ops.recv_buf) in nci_uart_register()
415 nu->ops.recv_buf = nci_uart_default_recv_buf; in nci_uart_register()
416 if (!nu->ops.recv) in nci_uart_register()
417 nu->ops.recv = nci_uart_default_recv; in nci_uart_register()
420 if (nci_uart_drivers[nu->driver]) { in nci_uart_register()
421 pr_err("driver %d is already registered\n", nu->driver); in nci_uart_register()
424 nci_uart_drivers[nu->driver] = nu; in nci_uart_register()
426 pr_info("NCI uart driver '%s [%d]' registered\n", nu->name, nu->driver); in nci_uart_register()
432 void nci_uart_unregister(struct nci_uart *nu) in nci_uart_unregister() argument
434 pr_info("NCI uart driver '%s [%d]' unregistered\n", nu->name, in nci_uart_unregister()
435 nu->driver); in nci_uart_unregister()
438 nci_uart_drivers[nu->driver] = NULL; in nci_uart_unregister()
442 void nci_uart_set_config(struct nci_uart *nu, int baudrate, int flow_ctrl) in nci_uart_set_config() argument
446 if (!nu->tty) in nci_uart_set_config()
449 down_read(&nu->tty->termios_rwsem); in nci_uart_set_config()
450 new_termios = nu->tty->termios; in nci_uart_set_config()
451 up_read(&nu->tty->termios_rwsem); in nci_uart_set_config()
459 tty_set_termios(nu->tty, &new_termios); in nci_uart_set_config()