62 #include <linux/module.h>
64 #include <linux/kernel.h>
65 #include <linux/types.h>
66 #include <linux/errno.h>
68 #include <linux/slab.h>
70 #include <linux/device.h>
73 #include <asm/unaligned.h>
74 #include <asm/byteorder.h>
75 #include <asm/uaccess.h>
85 #define KING_VENDOR_ID 0x07c0
86 #define KING_PRODUCT_ID 0x4200
97 #define KINGSUN_MTT 0x07
99 #define KINGSUN_FIFO_SIZE 4096
100 #define KINGSUN_EP_IN 0
101 #define KINGSUN_EP_OUT 1
130 static void kingsun_send_irq(
struct urb *
urb)
136 if (!netif_running(kingsun->
netdev)) {
138 "kingsun_send_irq: Network not running!\n");
143 if (urb->status != 0) {
145 "kingsun_send_irq: urb asynchronously failed - %d\n",
148 netif_wake_queue(netdev);
161 netif_stop_queue(netdev);
164 SKB_LINEAR_ASSERT(skb);
166 kingsun = netdev_priv(netdev);
168 spin_lock(&kingsun->
lock);
178 kingsun->
out_buf, wraplen, kingsun_send_irq,
183 "kingsun_hard_xmit: failed tx_urb submit: %d\n", ret);
189 netdev->
stats.tx_errors++;
190 netif_start_queue(netdev);
193 netdev->
stats.tx_packets++;
198 spin_unlock(&kingsun->
lock);
204 static void kingsun_rcv_irq(
struct urb *urb)
210 if (!netif_running(kingsun->
netdev)) {
216 if (urb->status != 0) {
218 "kingsun_rcv_irq: urb asynchronously failed - %d\n",
224 if (urb->actual_length == kingsun->
max_rx) {
233 if (bytes[0] >= 1 && bytes[0] < kingsun->
max_rx) {
234 for (i = 1; i <= bytes[0]; i++) {
244 }
else if (urb->actual_length > 0) {
246 "%s(): Unexpected response length, expected %d got %d\n",
247 __func__, kingsun->
max_rx, urb->actual_length);
258 static int kingsun_net_open(
struct net_device *netdev)
260 struct kingsun_cb *kingsun = netdev_priv(netdev);
293 if (!kingsun->
irlap) {
302 kingsun_rcv_irq, kingsun, 1);
303 kingsun->
rx_urb->status = 0;
307 "first urb-submit failed: %d\n", err);
311 netif_start_queue(netdev);
349 static int kingsun_net_close(
struct net_device *netdev)
351 struct kingsun_cb *kingsun = netdev_priv(netdev);
354 netif_stop_queue(netdev);
389 struct kingsun_cb *kingsun = netdev_priv(netdev);
398 if (netif_device_present(kingsun->
netdev))
408 if (netif_running(kingsun->
netdev))
425 .ndo_start_xmit = kingsun_hard_xmit,
426 .ndo_open = kingsun_net_open,
427 .ndo_stop = kingsun_net_close,
428 .ndo_do_ioctl = kingsun_net_ioctl,
442 struct usb_device *
dev = interface_to_usbdev(intf);
446 int pipe, maxp_in, maxp_out;
453 interface = intf->cur_altsetting;
454 if (interface->desc.bNumEndpoints != 2) {
456 "kingsun-sir: expected 2 endpoints, found %d\n",
457 interface->desc.bNumEndpoints);
461 if (!usb_endpoint_is_int_in(endpoint)) {
463 "kingsun-sir: endpoint 0 is not interrupt IN\n");
468 pipe = usb_rcvintpipe(dev, ep_in);
469 maxp_in = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
470 if (maxp_in > 255 || maxp_in <= 1) {
472 "endpoint 0 has max packet size %d not in range\n",
478 if (!usb_endpoint_is_int_out(endpoint)) {
480 "kingsun-sir: endpoint 1 is not interrupt OUT\n");
485 pipe = usb_sndintpipe(dev, ep_out);
486 maxp_out = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
494 kingsun = netdev_priv(net);
498 kingsun->
ep_in = ep_in;
523 "Vendor: %x, Product: %x\n",
524 dev->devnum,
le16_to_cpu(dev->descriptor.idVendor),
542 dev_info(&net->
dev,
"IrDA: Registered KingSun/DonShine device %s\n",
545 usb_set_intfdata(intf, kingsun);
569 struct kingsun_cb *kingsun = usb_get_intfdata(intf);
592 usb_set_intfdata(intf,
NULL);
599 struct kingsun_cb *kingsun = usb_get_intfdata(intf);
610 struct kingsun_cb *kingsun = usb_get_intfdata(intf);
623 static struct usb_driver irda_driver = {
624 .name =
"kingsun-sir",
625 .probe = kingsun_probe,
626 .disconnect = kingsun_disconnect,
629 .suspend = kingsun_suspend,
630 .resume = kingsun_resume,