Lines Matching refs:dev

76 static int next_chunk_len(struct mctp_serial *dev)  in next_chunk_len()  argument
81 if (dev->txpos == dev->txlen) in next_chunk_len()
87 if (needs_escape(dev->txbuf[dev->txpos])) in next_chunk_len()
94 for (i = 1; i + dev->txpos < dev->txlen; i++) { in next_chunk_len()
95 if (needs_escape(dev->txbuf[dev->txpos + i])) in next_chunk_len()
102 static int write_chunk(struct mctp_serial *dev, unsigned char *buf, int len) in write_chunk() argument
104 return dev->tty->ops->write(dev->tty, buf, len); in write_chunk()
109 struct mctp_serial *dev = container_of(work, struct mctp_serial, in mctp_serial_tx_work() local
115 spin_lock_irqsave(&dev->lock, flags); in mctp_serial_tx_work()
118 switch (dev->txstate) { in mctp_serial_tx_work()
120 dev->txpos = 0; in mctp_serial_tx_work()
125 buf[2] = dev->txlen; in mctp_serial_tx_work()
127 if (!dev->txpos) in mctp_serial_tx_work()
128 dev->txfcs = crc_ccitt(FCS_INIT, buf + 1, 2); in mctp_serial_tx_work()
130 txlen = write_chunk(dev, buf + dev->txpos, 3 - dev->txpos); in mctp_serial_tx_work()
132 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
134 dev->txpos += txlen; in mctp_serial_tx_work()
135 if (dev->txpos == 3) { in mctp_serial_tx_work()
136 dev->txstate = STATE_DATA; in mctp_serial_tx_work()
137 dev->txpos = 0; in mctp_serial_tx_work()
143 buf[0] = dev->txbuf[dev->txpos] & ~0x20; in mctp_serial_tx_work()
144 txlen = write_chunk(dev, buf, 1); in mctp_serial_tx_work()
146 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
148 dev->txpos += txlen; in mctp_serial_tx_work()
149 if (dev->txpos == dev->txlen) { in mctp_serial_tx_work()
150 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
151 dev->txpos = 0; in mctp_serial_tx_work()
158 len = next_chunk_len(dev); in mctp_serial_tx_work()
160 c = dev->txbuf[dev->txpos]; in mctp_serial_tx_work()
164 dev->txfcs = crc_ccitt_byte(dev->txfcs, c); in mctp_serial_tx_work()
165 txlen = write_chunk(dev, buf, 2); in mctp_serial_tx_work()
167 dev->txpos++; in mctp_serial_tx_work()
169 dev->txstate = STATE_ESCAPE; in mctp_serial_tx_work()
171 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
173 txlen = write_chunk(dev, in mctp_serial_tx_work()
174 dev->txbuf + dev->txpos, in mctp_serial_tx_work()
177 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
179 dev->txfcs = crc_ccitt(dev->txfcs, in mctp_serial_tx_work()
180 dev->txbuf + in mctp_serial_tx_work()
181 dev->txpos, in mctp_serial_tx_work()
183 dev->txpos += txlen; in mctp_serial_tx_work()
186 if (dev->txstate == STATE_DATA && in mctp_serial_tx_work()
187 dev->txpos == dev->txlen) { in mctp_serial_tx_work()
188 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
189 dev->txpos = 0; in mctp_serial_tx_work()
193 dev->txstate = STATE_TRAILER; in mctp_serial_tx_work()
194 dev->txpos = 0; in mctp_serial_tx_work()
198 buf[0] = dev->txfcs >> 8; in mctp_serial_tx_work()
199 buf[1] = dev->txfcs & 0xff; in mctp_serial_tx_work()
201 txlen = write_chunk(dev, buf + dev->txpos, 3 - dev->txpos); in mctp_serial_tx_work()
203 dev->txstate = STATE_ERR; in mctp_serial_tx_work()
205 dev->txpos += txlen; in mctp_serial_tx_work()
206 if (dev->txpos == 3) { in mctp_serial_tx_work()
207 dev->txstate = STATE_DONE; in mctp_serial_tx_work()
208 dev->txpos = 0; in mctp_serial_tx_work()
213 netdev_err_once(dev->netdev, "invalid tx state %d\n", in mctp_serial_tx_work()
214 dev->txstate); in mctp_serial_tx_work()
217 if (dev->txstate == STATE_DONE) { in mctp_serial_tx_work()
218 dev->netdev->stats.tx_packets++; in mctp_serial_tx_work()
219 dev->netdev->stats.tx_bytes += dev->txlen; in mctp_serial_tx_work()
220 dev->txlen = 0; in mctp_serial_tx_work()
221 dev->txpos = 0; in mctp_serial_tx_work()
222 clear_bit(TTY_DO_WRITE_WAKEUP, &dev->tty->flags); in mctp_serial_tx_work()
223 dev->txstate = STATE_IDLE; in mctp_serial_tx_work()
224 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx_work()
226 netif_wake_queue(dev->netdev); in mctp_serial_tx_work()
228 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx_work()
234 struct mctp_serial *dev = netdev_priv(ndev); in mctp_serial_tx() local
237 WARN_ON(dev->txstate != STATE_IDLE); in mctp_serial_tx()
240 dev->netdev->stats.tx_dropped++; in mctp_serial_tx()
244 spin_lock_irqsave(&dev->lock, flags); in mctp_serial_tx()
245 netif_stop_queue(dev->netdev); in mctp_serial_tx()
246 skb_copy_bits(skb, 0, dev->txbuf, skb->len); in mctp_serial_tx()
247 dev->txpos = 0; in mctp_serial_tx()
248 dev->txlen = skb->len; in mctp_serial_tx()
249 dev->txstate = STATE_START; in mctp_serial_tx()
250 spin_unlock_irqrestore(&dev->lock, flags); in mctp_serial_tx()
252 set_bit(TTY_DO_WRITE_WAKEUP, &dev->tty->flags); in mctp_serial_tx()
253 schedule_work(&dev->tx_work); in mctp_serial_tx()
262 struct mctp_serial *dev = tty->disc_data; in mctp_serial_tty_write_wakeup() local
264 schedule_work(&dev->tx_work); in mctp_serial_tty_write_wakeup()
267 static void mctp_serial_rx(struct mctp_serial *dev) in mctp_serial_rx() argument
272 if (dev->rxfcs != dev->rxfcs_rcvd) { in mctp_serial_rx()
273 dev->netdev->stats.rx_dropped++; in mctp_serial_rx()
274 dev->netdev->stats.rx_crc_errors++; in mctp_serial_rx()
278 skb = netdev_alloc_skb(dev->netdev, dev->rxlen); in mctp_serial_rx()
280 dev->netdev->stats.rx_dropped++; in mctp_serial_rx()
285 skb_put_data(skb, dev->rxbuf, dev->rxlen); in mctp_serial_rx()
292 dev->netdev->stats.rx_packets++; in mctp_serial_rx()
293 dev->netdev->stats.rx_bytes += dev->rxlen; in mctp_serial_rx()
296 static void mctp_serial_push_header(struct mctp_serial *dev, unsigned char c) in mctp_serial_push_header() argument
298 switch (dev->rxpos) { in mctp_serial_push_header()
301 dev->rxpos++; in mctp_serial_push_header()
303 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
307 dev->rxpos++; in mctp_serial_push_header()
308 dev->rxfcs = crc_ccitt_byte(FCS_INIT, c); in mctp_serial_push_header()
310 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
315 dev->rxstate = STATE_ERR; in mctp_serial_push_header()
317 dev->rxlen = c; in mctp_serial_push_header()
318 dev->rxpos = 0; in mctp_serial_push_header()
319 dev->rxstate = STATE_DATA; in mctp_serial_push_header()
320 dev->rxfcs = crc_ccitt_byte(dev->rxfcs, c); in mctp_serial_push_header()
326 static void mctp_serial_push_trailer(struct mctp_serial *dev, unsigned char c) in mctp_serial_push_trailer() argument
328 switch (dev->rxpos) { in mctp_serial_push_trailer()
330 dev->rxfcs_rcvd = c << 8; in mctp_serial_push_trailer()
331 dev->rxpos++; in mctp_serial_push_trailer()
334 dev->rxfcs_rcvd |= c; in mctp_serial_push_trailer()
335 dev->rxpos++; in mctp_serial_push_trailer()
339 dev->rxstate = STATE_ERR; in mctp_serial_push_trailer()
341 mctp_serial_rx(dev); in mctp_serial_push_trailer()
342 dev->rxlen = 0; in mctp_serial_push_trailer()
343 dev->rxpos = 0; in mctp_serial_push_trailer()
344 dev->rxstate = STATE_IDLE; in mctp_serial_push_trailer()
350 static void mctp_serial_push(struct mctp_serial *dev, unsigned char c) in mctp_serial_push() argument
352 switch (dev->rxstate) { in mctp_serial_push()
354 dev->rxstate = STATE_HEADER; in mctp_serial_push()
357 mctp_serial_push_header(dev, c); in mctp_serial_push()
364 if (dev->rxstate != STATE_ESCAPE && c == BYTE_ESC) { in mctp_serial_push()
365 dev->rxstate = STATE_ESCAPE; in mctp_serial_push()
367 dev->rxfcs = crc_ccitt_byte(dev->rxfcs, c); in mctp_serial_push()
368 dev->rxbuf[dev->rxpos] = c; in mctp_serial_push()
369 dev->rxpos++; in mctp_serial_push()
370 dev->rxstate = STATE_DATA; in mctp_serial_push()
371 if (dev->rxpos == dev->rxlen) { in mctp_serial_push()
372 dev->rxpos = 0; in mctp_serial_push()
373 dev->rxstate = STATE_TRAILER; in mctp_serial_push()
379 mctp_serial_push_trailer(dev, c); in mctp_serial_push()
384 dev->rxstate = STATE_IDLE; in mctp_serial_push()
388 netdev_err_once(dev->netdev, "invalid rx state %d\n", in mctp_serial_push()
389 dev->rxstate); in mctp_serial_push()
396 struct mctp_serial *dev = tty->disc_data; in mctp_serial_tty_receive_buf() local
399 if (!netif_running(dev->netdev)) in mctp_serial_tty_receive_buf()
404 mctp_serial_push(dev, c[i]); in mctp_serial_tty_receive_buf()
409 struct mctp_serial *dev = netdev_priv(ndev); in mctp_serial_uninit() local
411 cancel_work_sync(&dev->tx_work); in mctp_serial_uninit()
440 struct mctp_serial *dev; in mctp_serial_open() local
456 ndev = alloc_netdev(sizeof(*dev), name, NET_NAME_ENUM, in mctp_serial_open()
463 dev = netdev_priv(ndev); in mctp_serial_open()
464 dev->idx = idx; in mctp_serial_open()
465 dev->tty = tty; in mctp_serial_open()
466 dev->netdev = ndev; in mctp_serial_open()
467 dev->txstate = STATE_IDLE; in mctp_serial_open()
468 dev->rxstate = STATE_IDLE; in mctp_serial_open()
469 spin_lock_init(&dev->lock); in mctp_serial_open()
470 INIT_WORK(&dev->tx_work, mctp_serial_tx_work); in mctp_serial_open()
477 tty->disc_data = dev; in mctp_serial_open()
491 struct mctp_serial *dev = tty->disc_data; in mctp_serial_close() local
492 int idx = dev->idx; in mctp_serial_close()
494 unregister_netdev(dev->netdev); in mctp_serial_close()