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