Lines Matching refs:stir
194 static int write_reg(struct stir_cb *stir, __u16 reg, __u8 value) in write_reg() argument
196 struct usb_device *dev = stir->usbdev; in write_reg()
199 stir->netdev->name, reg, value); in write_reg()
208 static inline int read_reg(struct stir_cb *stir, __u16 reg, in read_reg() argument
211 struct usb_device *dev = stir->usbdev; in read_reg()
315 static void fir_eof(struct stir_cb *stir) in fir_eof() argument
317 iobuff_t *rx_buff = &stir->rx_buff; in fir_eof()
324 stir->netdev->name, len); in fir_eof()
326 ++stir->netdev->stats.rx_errors; in fir_eof()
327 ++stir->netdev->stats.rx_length_errors; in fir_eof()
334 stir->netdev->stats.rx_errors++; in fir_eof()
335 stir->netdev->stats.rx_crc_errors++; in fir_eof()
343 ++stir->netdev->stats.rx_dropped; in fir_eof()
352 ++stir->netdev->stats.rx_dropped; in fir_eof()
365 skb->dev = stir->netdev; in fir_eof()
369 stir->netdev->stats.rx_packets++; in fir_eof()
370 stir->netdev->stats.rx_bytes += len; in fir_eof()
377 static void stir_fir_chars(struct stir_cb *stir, in stir_fir_chars() argument
380 iobuff_t *rx_buff = &stir->rx_buff; in stir_fir_chars()
402 stir->netdev->name); in stir_fir_chars()
425 stir->netdev->name); in stir_fir_chars()
430 fir_eof(stir); in stir_fir_chars()
439 stir->netdev->name, rx_buff->truesize); in stir_fir_chars()
440 ++stir->netdev->stats.rx_over_errors; in stir_fir_chars()
448 ++stir->netdev->stats.rx_frame_errors; in stir_fir_chars()
451 ++stir->netdev->stats.rx_errors; in stir_fir_chars()
458 static void stir_sir_chars(struct stir_cb *stir, in stir_sir_chars() argument
464 async_unwrap_char(stir->netdev, &stir->netdev->stats, in stir_sir_chars()
465 &stir->rx_buff, bytes[i]); in stir_sir_chars()
468 static inline void unwrap_chars(struct stir_cb *stir, in unwrap_chars() argument
471 if (isfir(stir->speed)) in unwrap_chars()
472 stir_fir_chars(stir, bytes, length); in unwrap_chars()
474 stir_sir_chars(stir, bytes, length); in unwrap_chars()
499 static int change_speed(struct stir_cb *stir, unsigned speed) in change_speed() argument
509 dev_warn(&stir->netdev->dev, "invalid speed %d\n", speed); in change_speed()
513 pr_debug("speed change from %d to %d\n", stir->speed, speed); in change_speed()
516 err = write_reg(stir, REG_CTRL1, CTRL1_SRESET); in change_speed()
521 err = write_reg(stir, REG_DPLL, 0x15); in change_speed()
526 err = write_reg(stir, REG_PDCLK, stir_modes[i].pdclk); in change_speed()
539 err = write_reg(stir, REG_MODE, mode); in change_speed()
544 err = write_reg(stir, REG_CTRL1, in change_speed()
549 err = write_reg(stir, REG_CTRL1, (tx_power & 3) << 1); in change_speed()
554 err = write_reg(stir, REG_CTRL2, (rx_sensitivity & 7) << 5); in change_speed()
556 stir->speed = speed; in change_speed()
566 struct stir_cb *stir = netdev_priv(netdev); in stir_hard_xmit() local
573 skb = xchg(&stir->tx_pending, skb); in stir_hard_xmit()
574 wake_up_process(stir->thread); in stir_hard_xmit()
591 static int fifo_txwait(struct stir_cb *stir, int space) in fifo_txwait() argument
599 err = read_reg(stir, REG_FIFOCTL, stir->fifo_status, in fifo_txwait()
602 dev_warn(&stir->netdev->dev, in fifo_txwait()
608 status = stir->fifo_status[0]; in fifo_txwait()
609 count = (unsigned)(stir->fifo_status[2] & 0x1f) << 8 in fifo_txwait()
610 | stir->fifo_status[1]; in fifo_txwait()
623 if (!netif_running(stir->netdev) || in fifo_txwait()
624 !netif_device_present(stir->netdev)) in fifo_txwait()
636 msleep((count * 8000) / stir->speed); in fifo_txwait()
639 err = write_reg(stir, REG_FIFOCTL, FIFOCTL_CLR); in fifo_txwait()
642 err = write_reg(stir, REG_FIFOCTL, 0); in fifo_txwait()
651 static void turnaround_delay(const struct stir_cb *stir, long us) in turnaround_delay() argument
658 us -= ktime_us_delta(ktime_get(), stir->rx_time); in turnaround_delay()
674 static int receive_start(struct stir_cb *stir) in receive_start() argument
677 stir->receiving = 1; in receive_start()
679 stir->rx_buff.in_frame = FALSE; in receive_start()
680 stir->rx_buff.state = OUTSIDE_FRAME; in receive_start()
682 stir->rx_urb->status = 0; in receive_start()
683 return usb_submit_urb(stir->rx_urb, GFP_KERNEL); in receive_start()
687 static void receive_stop(struct stir_cb *stir) in receive_stop() argument
689 stir->receiving = 0; in receive_stop()
690 usb_kill_urb(stir->rx_urb); in receive_stop()
692 if (stir->rx_buff.in_frame) in receive_stop()
693 stir->netdev->stats.collisions++; in receive_stop()
698 static void stir_send(struct stir_cb *stir, struct sk_buff *skb) in stir_send() argument
704 if (stir->receiving) { in stir_send()
705 receive_stop(stir); in stir_send()
706 turnaround_delay(stir, irda_get_mtt(skb)); in stir_send()
710 if (isfir(stir->speed)) in stir_send()
711 wraplen = wrap_fir_skb(skb, stir->io_buf); in stir_send()
713 wraplen = wrap_sir_skb(skb, stir->io_buf); in stir_send()
717 fifo_txwait(stir, wraplen); in stir_send()
719 stir->netdev->stats.tx_packets++; in stir_send()
720 stir->netdev->stats.tx_bytes += skb->len; in stir_send()
721 stir->netdev->trans_start = jiffies; in stir_send()
724 if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), in stir_send()
725 stir->io_buf, wraplen, in stir_send()
727 stir->netdev->stats.tx_errors++; in stir_send()
735 struct stir_cb *stir = arg; in stir_transmit_thread() local
736 struct net_device *dev = stir->netdev; in stir_transmit_thread()
743 if (stir->receiving) in stir_transmit_thread()
744 receive_stop(stir); in stir_transmit_thread()
746 fifo_txwait(stir, -1); in stir_transmit_thread()
748 write_reg(stir, REG_CTRL1, CTRL1_TXPWD|CTRL1_RXPWD); in stir_transmit_thread()
752 if (change_speed(stir, stir->speed)) in stir_transmit_thread()
758 skb = xchg(&stir->tx_pending, NULL); in stir_transmit_thread()
764 stir_send(stir, skb); in stir_transmit_thread()
767 if ((new_speed != -1) && (stir->speed != new_speed)) { in stir_transmit_thread()
768 if (fifo_txwait(stir, -1) || in stir_transmit_thread()
769 change_speed(stir, new_speed)) in stir_transmit_thread()
776 if (!stir->receiving && in stir_transmit_thread()
779 if (fifo_txwait(stir, -1)) in stir_transmit_thread()
782 if (unlikely(receive_start(stir))) { in stir_transmit_thread()
786 stir->netdev->name); in stir_transmit_thread()
787 stir->receiving = 0; in stir_transmit_thread()
809 struct stir_cb *stir = urb->context; in stir_rcv_irq() local
813 if (!netif_running(stir->netdev)) in stir_rcv_irq()
822 unwrap_chars(stir, urb->transfer_buffer, in stir_rcv_irq()
825 stir->rx_time = ktime_get(); in stir_rcv_irq()
829 if (!stir->receiving) in stir_rcv_irq()
837 dev_warn(&stir->netdev->dev, "usb receive submit error: %d\n", in stir_rcv_irq()
839 stir->receiving = 0; in stir_rcv_irq()
840 wake_up_process(stir->thread); in stir_rcv_irq()
851 struct stir_cb *stir = netdev_priv(netdev); in stir_net_open() local
855 err = usb_clear_halt(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1)); in stir_net_open()
858 err = usb_clear_halt(stir->usbdev, usb_rcvbulkpipe(stir->usbdev, 2)); in stir_net_open()
862 err = change_speed(stir, 9600); in stir_net_open()
869 stir->receiving = 0; in stir_net_open()
870 stir->rx_buff.truesize = IRDA_SKB_MAX_MTU; in stir_net_open()
871 stir->rx_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); in stir_net_open()
872 if (!stir->rx_buff.skb) in stir_net_open()
875 skb_reserve(stir->rx_buff.skb, 1); in stir_net_open()
876 stir->rx_buff.head = stir->rx_buff.skb->data; in stir_net_open()
877 stir->rx_time = ktime_get(); in stir_net_open()
879 stir->rx_urb = usb_alloc_urb(0, GFP_KERNEL); in stir_net_open()
880 if (!stir->rx_urb) in stir_net_open()
883 stir->io_buf = kmalloc(STIR_FIFO_SIZE, GFP_KERNEL); in stir_net_open()
884 if (!stir->io_buf) in stir_net_open()
887 usb_fill_bulk_urb(stir->rx_urb, stir->usbdev, in stir_net_open()
888 usb_rcvbulkpipe(stir->usbdev, 2), in stir_net_open()
889 stir->io_buf, STIR_FIFO_SIZE, in stir_net_open()
890 stir_rcv_irq, stir); in stir_net_open()
892 stir->fifo_status = kmalloc(FIFO_REGS_SIZE, GFP_KERNEL); in stir_net_open()
893 if (!stir->fifo_status) in stir_net_open()
901 sprintf(hwname, "usb#%d", stir->usbdev->devnum); in stir_net_open()
902 stir->irlap = irlap_open(netdev, &stir->qos, hwname); in stir_net_open()
903 if (!stir->irlap) { in stir_net_open()
904 dev_err(&stir->usbdev->dev, "irlap_open failed\n"); in stir_net_open()
909 stir->thread = kthread_run(stir_transmit_thread, stir, in stir_net_open()
910 "%s", stir->netdev->name); in stir_net_open()
911 if (IS_ERR(stir->thread)) { in stir_net_open()
912 err = PTR_ERR(stir->thread); in stir_net_open()
913 dev_err(&stir->usbdev->dev, "unable to start kernel thread\n"); in stir_net_open()
922 irlap_close(stir->irlap); in stir_net_open()
924 kfree(stir->fifo_status); in stir_net_open()
926 kfree(stir->io_buf); in stir_net_open()
928 usb_free_urb(stir->rx_urb); in stir_net_open()
930 kfree_skb(stir->rx_buff.skb); in stir_net_open()
943 struct stir_cb *stir = netdev_priv(netdev); in stir_net_close() local
949 kthread_stop(stir->thread); in stir_net_close()
950 kfree(stir->fifo_status); in stir_net_close()
953 usb_kill_urb(stir->rx_urb); in stir_net_close()
955 kfree(stir->io_buf); in stir_net_close()
956 usb_free_urb(stir->rx_urb); in stir_net_close()
957 kfree_skb(stir->rx_buff.skb); in stir_net_close()
960 if (stir->irlap) in stir_net_close()
961 irlap_close(stir->irlap); in stir_net_close()
963 stir->irlap = NULL; in stir_net_close()
974 struct stir_cb *stir = netdev_priv(netdev); in stir_net_ioctl() local
983 if (netif_device_present(stir->netdev)) in stir_net_ioctl()
984 ret = change_speed(stir, irq->ifr_baudrate); in stir_net_ioctl()
992 if (netif_running(stir->netdev)) in stir_net_ioctl()
993 irda_device_set_media_busy(stir->netdev, TRUE); in stir_net_ioctl()
998 irq->ifr_receiving = stir->receiving; in stir_net_ioctl()
1026 struct stir_cb *stir = NULL; in stir_probe() local
1031 net = alloc_irdadev(sizeof(*stir)); in stir_probe()
1036 stir = netdev_priv(net); in stir_probe()
1037 stir->netdev = net; in stir_probe()
1038 stir->usbdev = dev; in stir_probe()
1052 irda_init_max_qos_capabilies(&stir->qos); in stir_probe()
1055 stir->qos.baud_rate.bits &= IR_2400 | IR_9600 | IR_19200 | in stir_probe()
1058 stir->qos.min_turn_time.bits &= qos_mtt_bits; in stir_probe()
1059 irda_qos_bits_to_value(&stir->qos); in stir_probe()
1071 usb_set_intfdata(intf, stir); in stir_probe()
1086 struct stir_cb *stir = usb_get_intfdata(intf); in stir_disconnect() local
1088 if (!stir) in stir_disconnect()
1091 unregister_netdev(stir->netdev); in stir_disconnect()
1092 free_netdev(stir->netdev); in stir_disconnect()
1101 struct stir_cb *stir = usb_get_intfdata(intf); in stir_suspend() local
1103 netif_device_detach(stir->netdev); in stir_suspend()
1110 struct stir_cb *stir = usb_get_intfdata(intf); in stir_resume() local
1112 netif_device_attach(stir->netdev); in stir_resume()