Lines Matching full:dev
74 static int next_chunk_len(struct mctp_serial *dev) in next_chunk_len() argument
79 if (dev->txpos == dev->txlen) in next_chunk_len()
85 if (needs_escape(dev->txbuf[dev->txpos])) in next_chunk_len()
92 for (i = 1; i + dev->txpos + 1 < dev->txlen; i++) { in next_chunk_len()
93 if (needs_escape(dev->txbuf[dev->txpos + i + 1])) in next_chunk_len()
100 static int write_chunk(struct mctp_serial *dev, unsigned char *buf, int len) in write_chunk() argument
102 return dev->tty->ops->write(dev->tty, buf, len); in write_chunk()
107 struct mctp_serial *dev = container_of(work, struct mctp_serial, in mctp_serial_tx_work() local
113 spin_lock_irqsave(&dev->lock, flags); in mctp_serial_tx_work()
116 switch (dev->txstate) { in mctp_serial_tx_work()
118 dev->txpos = 0; in mctp_serial_tx_work()
123 buf[2] = dev->txlen; in mctp_serial_tx_work()
125 if (!dev->txpos) in mctp_serial_tx_work()
126 dev->txfcs = crc_ccitt(0, buf + 1, 2); in mctp_serial_tx_work()
128 txlen = write_chunk(dev, buf + dev->txpos, 3 - dev->txpos); in mctp_serial_tx_work()
130 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
132 dev->txpos += txlen; in mctp_serial_tx_work()
133 if (dev->txpos == 3) { in mctp_serial_tx_work()
134 dev->txstate = STATE_DATA; in mctp_serial_tx_work()
135 dev->txpos = 0; in mctp_serial_tx_work()
141 buf[0] = dev->txbuf[dev->txpos] & ~0x20; in mctp_serial_tx_work()
142 txlen = write_chunk(dev, buf, 1); in mctp_serial_tx_work()
144 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
146 dev->txpos += txlen; in mctp_serial_tx_work()
147 if (dev->txpos == dev->txlen) { in mctp_serial_tx_work()
148 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
149 dev->txpos = 0; in mctp_serial_tx_work()
156 len = next_chunk_len(dev); in mctp_serial_tx_work()
158 c = dev->txbuf[dev->txpos]; in mctp_serial_tx_work()
162 dev->txfcs = crc_ccitt_byte(dev->txfcs, c); in mctp_serial_tx_work()
163 txlen = write_chunk(dev, buf, 2); in mctp_serial_tx_work()
165 dev->txpos++; in mctp_serial_tx_work()
167 dev->txstate = STATE_ESCAPE; in mctp_serial_tx_work()
169 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
171 txlen = write_chunk(dev, in mctp_serial_tx_work()
172 dev->txbuf + dev->txpos, in mctp_serial_tx_work()
175 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
177 dev->txfcs = crc_ccitt(dev->txfcs, in mctp_serial_tx_work()
178 dev->txbuf + in mctp_serial_tx_work()
179 dev->txpos, in mctp_serial_tx_work()
181 dev->txpos += txlen; in mctp_serial_tx_work()
184 if (dev->txstate == STATE_DATA && in mctp_serial_tx_work()
185 dev->txpos == dev->txlen) { in mctp_serial_tx_work()
186 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
187 dev->txpos = 0; in mctp_serial_tx_work()
191 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
192 dev->txpos = 0; in mctp_serial_tx_work()
196 buf[0] = dev->txfcs >> 8; in mctp_serial_tx_work()
197 buf[1] = dev->txfcs & 0xff; in mctp_serial_tx_work()
199 txlen = write_chunk(dev, buf + dev->txpos, 3 - dev->txpos); in mctp_serial_tx_work()
201 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
203 dev->txpos += txlen; in mctp_serial_tx_work()
204 if (dev->txpos == 3) { in mctp_serial_tx_work()
205 dev->txstate = STATE_DONE; in mctp_serial_tx_work()
206 dev->txpos = 0; in mctp_serial_tx_work()
211 netdev_err_once(dev->netdev, "invalid tx state %d\n", in mctp_serial_tx_work()
212 dev->txstate); in mctp_serial_tx_work()
215 if (dev->txstate == STATE_DONE) { in mctp_serial_tx_work()
216 dev->netdev->stats.tx_packets++; in mctp_serial_tx_work()
217 dev->netdev->stats.tx_bytes += dev->txlen; in mctp_serial_tx_work()
218 dev->txlen = 0; in mctp_serial_tx_work()
219 dev->txpos = 0; in mctp_serial_tx_work()
220 clear_bit(TTY_DO_WRITE_WAKEUP, &dev->tty->flags); in mctp_serial_tx_work()
221 dev->txstate = STATE_IDLE; in mctp_serial_tx_work()
222 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx_work()
224 netif_wake_queue(dev->netdev); in mctp_serial_tx_work()
226 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx_work()
232 struct mctp_serial *dev = netdev_priv(ndev); in mctp_serial_tx() local
235 WARN_ON(dev->txstate != STATE_IDLE); in mctp_serial_tx()
238 dev->netdev->stats.tx_dropped++; in mctp_serial_tx()
242 spin_lock_irqsave(&dev->lock, flags); in mctp_serial_tx()
243 netif_stop_queue(dev->netdev); in mctp_serial_tx()
244 skb_copy_bits(skb, 0, dev->txbuf, skb->len); in mctp_serial_tx()
245 dev->txpos = 0; in mctp_serial_tx()
246 dev->txlen = skb->len; in mctp_serial_tx()
247 dev->txstate = STATE_START; in mctp_serial_tx()
248 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx()
250 set_bit(TTY_DO_WRITE_WAKEUP, &dev->tty->flags); in mctp_serial_tx()
251 schedule_work(&dev->tx_work); in mctp_serial_tx()
260 struct mctp_serial *dev = tty->disc_data; in mctp_serial_tty_write_wakeup() local
262 schedule_work(&dev->tx_work); in mctp_serial_tty_write_wakeup()
265 static void mctp_serial_rx(struct mctp_serial *dev) in mctp_serial_rx() argument
270 if (dev->rxfcs != dev->rxfcs_rcvd) { in mctp_serial_rx()
271 dev->netdev->stats.rx_dropped++; in mctp_serial_rx()
272 dev->netdev->stats.rx_crc_errors++; in mctp_serial_rx()
276 skb = netdev_alloc_skb(dev->netdev, dev->rxlen); in mctp_serial_rx()
278 dev->netdev->stats.rx_dropped++; in mctp_serial_rx()
283 skb_put_data(skb, dev->rxbuf, dev->rxlen); in mctp_serial_rx()
290 dev->netdev->stats.rx_packets++; in mctp_serial_rx()
291 dev->netdev->stats.rx_bytes += dev->rxlen; in mctp_serial_rx()
294 static void mctp_serial_push_header(struct mctp_serial *dev, unsigned char c) in mctp_serial_push_header() argument
296 switch (dev->rxpos) { in mctp_serial_push_header()
299 dev->rxpos++; in mctp_serial_push_header()
301 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
305 dev->rxpos++; in mctp_serial_push_header()
306 dev->rxfcs = crc_ccitt_byte(0, c); in mctp_serial_push_header()
308 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
313 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
315 dev->rxlen = c; in mctp_serial_push_header()
316 dev->rxpos = 0; in mctp_serial_push_header()
317 dev->rxstate = STATE_DATA; in mctp_serial_push_header()
318 dev->rxfcs = crc_ccitt_byte(dev->rxfcs, c); in mctp_serial_push_header()
324 static void mctp_serial_push_trailer(struct mctp_serial *dev, unsigned char c) in mctp_serial_push_trailer() argument
326 switch (dev->rxpos) { in mctp_serial_push_trailer()
328 dev->rxfcs_rcvd = c << 8; in mctp_serial_push_trailer()
329 dev->rxpos++; in mctp_serial_push_trailer()
332 dev->rxfcs_rcvd |= c; in mctp_serial_push_trailer()
333 dev->rxpos++; in mctp_serial_push_trailer()
337 dev->rxstate = STATE_ERR; in mctp_serial_push_trailer()
339 mctp_serial_rx(dev); in mctp_serial_push_trailer()
340 dev->rxlen = 0; in mctp_serial_push_trailer()
341 dev->rxpos = 0; in mctp_serial_push_trailer()
342 dev->rxstate = STATE_IDLE; in mctp_serial_push_trailer()
348 static void mctp_serial_push(struct mctp_serial *dev, unsigned char c) in mctp_serial_push() argument
350 switch (dev->rxstate) { in mctp_serial_push()
352 dev->rxstate = STATE_HEADER; in mctp_serial_push()
355 mctp_serial_push_header(dev, c); in mctp_serial_push()
362 if (dev->rxstate != STATE_ESCAPE && c == BYTE_ESC) { in mctp_serial_push()
363 dev->rxstate = STATE_ESCAPE; in mctp_serial_push()
365 dev->rxfcs = crc_ccitt_byte(dev->rxfcs, c); in mctp_serial_push()
366 dev->rxbuf[dev->rxpos] = c; in mctp_serial_push()
367 dev->rxpos++; in mctp_serial_push()
368 dev->rxstate = STATE_DATA; in mctp_serial_push()
369 if (dev->rxpos == dev->rxlen) { in mctp_serial_push()
370 dev->rxpos = 0; in mctp_serial_push()
371 dev->rxstate = STATE_TRAILER; in mctp_serial_push()
377 mctp_serial_push_trailer(dev, c); in mctp_serial_push()
382 dev->rxstate = STATE_IDLE; in mctp_serial_push()
386 netdev_err_once(dev->netdev, "invalid rx state %d\n", in mctp_serial_push()
387 dev->rxstate); in mctp_serial_push()
395 struct mctp_serial *dev = tty->disc_data; in mctp_serial_tty_receive_buf() local
398 if (!netif_running(dev->netdev)) in mctp_serial_tty_receive_buf()
403 mctp_serial_push(dev, c[i]); in mctp_serial_tty_receive_buf()
408 struct mctp_serial *dev = netdev_priv(ndev); in mctp_serial_uninit() local
410 cancel_work_sync(&dev->tx_work); in mctp_serial_uninit()
439 struct mctp_serial *dev; in mctp_serial_open() local
455 ndev = alloc_netdev(sizeof(*dev), name, NET_NAME_ENUM, in mctp_serial_open()
462 dev = netdev_priv(ndev); in mctp_serial_open()
463 dev->idx = idx; in mctp_serial_open()
464 dev->tty = tty; in mctp_serial_open()
465 dev->netdev = ndev; in mctp_serial_open()
466 dev->txstate = STATE_IDLE; in mctp_serial_open()
467 dev->rxstate = STATE_IDLE; in mctp_serial_open()
468 spin_lock_init(&dev->lock); in mctp_serial_open()
469 INIT_WORK(&dev->tx_work, mctp_serial_tx_work); in mctp_serial_open()
476 tty->disc_data = dev; in mctp_serial_open()
490 struct mctp_serial *dev = tty->disc_data; in mctp_serial_close() local
491 int idx = dev->idx; in mctp_serial_close()
493 unregister_netdev(dev->netdev); in mctp_serial_close()