Lines Matching refs:nu

39 static inline struct sk_buff *nci_uart_dequeue(struct nci_uart *nu)
41 struct sk_buff *skb = nu->tx_skb;
44 skb = skb_dequeue(&nu->tx_q);
46 nu->tx_skb = NULL;
51 static inline int nci_uart_queue_empty(struct nci_uart *nu)
53 if (nu->tx_skb)
56 return skb_queue_empty(&nu->tx_q);
59 static int nci_uart_tx_wakeup(struct nci_uart *nu)
61 if (test_and_set_bit(NCI_UART_SENDING, &nu->tx_state)) {
62 set_bit(NCI_UART_TX_WAKEUP, &nu->tx_state);
66 schedule_work(&nu->write_work);
73 struct nci_uart *nu = container_of(work, struct nci_uart, write_work);
74 struct tty_struct *tty = nu->tty;
78 clear_bit(NCI_UART_TX_WAKEUP, &nu->tx_state);
80 if (nu->ops.tx_start)
81 nu->ops.tx_start(nu);
83 while ((skb = nci_uart_dequeue(nu))) {
90 nu->tx_skb = skb;
96 if (test_bit(NCI_UART_TX_WAKEUP, &nu->tx_state))
99 if (nu->ops.tx_done && nci_uart_queue_empty(nu))
100 nu->ops.tx_done(nu);
102 clear_bit(NCI_UART_SENDING, &nu->tx_state);
107 struct nci_uart *nu = NULL;
116 nu = kzalloc(sizeof(*nu), GFP_KERNEL);
117 if (!nu)
120 memcpy(nu, nci_uart_drivers[driver], sizeof(struct nci_uart));
121 nu->tty = tty;
122 tty->disc_data = nu;
123 skb_queue_head_init(&nu->tx_q);
124 INIT_WORK(&nu->write_work, nci_uart_write_work);
125 spin_lock_init(&nu->rx_lock);
127 ret = nu->ops.open(nu);
130 kfree(nu);
131 } else if (!try_module_get(nu->owner)) {
132 nu->ops.close(nu);
134 kfree(nu);
175 struct nci_uart *nu = tty->disc_data;
180 if (!nu)
183 kfree_skb(nu->tx_skb);
184 kfree_skb(nu->rx_skb);
186 skb_queue_purge(&nu->tx_q);
188 nu->ops.close(nu);
189 nu->tty = NULL;
190 module_put(nu->owner);
192 cancel_work_sync(&nu->write_work);
194 kfree(nu);
207 struct nci_uart *nu = tty->disc_data;
209 if (!nu)
214 if (tty != nu->tty)
217 nci_uart_tx_wakeup(nu);
226 static int nci_uart_default_recv_buf(struct nci_uart *nu, const u8 *data,
231 if (!nu->ndev) {
232 nfc_err(nu->tty->dev,
242 if (!nu->rx_skb) {
243 nu->rx_packet_len = -1;
244 nu->rx_skb = nci_skb_alloc(nu->ndev,
247 if (!nu->rx_skb)
252 if (nu->rx_skb->len < NCI_CTRL_HDR_SIZE) {
253 skb_put_u8(nu->rx_skb, *data++);
259 if (nu->rx_packet_len < 0)
260 nu->rx_packet_len = NCI_CTRL_HDR_SIZE +
261 nci_plen(nu->rx_skb->data);
266 chunk_len = nu->rx_packet_len - nu->rx_skb->len;
269 skb_put_data(nu->rx_skb, data, chunk_len);
274 if (nu->rx_packet_len == nu->rx_skb->len) {
276 if (nu->ops.recv(nu, nu->rx_skb) != 0)
277 nfc_err(nu->tty->dev, "corrupted RX packet\n");
279 nu->rx_skb = NULL;
301 struct nci_uart *nu = tty->disc_data;
303 if (!nu || tty != nu->tty)
306 spin_lock(&nu->rx_lock);
307 nci_uart_default_recv_buf(nu, data, count);
308 spin_unlock(&nu->rx_lock);
328 struct nci_uart *nu = tty->disc_data;
333 if (!nu)
360 static int nci_uart_send(struct nci_uart *nu, struct sk_buff *skb)
363 skb_queue_tail(&nu->tx_q, skb);
366 nci_uart_tx_wakeup(nu);
371 int nci_uart_register(struct nci_uart *nu)
373 if (!nu || !nu->ops.open ||
374 !nu->ops.recv || !nu->ops.close)
378 nu->ops.send = nci_uart_send;
381 if (nci_uart_drivers[nu->driver]) {
382 pr_err("driver %d is already registered\n", nu->driver);
385 nci_uart_drivers[nu->driver] = nu;
387 pr_info("NCI uart driver '%s [%d]' registered\n", nu->name, nu->driver);
393 void nci_uart_unregister(struct nci_uart *nu)
395 pr_info("NCI uart driver '%s [%d]' unregistered\n", nu->name,
396 nu->driver);
399 nci_uart_drivers[nu->driver] = NULL;
403 void nci_uart_set_config(struct nci_uart *nu, int baudrate, int flow_ctrl)
407 if (!nu->tty)
410 down_read(&nu->tty->termios_rwsem);
411 new_termios = nu->tty->termios;
412 up_read(&nu->tty->termios_rwsem);
420 tty_set_termios(nu->tty, &new_termios);