Lines Matching refs:kingsun
255 static int ks959_change_speed(struct ks959_cb *kingsun, unsigned speed) in ks959_change_speed() argument
263 if (kingsun->speed_setuprequest == NULL || kingsun->speed_urb == NULL) in ks959_change_speed()
271 memset(&(kingsun->speedparams), 0, sizeof(struct ks959_speedparams)); in ks959_change_speed()
272 kingsun->speedparams.baudrate = cpu_to_le32(speed); in ks959_change_speed()
273 kingsun->speedparams.flags = KS_DATA_8_BITS; in ks959_change_speed()
276 usb_fill_control_urb(kingsun->speed_urb, kingsun->usbdev, in ks959_change_speed()
277 usb_sndctrlpipe(kingsun->usbdev, 0), in ks959_change_speed()
278 (unsigned char *)kingsun->speed_setuprequest, in ks959_change_speed()
279 &(kingsun->speedparams), in ks959_change_speed()
281 kingsun); in ks959_change_speed()
282 kingsun->speed_urb->status = 0; in ks959_change_speed()
283 err = usb_submit_urb(kingsun->speed_urb, GFP_ATOMIC); in ks959_change_speed()
290 static int ks959_submit_tx_fragment(struct ks959_cb *kingsun) in ks959_submit_tx_fragment() argument
299 if (wraplen > kingsun->tx_buf_clear_used) in ks959_submit_tx_fragment()
300 wraplen = kingsun->tx_buf_clear_used; in ks959_submit_tx_fragment()
304 padlen = obfuscate_tx_buffer(kingsun->tx_buf_clear, wraplen, in ks959_submit_tx_fragment()
305 kingsun->tx_buf_xored, in ks959_submit_tx_fragment()
309 kingsun->tx_setuprequest->wValue = cpu_to_le16(wraplen); in ks959_submit_tx_fragment()
310 kingsun->tx_setuprequest->wLength = cpu_to_le16(padlen); in ks959_submit_tx_fragment()
312 usb_fill_control_urb(kingsun->tx_urb, kingsun->usbdev, in ks959_submit_tx_fragment()
313 usb_sndctrlpipe(kingsun->usbdev, 0), in ks959_submit_tx_fragment()
314 (unsigned char *)kingsun->tx_setuprequest, in ks959_submit_tx_fragment()
315 kingsun->tx_buf_xored, padlen, in ks959_submit_tx_fragment()
316 ks959_send_irq, kingsun); in ks959_submit_tx_fragment()
317 kingsun->tx_urb->status = 0; in ks959_submit_tx_fragment()
318 ret = usb_submit_urb(kingsun->tx_urb, GFP_ATOMIC); in ks959_submit_tx_fragment()
321 kingsun->tx_buf_clear_sent = (ret == 0) ? wraplen : 0; in ks959_submit_tx_fragment()
328 struct ks959_cb *kingsun = urb->context; in ks959_send_irq() local
329 struct net_device *netdev = kingsun->netdev; in ks959_send_irq()
333 if (!netif_running(kingsun->netdev)) { in ks959_send_irq()
334 dev_err(&kingsun->usbdev->dev, in ks959_send_irq()
341 dev_err(&kingsun->usbdev->dev, in ks959_send_irq()
347 if (kingsun->tx_buf_clear_used > 0) { in ks959_send_irq()
349 if (kingsun->tx_buf_clear_sent < kingsun->tx_buf_clear_used) { in ks959_send_irq()
350 memmove(kingsun->tx_buf_clear, in ks959_send_irq()
351 kingsun->tx_buf_clear + in ks959_send_irq()
352 kingsun->tx_buf_clear_sent, in ks959_send_irq()
353 kingsun->tx_buf_clear_used - in ks959_send_irq()
354 kingsun->tx_buf_clear_sent); in ks959_send_irq()
356 kingsun->tx_buf_clear_used -= kingsun->tx_buf_clear_sent; in ks959_send_irq()
357 kingsun->tx_buf_clear_sent = 0; in ks959_send_irq()
359 if (kingsun->tx_buf_clear_used > 0) { in ks959_send_irq()
361 if ((ret = ks959_submit_tx_fragment(kingsun)) != 0) { in ks959_send_irq()
362 dev_err(&kingsun->usbdev->dev, in ks959_send_irq()
376 if (kingsun->new_speed != -1 && in ks959_send_irq()
377 cpu_to_le32(kingsun->new_speed) != in ks959_send_irq()
378 kingsun->speedparams.baudrate) in ks959_send_irq()
379 ks959_change_speed(kingsun, kingsun->new_speed); in ks959_send_irq()
392 struct ks959_cb *kingsun; in ks959_hard_xmit() local
401 kingsun = netdev_priv(netdev); in ks959_hard_xmit()
403 spin_lock(&kingsun->lock); in ks959_hard_xmit()
404 kingsun->new_speed = irda_get_next_speed(skb); in ks959_hard_xmit()
408 async_wrap_skb(skb, kingsun->tx_buf_clear, KINGSUN_SND_FIFO_SIZE); in ks959_hard_xmit()
409 kingsun->tx_buf_clear_used = wraplen; in ks959_hard_xmit()
411 if ((ret = ks959_submit_tx_fragment(kingsun)) != 0) { in ks959_hard_xmit()
412 dev_err(&kingsun->usbdev->dev, in ks959_hard_xmit()
429 spin_unlock(&kingsun->lock); in ks959_hard_xmit()
437 struct ks959_cb *kingsun = urb->context; in ks959_rcv_irq() local
441 if (!netif_running(kingsun->netdev)) { in ks959_rcv_irq()
442 kingsun->receiving = 0; in ks959_rcv_irq()
448 dev_err(&kingsun->usbdev->dev, in ks959_rcv_irq()
451 kingsun->receiving = 0; in ks959_rcv_irq()
464 kingsun->rx_variable_xormask++; in ks959_rcv_irq()
466 bytes[i] ^ kingsun->rx_variable_xormask ^ 0x55u; in ks959_rcv_irq()
471 if (kingsun->rx_variable_xormask != 0) { in ks959_rcv_irq()
472 async_unwrap_char(kingsun->netdev, in ks959_rcv_irq()
473 &kingsun->netdev->stats, in ks959_rcv_irq()
474 &kingsun->rx_unwrap_buff, in ks959_rcv_irq()
478 kingsun->receiving = in ks959_rcv_irq()
479 (kingsun->rx_unwrap_buff.state != OUTSIDE_FRAME) ? 1 : 0; in ks959_rcv_irq()
498 struct ks959_cb *kingsun = netdev_priv(netdev); in ks959_net_open() local
503 kingsun->receiving = 0; in ks959_net_open()
506 kingsun->rx_unwrap_buff.in_frame = FALSE; in ks959_net_open()
507 kingsun->rx_unwrap_buff.state = OUTSIDE_FRAME; in ks959_net_open()
508 kingsun->rx_unwrap_buff.truesize = IRDA_SKB_MAX_MTU; in ks959_net_open()
509 kingsun->rx_unwrap_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); in ks959_net_open()
510 if (!kingsun->rx_unwrap_buff.skb) in ks959_net_open()
513 skb_reserve(kingsun->rx_unwrap_buff.skb, 1); in ks959_net_open()
514 kingsun->rx_unwrap_buff.head = kingsun->rx_unwrap_buff.skb->data; in ks959_net_open()
516 kingsun->rx_urb = usb_alloc_urb(0, GFP_KERNEL); in ks959_net_open()
517 if (!kingsun->rx_urb) in ks959_net_open()
520 kingsun->tx_urb = usb_alloc_urb(0, GFP_KERNEL); in ks959_net_open()
521 if (!kingsun->tx_urb) in ks959_net_open()
524 kingsun->speed_urb = usb_alloc_urb(0, GFP_KERNEL); in ks959_net_open()
525 if (!kingsun->speed_urb) in ks959_net_open()
529 kingsun->new_speed = 9600; in ks959_net_open()
530 err = ks959_change_speed(kingsun, 9600); in ks959_net_open()
538 sprintf(hwname, "usb#%d", kingsun->usbdev->devnum); in ks959_net_open()
539 kingsun->irlap = irlap_open(netdev, &kingsun->qos, hwname); in ks959_net_open()
540 if (!kingsun->irlap) { in ks959_net_open()
542 dev_err(&kingsun->usbdev->dev, "irlap_open failed\n"); in ks959_net_open()
547 usb_fill_control_urb(kingsun->rx_urb, kingsun->usbdev, in ks959_net_open()
548 usb_rcvctrlpipe(kingsun->usbdev, 0), in ks959_net_open()
549 (unsigned char *)kingsun->rx_setuprequest, in ks959_net_open()
550 kingsun->rx_buf, KINGSUN_RCV_FIFO_SIZE, in ks959_net_open()
551 ks959_rcv_irq, kingsun); in ks959_net_open()
552 kingsun->rx_urb->status = 0; in ks959_net_open()
553 err = usb_submit_urb(kingsun->rx_urb, GFP_KERNEL); in ks959_net_open()
555 dev_err(&kingsun->usbdev->dev, in ks959_net_open()
574 irlap_close(kingsun->irlap); in ks959_net_open()
576 usb_free_urb(kingsun->speed_urb); in ks959_net_open()
577 kingsun->speed_urb = NULL; in ks959_net_open()
578 usb_free_urb(kingsun->tx_urb); in ks959_net_open()
579 kingsun->tx_urb = NULL; in ks959_net_open()
580 usb_free_urb(kingsun->rx_urb); in ks959_net_open()
581 kingsun->rx_urb = NULL; in ks959_net_open()
582 if (kingsun->rx_unwrap_buff.skb) { in ks959_net_open()
583 kfree_skb(kingsun->rx_unwrap_buff.skb); in ks959_net_open()
584 kingsun->rx_unwrap_buff.skb = NULL; in ks959_net_open()
585 kingsun->rx_unwrap_buff.head = NULL; in ks959_net_open()
598 struct ks959_cb *kingsun = netdev_priv(netdev); in ks959_net_close() local
604 usb_kill_urb(kingsun->tx_urb); in ks959_net_close()
605 usb_free_urb(kingsun->tx_urb); in ks959_net_close()
606 kingsun->tx_urb = NULL; in ks959_net_close()
608 usb_kill_urb(kingsun->speed_urb); in ks959_net_close()
609 usb_free_urb(kingsun->speed_urb); in ks959_net_close()
610 kingsun->speed_urb = NULL; in ks959_net_close()
612 usb_kill_urb(kingsun->rx_urb); in ks959_net_close()
613 usb_free_urb(kingsun->rx_urb); in ks959_net_close()
614 kingsun->rx_urb = NULL; in ks959_net_close()
616 kfree_skb(kingsun->rx_unwrap_buff.skb); in ks959_net_close()
617 kingsun->rx_unwrap_buff.skb = NULL; in ks959_net_close()
618 kingsun->rx_unwrap_buff.head = NULL; in ks959_net_close()
619 kingsun->rx_unwrap_buff.in_frame = FALSE; in ks959_net_close()
620 kingsun->rx_unwrap_buff.state = OUTSIDE_FRAME; in ks959_net_close()
621 kingsun->receiving = 0; in ks959_net_close()
624 if (kingsun->irlap) in ks959_net_close()
625 irlap_close(kingsun->irlap); in ks959_net_close()
627 kingsun->irlap = NULL; in ks959_net_close()
638 struct ks959_cb *kingsun = netdev_priv(netdev); in ks959_net_ioctl() local
647 if (netif_device_present(kingsun->netdev)) in ks959_net_ioctl()
648 return ks959_change_speed(kingsun, irq->ifr_baudrate); in ks959_net_ioctl()
656 if (netif_running(kingsun->netdev)) in ks959_net_ioctl()
657 irda_device_set_media_busy(kingsun->netdev, TRUE); in ks959_net_ioctl()
662 irq->ifr_receiving = kingsun->receiving; in ks959_net_ioctl()
687 struct ks959_cb *kingsun = NULL; in ks959_probe() local
692 net = alloc_irdadev(sizeof(*kingsun)); in ks959_probe()
697 kingsun = netdev_priv(net); in ks959_probe()
698 kingsun->netdev = net; in ks959_probe()
699 kingsun->usbdev = dev; in ks959_probe()
700 kingsun->irlap = NULL; in ks959_probe()
701 kingsun->tx_setuprequest = NULL; in ks959_probe()
702 kingsun->tx_urb = NULL; in ks959_probe()
703 kingsun->tx_buf_clear = NULL; in ks959_probe()
704 kingsun->tx_buf_xored = NULL; in ks959_probe()
705 kingsun->tx_buf_clear_used = 0; in ks959_probe()
706 kingsun->tx_buf_clear_sent = 0; in ks959_probe()
708 kingsun->rx_setuprequest = NULL; in ks959_probe()
709 kingsun->rx_urb = NULL; in ks959_probe()
710 kingsun->rx_buf = NULL; in ks959_probe()
711 kingsun->rx_variable_xormask = 0; in ks959_probe()
712 kingsun->rx_unwrap_buff.in_frame = FALSE; in ks959_probe()
713 kingsun->rx_unwrap_buff.state = OUTSIDE_FRAME; in ks959_probe()
714 kingsun->rx_unwrap_buff.skb = NULL; in ks959_probe()
715 kingsun->receiving = 0; in ks959_probe()
716 spin_lock_init(&kingsun->lock); in ks959_probe()
718 kingsun->speed_setuprequest = NULL; in ks959_probe()
719 kingsun->speed_urb = NULL; in ks959_probe()
720 kingsun->speedparams.baudrate = 0; in ks959_probe()
723 kingsun->rx_buf = kmalloc(KINGSUN_RCV_FIFO_SIZE, GFP_KERNEL); in ks959_probe()
724 if (!kingsun->rx_buf) in ks959_probe()
728 kingsun->rx_setuprequest = in ks959_probe()
730 if (!kingsun->rx_setuprequest) in ks959_probe()
732 kingsun->rx_setuprequest->bRequestType = in ks959_probe()
734 kingsun->rx_setuprequest->bRequest = KINGSUN_REQ_RECV; in ks959_probe()
735 kingsun->rx_setuprequest->wValue = cpu_to_le16(0x0200); in ks959_probe()
736 kingsun->rx_setuprequest->wIndex = 0; in ks959_probe()
737 kingsun->rx_setuprequest->wLength = cpu_to_le16(KINGSUN_RCV_FIFO_SIZE); in ks959_probe()
740 kingsun->tx_buf_clear = kmalloc(KINGSUN_SND_FIFO_SIZE, GFP_KERNEL); in ks959_probe()
741 if (!kingsun->tx_buf_clear) in ks959_probe()
743 kingsun->tx_buf_xored = kmalloc(KINGSUN_SND_PACKET_SIZE, GFP_KERNEL); in ks959_probe()
744 if (!kingsun->tx_buf_xored) in ks959_probe()
748 kingsun->tx_setuprequest = in ks959_probe()
750 if (!kingsun->tx_setuprequest) in ks959_probe()
752 kingsun->tx_setuprequest->bRequestType = in ks959_probe()
754 kingsun->tx_setuprequest->bRequest = KINGSUN_REQ_SEND; in ks959_probe()
755 kingsun->tx_setuprequest->wValue = 0; in ks959_probe()
756 kingsun->tx_setuprequest->wIndex = 0; in ks959_probe()
757 kingsun->tx_setuprequest->wLength = 0; in ks959_probe()
760 kingsun->speed_setuprequest = in ks959_probe()
762 if (!kingsun->speed_setuprequest) in ks959_probe()
764 kingsun->speed_setuprequest->bRequestType = in ks959_probe()
766 kingsun->speed_setuprequest->bRequest = KINGSUN_REQ_SEND; in ks959_probe()
767 kingsun->speed_setuprequest->wValue = cpu_to_le16(0x0200); in ks959_probe()
768 kingsun->speed_setuprequest->wIndex = cpu_to_le16(0x0001); in ks959_probe()
769 kingsun->speed_setuprequest->wLength = in ks959_probe()
778 irda_init_max_qos_capabilies(&kingsun->qos); in ks959_probe()
784 kingsun->qos.baud_rate.bits = in ks959_probe()
786 kingsun->qos.min_turn_time.bits &= KINGSUN_MTT; in ks959_probe()
787 irda_qos_bits_to_value(&kingsun->qos); in ks959_probe()
799 usb_set_intfdata(intf, kingsun); in ks959_probe()
812 kfree(kingsun->speed_setuprequest); in ks959_probe()
813 kfree(kingsun->tx_setuprequest); in ks959_probe()
814 kfree(kingsun->tx_buf_xored); in ks959_probe()
815 kfree(kingsun->tx_buf_clear); in ks959_probe()
816 kfree(kingsun->rx_setuprequest); in ks959_probe()
817 kfree(kingsun->rx_buf); in ks959_probe()
828 struct ks959_cb *kingsun = usb_get_intfdata(intf); in ks959_disconnect() local
830 if (!kingsun) in ks959_disconnect()
833 unregister_netdev(kingsun->netdev); in ks959_disconnect()
836 if (kingsun->speed_urb != NULL) { in ks959_disconnect()
837 usb_kill_urb(kingsun->speed_urb); in ks959_disconnect()
838 usb_free_urb(kingsun->speed_urb); in ks959_disconnect()
839 kingsun->speed_urb = NULL; in ks959_disconnect()
841 if (kingsun->tx_urb != NULL) { in ks959_disconnect()
842 usb_kill_urb(kingsun->tx_urb); in ks959_disconnect()
843 usb_free_urb(kingsun->tx_urb); in ks959_disconnect()
844 kingsun->tx_urb = NULL; in ks959_disconnect()
846 if (kingsun->rx_urb != NULL) { in ks959_disconnect()
847 usb_kill_urb(kingsun->rx_urb); in ks959_disconnect()
848 usb_free_urb(kingsun->rx_urb); in ks959_disconnect()
849 kingsun->rx_urb = NULL; in ks959_disconnect()
852 kfree(kingsun->speed_setuprequest); in ks959_disconnect()
853 kfree(kingsun->tx_setuprequest); in ks959_disconnect()
854 kfree(kingsun->tx_buf_xored); in ks959_disconnect()
855 kfree(kingsun->tx_buf_clear); in ks959_disconnect()
856 kfree(kingsun->rx_setuprequest); in ks959_disconnect()
857 kfree(kingsun->rx_buf); in ks959_disconnect()
858 free_netdev(kingsun->netdev); in ks959_disconnect()
867 struct ks959_cb *kingsun = usb_get_intfdata(intf); in ks959_suspend() local
869 netif_device_detach(kingsun->netdev); in ks959_suspend()
870 if (kingsun->speed_urb != NULL) in ks959_suspend()
871 usb_kill_urb(kingsun->speed_urb); in ks959_suspend()
872 if (kingsun->tx_urb != NULL) in ks959_suspend()
873 usb_kill_urb(kingsun->tx_urb); in ks959_suspend()
874 if (kingsun->rx_urb != NULL) in ks959_suspend()
875 usb_kill_urb(kingsun->rx_urb); in ks959_suspend()
882 struct ks959_cb *kingsun = usb_get_intfdata(intf); in ks959_resume() local
884 if (kingsun->rx_urb != NULL) { in ks959_resume()
886 usb_submit_urb(kingsun->rx_urb, GFP_KERNEL); in ks959_resume()
888 netif_device_attach(kingsun->netdev); in ks959_resume()