Lines Matching refs:dev
53 static void pcbit_transmit(struct pcbit_dev *dev);
55 static void pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack);
57 static void pcbit_l2_error(struct pcbit_dev *dev);
58 static void pcbit_l2_active_conf(struct pcbit_dev *dev, u_char info);
61 static void pcbit_firmware_bug(struct pcbit_dev *dev);
64 pcbit_sched_delivery(struct pcbit_dev *dev) in pcbit_sched_delivery() argument
66 schedule_work(&dev->qdelivery); in pcbit_sched_delivery()
75 pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum, in pcbit_l2_write() argument
82 if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) { in pcbit_l2_write()
105 spin_lock_irqsave(&dev->lock, flags); in pcbit_l2_write()
107 if (dev->write_queue == NULL) { in pcbit_l2_write()
108 dev->write_queue = frame; in pcbit_l2_write()
109 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_l2_write()
110 pcbit_transmit(dev); in pcbit_l2_write()
112 for (ptr = dev->write_queue; ptr->next; ptr = ptr->next); in pcbit_l2_write()
115 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_l2_write()
121 pcbit_tx_update(struct pcbit_dev *dev, ushort len) in pcbit_tx_update() argument
125 dev->send_seq = (dev->send_seq + 1) % 8; in pcbit_tx_update()
127 dev->fsize[dev->send_seq] = len; in pcbit_tx_update()
129 info |= dev->rcv_seq << 3; in pcbit_tx_update()
130 info |= dev->send_seq; in pcbit_tx_update()
132 writeb(info, dev->sh_mem + BANK4); in pcbit_tx_update()
141 pcbit_transmit(struct pcbit_dev *dev) in pcbit_transmit() argument
152 if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) in pcbit_transmit()
155 unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07; in pcbit_transmit()
157 spin_lock_irqsave(&dev->lock, flags); in pcbit_transmit()
159 if (dev->free > 16 && dev->write_queue && unacked < 7) { in pcbit_transmit()
161 if (!dev->w_busy) in pcbit_transmit()
162 dev->w_busy = 1; in pcbit_transmit()
164 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_transmit()
169 frame = dev->write_queue; in pcbit_transmit()
170 free = dev->free; in pcbit_transmit()
172 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_transmit()
194 pcbit_writew(dev, flen - FRAME_HDR_LEN); in pcbit_transmit()
196 pcbit_writeb(dev, GET_MSG_CPU(msg)); in pcbit_transmit()
198 pcbit_writeb(dev, GET_MSG_PROC(msg)); in pcbit_transmit()
201 pcbit_writew(dev, frame->hdr_len + PREHDR_LEN); in pcbit_transmit()
204 pcbit_writew(dev, frame->dt_len); in pcbit_transmit()
212 pcbit_writew(dev, frame->hdr_len + PREHDR_LEN); in pcbit_transmit()
215 pcbit_writew(dev, 0); in pcbit_transmit()
218 pcbit_writeb(dev, GET_MSG_CMD(msg)); in pcbit_transmit()
219 pcbit_writeb(dev, GET_MSG_SCMD(msg)); in pcbit_transmit()
222 pcbit_writew(dev, frame->refnum); in pcbit_transmit()
235 pcbit_writew(dev, tt); in pcbit_transmit()
245 memcpy_topcbit(dev, frame->skb->data + frame->copied, in pcbit_transmit()
250 dev->free -= flen; in pcbit_transmit()
251 pcbit_tx_update(dev, flen); in pcbit_transmit()
253 spin_lock_irqsave(&dev->lock, flags); in pcbit_transmit()
257 dev->write_queue = frame->next; in pcbit_transmit()
265 dev->w_busy = 0; in pcbit_transmit()
266 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_transmit()
268 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_transmit()
271 unacked, dev->free, dev->write_queue ? "not empty" : in pcbit_transmit()
287 struct pcbit_dev *dev = in pcbit_deliver() local
290 spin_lock_irqsave(&dev->lock, flags); in pcbit_deliver()
292 while ((frame = dev->read_queue)) { in pcbit_deliver()
293 dev->read_queue = frame->next; in pcbit_deliver()
294 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_deliver()
307 pcbit_l3_receive(dev, frame->msg, frame->skb, frame->hdr_len, in pcbit_deliver()
312 spin_lock_irqsave(&dev->lock, flags); in pcbit_deliver()
315 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_deliver()
323 pcbit_receive(struct pcbit_dev *dev) in pcbit_receive() argument
332 if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) in pcbit_receive()
335 tt = pcbit_readw(dev); in pcbit_receive()
340 pcbit_l2_error(dev); in pcbit_receive()
346 if (dev->read_frame) { in pcbit_receive()
349 kfree_skb(dev->read_frame->skb); in pcbit_receive()
350 kfree(dev->read_frame); in pcbit_receive()
351 dev->read_frame = NULL; in pcbit_receive()
360 cpu = pcbit_readb(dev); in pcbit_receive()
361 proc = pcbit_readb(dev); in pcbit_receive()
367 pcbit_l2_error(dev); in pcbit_receive()
375 frame->hdr_len = pcbit_readw(dev); in pcbit_receive()
376 frame->dt_len = pcbit_readw(dev); in pcbit_receive()
390 pcbit_firmware_bug(dev); in pcbit_receive()
401 pcbit_l2_error(dev); in pcbit_receive()
424 if (!(frame = dev->read_frame)) { in pcbit_receive()
427 dev->readptr += tt; in pcbit_receive()
428 if (dev->readptr > dev->sh_mem + BANK2 + BANKLEN) in pcbit_receive()
429 dev->readptr -= BANKLEN; in pcbit_receive()
435 memcpy_frompcbit(dev, skb_put(frame->skb, tt), tt); in pcbit_receive()
438 spin_lock_irqsave(&dev->lock, flags); in pcbit_receive()
442 dev->read_frame = NULL; in pcbit_receive()
444 if (dev->read_queue) { in pcbit_receive()
446 for (ptr = dev->read_queue; ptr->next; ptr = ptr->next); in pcbit_receive()
449 dev->read_queue = frame; in pcbit_receive()
452 dev->read_frame = frame; in pcbit_receive()
454 spin_unlock_irqrestore(&dev->lock, flags); in pcbit_receive()
464 pcbit_fake_conf(struct pcbit_dev *dev, struct pcbit_chan *chan) in pcbit_fake_conf() argument
471 ictl.driver = dev->id; in pcbit_fake_conf()
474 dev->dev_if->statcallb(&ictl); in pcbit_fake_conf()
479 pcbit_firmware_bug(struct pcbit_dev *dev) in pcbit_firmware_bug() argument
483 chan = dev->b1; in pcbit_firmware_bug()
486 pcbit_fake_conf(dev, chan); in pcbit_firmware_bug()
488 chan = dev->b2; in pcbit_firmware_bug()
491 pcbit_fake_conf(dev, chan); in pcbit_firmware_bug()
498 struct pcbit_dev *dev; in pcbit_irq_handler() local
503 dev = (struct pcbit_dev *) devptr; in pcbit_irq_handler()
505 if (!dev) { in pcbit_irq_handler()
509 if (dev->interrupt) { in pcbit_irq_handler()
513 dev->interrupt = 1; in pcbit_irq_handler()
515 info = readb(dev->sh_mem + BANK3); in pcbit_irq_handler()
517 if (dev->l2_state == L2_STARTING || dev->l2_state == L2_ERROR) { in pcbit_irq_handler()
518 pcbit_l2_active_conf(dev, info); in pcbit_irq_handler()
519 dev->interrupt = 0; in pcbit_irq_handler()
526 pcbit_l2_error(dev); in pcbit_irq_handler()
527 dev->interrupt = 0; in pcbit_irq_handler()
530 if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) { in pcbit_irq_handler()
531 dev->interrupt = 0; in pcbit_irq_handler()
537 dev->interrupt = 0; in pcbit_irq_handler()
539 if (read_seq != dev->rcv_seq) { in pcbit_irq_handler()
540 while (read_seq != dev->rcv_seq) { in pcbit_irq_handler()
541 pcbit_receive(dev); in pcbit_irq_handler()
542 dev->rcv_seq = (dev->rcv_seq + 1) % 8; in pcbit_irq_handler()
544 pcbit_sched_delivery(dev); in pcbit_irq_handler()
546 if (ack_seq != dev->unack_seq) { in pcbit_irq_handler()
547 pcbit_recv_ack(dev, ack_seq); in pcbit_irq_handler()
549 info = dev->rcv_seq << 3; in pcbit_irq_handler()
550 info |= dev->send_seq; in pcbit_irq_handler()
552 writeb(info, dev->sh_mem + BANK4); in pcbit_irq_handler()
558 pcbit_l2_active_conf(struct pcbit_dev *dev, u_char info) in pcbit_l2_active_conf() argument
562 state = dev->l2_state; in pcbit_l2_active_conf()
570 dev->rcv_seq = info & 0x07U; in pcbit_l2_active_conf()
571 dev->l2_state = L2_RUNNING; in pcbit_l2_active_conf()
573 dev->l2_state = L2_DOWN; in pcbit_l2_active_conf()
576 wake_up_interruptible(&dev->set_running_wq); in pcbit_l2_active_conf()
578 if (state == L2_ERROR && dev->l2_state == L2_RUNNING) { in pcbit_l2_active_conf()
579 pcbit_transmit(dev); in pcbit_l2_active_conf()
587 struct pcbit_dev *dev; in pcbit_l2_err_recover() local
590 dev = (struct pcbit_dev *) data; in pcbit_l2_err_recover()
592 del_timer(&dev->error_recover_timer); in pcbit_l2_err_recover()
593 if (dev->w_busy || dev->r_busy) { in pcbit_l2_err_recover()
594 init_timer(&dev->error_recover_timer); in pcbit_l2_err_recover()
595 dev->error_recover_timer.expires = jiffies + ERRTIME; in pcbit_l2_err_recover()
596 add_timer(&dev->error_recover_timer); in pcbit_l2_err_recover()
599 dev->w_busy = dev->r_busy = 1; in pcbit_l2_err_recover()
601 if (dev->read_frame) { in pcbit_l2_err_recover()
602 kfree_skb(dev->read_frame->skb); in pcbit_l2_err_recover()
603 kfree(dev->read_frame); in pcbit_l2_err_recover()
604 dev->read_frame = NULL; in pcbit_l2_err_recover()
606 if (dev->write_queue) { in pcbit_l2_err_recover()
607 frame = dev->write_queue; in pcbit_l2_err_recover()
609 dev->write_queue = dev->write_queue->next; in pcbit_l2_err_recover()
619 dev->rcv_seq = dev->send_seq = dev->unack_seq = 0; in pcbit_l2_err_recover()
620 dev->free = 511; in pcbit_l2_err_recover()
621 dev->l2_state = L2_ERROR; in pcbit_l2_err_recover()
624 pcbit_firmware_bug(dev); in pcbit_l2_err_recover()
626 dev->writeptr = dev->sh_mem; in pcbit_l2_err_recover()
627 dev->readptr = dev->sh_mem + BANK2; in pcbit_l2_err_recover()
629 writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)), in pcbit_l2_err_recover()
630 dev->sh_mem + BANK4); in pcbit_l2_err_recover()
631 dev->w_busy = dev->r_busy = 0; in pcbit_l2_err_recover()
636 pcbit_l2_error(struct pcbit_dev *dev) in pcbit_l2_error() argument
638 if (dev->l2_state == L2_RUNNING) { in pcbit_l2_error()
643 log_state(dev); in pcbit_l2_error()
646 dev->l2_state = L2_DOWN; in pcbit_l2_error()
648 init_timer(&dev->error_recover_timer); in pcbit_l2_error()
649 dev->error_recover_timer.function = &pcbit_l2_err_recover; in pcbit_l2_error()
650 dev->error_recover_timer.data = (ulong) dev; in pcbit_l2_error()
651 dev->error_recover_timer.expires = jiffies + ERRTIME; in pcbit_l2_error()
652 add_timer(&dev->error_recover_timer); in pcbit_l2_error()
664 pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack) in pcbit_recv_ack() argument
670 unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07; in pcbit_recv_ack()
676 if (dev->send_seq > dev->unack_seq) { in pcbit_recv_ack()
677 if (ack <= dev->unack_seq || ack > dev->send_seq) { in pcbit_recv_ack()
680 dev->id); in pcbit_recv_ack()
682 pcbit_l2_error(dev); in pcbit_recv_ack()
683 } else if (ack > dev->send_seq && ack <= dev->unack_seq) { in pcbit_recv_ack()
686 dev->id); in pcbit_recv_ack()
687 pcbit_l2_error(dev); in pcbit_recv_ack()
693 i = dev->unack_seq; in pcbit_recv_ack()
696 dev->unack_seq = i = (i + 1) % 8; in pcbit_recv_ack()
697 dev->free += dev->fsize[i]; in pcbit_recv_ack()
701 while (count < 7 && dev->write_queue) { in pcbit_recv_ack()
702 u8 lsend_seq = dev->send_seq; in pcbit_recv_ack()
704 pcbit_transmit(dev); in pcbit_recv_ack()
706 if (dev->send_seq == lsend_seq) in pcbit_recv_ack()