1 /****************************************************************
 
   3  *     kaweth.c - driver for KL5KUSB101 based USB->Ethernet
 
   5  *     (c) 2000 Interlan Communications
 
   6  *     (c) 2000 Stephane Alnet
 
   8  *     (C) 2002 Oliver Neukum
 
  10  *     Original author: The Zapman <zapman@interlan.net>
 
  11  *     Inspired by, and much credit goes to Michael Rothwell
 
  12  *     <rothwell@interlan.net> for the test equipment, help, and patience
 
  13  *     Based off of (and with thanks to) Petko Manolov's pegaus.c driver.
 
  14  *     Also many thanks to Joel Silverman and Ed Surprenant at Kawasaki
 
  15  *     for providing the firmware and driver resources.
 
  17  *     This program is free software; you can redistribute it and/or
 
  18  *     modify it under the terms of the GNU General Public License as
 
  19  *     published by the Free Software Foundation; either version 2, or
 
  20  *     (at your option) any later version.
 
  22  *     This program is distributed in the hope that it will be useful,
 
  23  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  24  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  25  *     GNU General Public License for more details.
 
  27  *     You should have received a copy of the GNU General Public License
 
  28  *     along with this program; if not, write to the Free Software Foundation,
 
  29  *     Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
  31  ****************************************************************/
 
  34  * Fix in_interrupt() problem
 
  35  * Develop test procedures for USB net interfaces
 
  37  * Fix bugs from previous two steps
 
  38  * Snoop other OSs for any tricks we're not doing
 
  40  * Reduce arbitrary timeouts
 
  41  * Smart multicast support
 
  42  * Temporary MAC change support
 
  43  * Tunable SOFs parameter - ioctl()?
 
  44  * Ethernet stats collection
 
  45  * Code formatting improvements
 
  48 #include <linux/module.h>
 
  49 #include <linux/slab.h>
 
  50 #include <linux/string.h>
 
  51 #include <linux/init.h>
 
  52 #include <linux/delay.h>
 
  53 #include <linux/netdevice.h>
 
  54 #include <linux/etherdevice.h>
 
  55 #include <linux/usb.h>
 
  56 #include <linux/types.h>
 
  57 #include <linux/ethtool.h>
 
  58 #include <linux/dma-mapping.h>
 
  59 #include <linux/wait.h>
 
  60 #include <linux/firmware.h>
 
  61 #include <asm/uaccess.h>
 
  62 #include <asm/byteorder.h>
 
  66 #define KAWETH_MTU                      1514
 
  67 #define KAWETH_BUF_SIZE                 1664
 
  68 #define KAWETH_TX_TIMEOUT               (5 * HZ)
 
  69 #define KAWETH_SCRATCH_SIZE             32
 
  70 #define KAWETH_FIRMWARE_BUF_SIZE        4096
 
  71 #define KAWETH_CONTROL_TIMEOUT          (30000)
 
  73 #define KAWETH_STATUS_BROKEN            0x0000001
 
  74 #define KAWETH_STATUS_CLOSING           0x0000002
 
  75 #define KAWETH_STATUS_SUSPENDING        0x0000004
 
  77 #define KAWETH_STATUS_BLOCKED (KAWETH_STATUS_CLOSING | KAWETH_STATUS_SUSPENDING)
 
  79 #define KAWETH_PACKET_FILTER_PROMISCUOUS        0x01
 
  80 #define KAWETH_PACKET_FILTER_ALL_MULTICAST      0x02
 
  81 #define KAWETH_PACKET_FILTER_DIRECTED           0x04
 
  82 #define KAWETH_PACKET_FILTER_BROADCAST          0x08
 
  83 #define KAWETH_PACKET_FILTER_MULTICAST          0x10
 
  86 #define KAWETH_COMMAND_GET_ETHERNET_DESC        0x00
 
  87 #define KAWETH_COMMAND_MULTICAST_FILTERS        0x01
 
  88 #define KAWETH_COMMAND_SET_PACKET_FILTER        0x02
 
  89 #define KAWETH_COMMAND_STATISTICS               0x03
 
  90 #define KAWETH_COMMAND_SET_TEMP_MAC             0x06
 
  91 #define KAWETH_COMMAND_GET_TEMP_MAC             0x07
 
  92 #define KAWETH_COMMAND_SET_URB_SIZE             0x08
 
  93 #define KAWETH_COMMAND_SET_SOFS_WAIT            0x09
 
  94 #define KAWETH_COMMAND_SCAN                     0xFF
 
  96 #define KAWETH_SOFS_TO_WAIT                     0x05
 
  98 #define INTBUFFERSIZE                           4
 
 100 #define STATE_OFFSET                            0
 
 101 #define STATE_MASK                              0x40
 
 102 #define STATE_SHIFT                             5
 
 104 #define IS_BLOCKED(s) (s & KAWETH_STATUS_BLOCKED)
 
 107 MODULE_AUTHOR("Michael Zappe <zapman@interlan.net>, Stephane Alnet <stephane@u-picardie.fr>, Brad Hards <bhards@bigpond.net.au> and Oliver Neukum <oliver@neukum.org>");
 
 108 MODULE_DESCRIPTION("KL5USB101 USB Ethernet driver");
 
 109 MODULE_LICENSE("GPL");
 
 110 MODULE_FIRMWARE("kaweth/new_code.bin");
 
 111 MODULE_FIRMWARE("kaweth/new_code_fix.bin");
 
 112 MODULE_FIRMWARE("kaweth/trigger_code.bin");
 
 113 MODULE_FIRMWARE("kaweth/trigger_code_fix.bin");
 
 115 static const char driver_name[] = "kaweth";
 
 117 static int kaweth_probe(
 
 118                 struct usb_interface *intf,
 
 119                 const struct usb_device_id *id  /* from id_table */
 
 121 static void kaweth_disconnect(struct usb_interface *intf);
 
 122 static int kaweth_internal_control_msg(struct usb_device *usb_dev,
 
 124                                        struct usb_ctrlrequest *cmd, void *data,
 
 125                                        int len, int timeout);
 
 126 static int kaweth_suspend(struct usb_interface *intf, pm_message_t message);
 
 127 static int kaweth_resume(struct usb_interface *intf);
 
 129 /****************************************************************
 
 131  ****************************************************************/
 
 132 static struct usb_device_id usb_klsi_table[] = {
 
 133         { USB_DEVICE(0x03e8, 0x0008) }, /* AOX Endpoints USB Ethernet */
 
 134         { USB_DEVICE(0x04bb, 0x0901) }, /* I-O DATA USB-ET/T */
 
 135         { USB_DEVICE(0x0506, 0x03e8) }, /* 3Com 3C19250 */
 
 136         { USB_DEVICE(0x0506, 0x11f8) }, /* 3Com 3C460 */
 
 137         { USB_DEVICE(0x0557, 0x2002) }, /* ATEN USB Ethernet */
 
 138         { USB_DEVICE(0x0557, 0x4000) }, /* D-Link DSB-650C */
 
 139         { USB_DEVICE(0x0565, 0x0002) }, /* Peracom Enet */
 
 140         { USB_DEVICE(0x0565, 0x0003) }, /* Optus@Home UEP1045A */
 
 141         { USB_DEVICE(0x0565, 0x0005) }, /* Peracom Enet2 */
 
 142         { USB_DEVICE(0x05e9, 0x0008) }, /* KLSI KL5KUSB101B */
 
 143         { USB_DEVICE(0x05e9, 0x0009) }, /* KLSI KL5KUSB101B (Board change) */
 
 144         { USB_DEVICE(0x066b, 0x2202) }, /* Linksys USB10T */
 
 145         { USB_DEVICE(0x06e1, 0x0008) }, /* ADS USB-10BT */
 
 146         { USB_DEVICE(0x06e1, 0x0009) }, /* ADS USB-10BT */
 
 147         { USB_DEVICE(0x0707, 0x0100) }, /* SMC 2202USB */
 
 148         { USB_DEVICE(0x07aa, 0x0001) }, /* Correga K.K. */
 
 149         { USB_DEVICE(0x07b8, 0x4000) }, /* D-Link DU-E10 */
 
 150         { USB_DEVICE(0x0846, 0x1001) }, /* NetGear EA-101 */
 
 151         { USB_DEVICE(0x0846, 0x1002) }, /* NetGear EA-101 */
 
 152         { USB_DEVICE(0x085a, 0x0008) }, /* PortGear Ethernet Adapter */
 
 153         { USB_DEVICE(0x085a, 0x0009) }, /* PortGear Ethernet Adapter */
 
 154         { USB_DEVICE(0x087d, 0x5704) }, /* Jaton USB Ethernet Device Adapter */
 
 155         { USB_DEVICE(0x0951, 0x0008) }, /* Kingston Technology USB Ethernet Adapter */
 
 156         { USB_DEVICE(0x095a, 0x3003) }, /* Portsmith Express Ethernet Adapter */
 
 157         { USB_DEVICE(0x10bd, 0x1427) }, /* ASANTE USB To Ethernet Adapter */
 
 158         { USB_DEVICE(0x1342, 0x0204) }, /* Mobility USB-Ethernet Adapter */
 
 159         { USB_DEVICE(0x13d2, 0x0400) }, /* Shark Pocket Adapter */
 
 160         { USB_DEVICE(0x1485, 0x0001) }, /* Silicom U2E */
 
 161         { USB_DEVICE(0x1485, 0x0002) }, /* Psion Dacom Gold Port Ethernet */
 
 162         { USB_DEVICE(0x1645, 0x0005) }, /* Entrega E45 */
 
 163         { USB_DEVICE(0x1645, 0x0008) }, /* Entrega USB Ethernet Adapter */
 
 164         { USB_DEVICE(0x1645, 0x8005) }, /* PortGear Ethernet Adapter */
 
 165         { USB_DEVICE(0x1668, 0x0323) }, /* Actiontec USB Ethernet */
 
 166         { USB_DEVICE(0x2001, 0x4000) }, /* D-link DSB-650C */
 
 167         {} /* Null terminator */
 
 170 MODULE_DEVICE_TABLE (usb, usb_klsi_table);
 
 172 /****************************************************************
 
 174  ****************************************************************/
 
 175 static struct usb_driver kaweth_driver = {
 
 177         .probe =        kaweth_probe,
 
 178         .disconnect =   kaweth_disconnect,
 
 179         .suspend =      kaweth_suspend,
 
 180         .resume =       kaweth_resume,
 
 181         .id_table =     usb_klsi_table,
 
 182         .supports_autosuspend = 1,
 
 185 typedef __u8 eth_addr_t[6];
 
 187 /****************************************************************
 
 189  ****************************************************************/
 
 197 /****************************************************************
 
 198  *     kaweth_ethernet_configuration
 
 200  ****************************************************************/
 
 201 struct kaweth_ethernet_configuration
 
 207         __u32 statistics_mask;
 
 209         __u16 max_multicast_filters;
 
 211 } __attribute__ ((packed));
 
 213 /****************************************************************
 
 215  ****************************************************************/
 
 218         spinlock_t device_lock;
 
 222         int suspend_lowmem_rx;
 
 223         int suspend_lowmem_ctrl;
 
 226         struct delayed_work lowmem_work;
 
 228         struct usb_device *dev;
 
 229         struct usb_interface *intf;
 
 230         struct net_device *net;
 
 231         wait_queue_head_t term_wait;
 
 237         dma_addr_t intbufferhandle;
 
 239         dma_addr_t rxbufferhandle;
 
 243         struct sk_buff *tx_skb;
 
 246         __u8 scratch[KAWETH_SCRATCH_SIZE];
 
 247         __u16 packet_filter_bitmap;
 
 249         struct kaweth_ethernet_configuration configuration;
 
 251         struct net_device_stats stats;
 
 255 /****************************************************************
 
 257  ****************************************************************/
 
 258 static int kaweth_control(struct kaweth_device *kaweth,
 
 268         struct usb_ctrlrequest *dr;
 
 270         dbg("kaweth_control()");
 
 273                 dbg("in_interrupt()");
 
 277         dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
 
 280                 dbg("kmalloc() failed");
 
 284         dr->bRequestType= requesttype;
 
 285         dr->bRequest = request;
 
 286         dr->wValue = cpu_to_le16p(&value);
 
 287         dr->wIndex = cpu_to_le16p(&index);
 
 288         dr->wLength = cpu_to_le16p(&size);
 
 290         return kaweth_internal_control_msg(kaweth->dev,
 
 298 /****************************************************************
 
 299  *     kaweth_read_configuration
 
 300  ****************************************************************/
 
 301 static int kaweth_read_configuration(struct kaweth_device *kaweth)
 
 305         dbg("Reading kaweth configuration");
 
 307         retval = kaweth_control(kaweth,
 
 308                                 usb_rcvctrlpipe(kaweth->dev, 0),
 
 309                                 KAWETH_COMMAND_GET_ETHERNET_DESC,
 
 310                                 USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
 
 313                                 (void *)&kaweth->configuration,
 
 314                                 sizeof(kaweth->configuration),
 
 315                                 KAWETH_CONTROL_TIMEOUT);
 
 320 /****************************************************************
 
 321  *     kaweth_set_urb_size
 
 322  ****************************************************************/
 
 323 static int kaweth_set_urb_size(struct kaweth_device *kaweth, __u16 urb_size)
 
 327         dbg("Setting URB size to %d", (unsigned)urb_size);
 
 329         retval = kaweth_control(kaweth,
 
 330                                 usb_sndctrlpipe(kaweth->dev, 0),
 
 331                                 KAWETH_COMMAND_SET_URB_SIZE,
 
 332                                 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 335                                 (void *)&kaweth->scratch,
 
 337                                 KAWETH_CONTROL_TIMEOUT);
 
 342 /****************************************************************
 
 343  *     kaweth_set_sofs_wait
 
 344  ****************************************************************/
 
 345 static int kaweth_set_sofs_wait(struct kaweth_device *kaweth, __u16 sofs_wait)
 
 349         dbg("Set SOFS wait to %d", (unsigned)sofs_wait);
 
 351         retval = kaweth_control(kaweth,
 
 352                                 usb_sndctrlpipe(kaweth->dev, 0),
 
 353                                 KAWETH_COMMAND_SET_SOFS_WAIT,
 
 354                                 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 357                                 (void *)&kaweth->scratch,
 
 359                                 KAWETH_CONTROL_TIMEOUT);
 
 364 /****************************************************************
 
 365  *     kaweth_set_receive_filter
 
 366  ****************************************************************/
 
 367 static int kaweth_set_receive_filter(struct kaweth_device *kaweth,
 
 368                                      __u16 receive_filter)
 
 372         dbg("Set receive filter to %d", (unsigned)receive_filter);
 
 374         retval = kaweth_control(kaweth,
 
 375                                 usb_sndctrlpipe(kaweth->dev, 0),
 
 376                                 KAWETH_COMMAND_SET_PACKET_FILTER,
 
 377                                 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 380                                 (void *)&kaweth->scratch,
 
 382                                 KAWETH_CONTROL_TIMEOUT);
 
 387 /****************************************************************
 
 388  *     kaweth_download_firmware
 
 389  ****************************************************************/
 
 390 static int kaweth_download_firmware(struct kaweth_device *kaweth,
 
 395         const struct firmware *fw;
 
 399         ret = request_firmware(&fw, fwname, &kaweth->dev->dev);
 
 401                 err("Firmware request failed\n");
 
 405         if (fw->size > KAWETH_FIRMWARE_BUF_SIZE) {
 
 406                 err("Firmware too big: %zu", fw->size);
 
 410         memcpy(kaweth->firmware_buf, fw->data, fw->size);
 
 412         release_firmware(fw);
 
 414         kaweth->firmware_buf[2] = (data_len & 0xFF) - 7;
 
 415         kaweth->firmware_buf[3] = data_len >> 8;
 
 416         kaweth->firmware_buf[4] = type;
 
 417         kaweth->firmware_buf[5] = interrupt;
 
 419         dbg("High: %i, Low:%i", kaweth->firmware_buf[3],
 
 420                    kaweth->firmware_buf[2]);
 
 422         dbg("Downloading firmware at %p to kaweth device at %p",
 
 424         dbg("Firmware length: %d", data_len);
 
 426         return kaweth_control(kaweth,
 
 427                               usb_sndctrlpipe(kaweth->dev, 0),
 
 429                               USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 432                               (void *)kaweth->firmware_buf,
 
 434                               KAWETH_CONTROL_TIMEOUT);
 
 437 /****************************************************************
 
 438  *     kaweth_trigger_firmware
 
 439  ****************************************************************/
 
 440 static int kaweth_trigger_firmware(struct kaweth_device *kaweth,
 
 443         kaweth->firmware_buf[0] = 0xB6;
 
 444         kaweth->firmware_buf[1] = 0xC3;
 
 445         kaweth->firmware_buf[2] = 0x01;
 
 446         kaweth->firmware_buf[3] = 0x00;
 
 447         kaweth->firmware_buf[4] = 0x06;
 
 448         kaweth->firmware_buf[5] = interrupt;
 
 449         kaweth->firmware_buf[6] = 0x00;
 
 450         kaweth->firmware_buf[7] = 0x00;
 
 452         dbg("Triggering firmware");
 
 454         return kaweth_control(kaweth,
 
 455                               usb_sndctrlpipe(kaweth->dev, 0),
 
 457                               USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 460                               (void *)kaweth->firmware_buf,
 
 462                               KAWETH_CONTROL_TIMEOUT);
 
 465 /****************************************************************
 
 467  ****************************************************************/
 
 468 static int kaweth_reset(struct kaweth_device *kaweth)
 
 472         dbg("kaweth_reset(%p)", kaweth);
 
 473         result = kaweth_control(kaweth,
 
 474                                 usb_sndctrlpipe(kaweth->dev, 0),
 
 475                                 USB_REQ_SET_CONFIGURATION,
 
 477                                 kaweth->dev->config[0].desc.bConfigurationValue,
 
 481                                 KAWETH_CONTROL_TIMEOUT);
 
 485         dbg("kaweth_reset() returns %d.",result);
 
 490 static void kaweth_usb_receive(struct urb *);
 
 491 static int kaweth_resubmit_rx_urb(struct kaweth_device *, gfp_t);
 
 493 /****************************************************************
 
 495 *****************************************************************/
 
 497 static void kaweth_resubmit_int_urb(struct kaweth_device *kaweth, gfp_t mf)
 
 501         status = usb_submit_urb (kaweth->irq_urb, mf);
 
 502         if (unlikely(status == -ENOMEM)) {
 
 503                 kaweth->suspend_lowmem_ctrl = 1;
 
 504                 schedule_delayed_work(&kaweth->lowmem_work, HZ/4);
 
 506                 kaweth->suspend_lowmem_ctrl = 0;
 
 510                 err ("can't resubmit intr, %s-%s, status %d",
 
 511                                 kaweth->dev->bus->bus_name,
 
 512                                 kaweth->dev->devpath, status);
 
 515 static void int_callback(struct urb *u)
 
 517         struct kaweth_device *kaweth = u->context;
 
 521         case 0:                 /* success */
 
 523         case -ECONNRESET:       /* unlink */
 
 527         /* -EPIPE:  should clear the halt */
 
 532         /* we check the link state to report changes */
 
 533         if (kaweth->linkstate != (act_state = ( kaweth->intbuffer[STATE_OFFSET] | STATE_MASK) >> STATE_SHIFT)) {
 
 535                         netif_carrier_on(kaweth->net);
 
 537                         netif_carrier_off(kaweth->net);
 
 539                 kaweth->linkstate = act_state;
 
 542         kaweth_resubmit_int_urb(kaweth, GFP_ATOMIC);
 
 545 static void kaweth_resubmit_tl(struct work_struct *work)
 
 547         struct kaweth_device *kaweth =
 
 548                 container_of(work, struct kaweth_device, lowmem_work.work);
 
 550         if (IS_BLOCKED(kaweth->status))
 
 553         if (kaweth->suspend_lowmem_rx)
 
 554                 kaweth_resubmit_rx_urb(kaweth, GFP_NOIO);
 
 556         if (kaweth->suspend_lowmem_ctrl)
 
 557                 kaweth_resubmit_int_urb(kaweth, GFP_NOIO);
 
 561 /****************************************************************
 
 562  *     kaweth_resubmit_rx_urb
 
 563  ****************************************************************/
 
 564 static int kaweth_resubmit_rx_urb(struct kaweth_device *kaweth,
 
 569         usb_fill_bulk_urb(kaweth->rx_urb,
 
 571                       usb_rcvbulkpipe(kaweth->dev, 1),
 
 576         kaweth->rx_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
 577         kaweth->rx_urb->transfer_dma = kaweth->rxbufferhandle;
 
 579         if((result = usb_submit_urb(kaweth->rx_urb, mem_flags))) {
 
 580                 if (result == -ENOMEM) {
 
 581                         kaweth->suspend_lowmem_rx = 1;
 
 582                         schedule_delayed_work(&kaweth->lowmem_work, HZ/4);
 
 584                 err("resubmitting rx_urb %d failed", result);
 
 586                 kaweth->suspend_lowmem_rx = 0;
 
 592 static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth);
 
 594 /****************************************************************
 
 596  ****************************************************************/
 
 597 static void kaweth_usb_receive(struct urb *urb)
 
 599         struct kaweth_device *kaweth = urb->context;
 
 600         struct net_device *net = kaweth->net;
 
 602         int count = urb->actual_length;
 
 603         int count2 = urb->transfer_buffer_length;
 
 605         __u16 pkt_len = le16_to_cpup((__le16 *)kaweth->rx_buf);
 
 609         if(unlikely(urb->status == -ECONNRESET || urb->status == -ESHUTDOWN))
 
 610         /* we are killed - set a flag and wake the disconnect handler */
 
 613                 wake_up(&kaweth->term_wait);
 
 617         spin_lock(&kaweth->device_lock);
 
 618         if (IS_BLOCKED(kaweth->status)) {
 
 619                 spin_unlock(&kaweth->device_lock);
 
 622         spin_unlock(&kaweth->device_lock);
 
 624         if(urb->status && urb->status != -EREMOTEIO && count != 1) {
 
 625                 err("%s RX status: %d count: %d packet_len: %d",
 
 630                 kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC);
 
 634         if(kaweth->net && (count > 2)) {
 
 635                 if(pkt_len > (count - 2)) {
 
 636                         err("Packet length too long for USB frame (pkt_len: %x, count: %x)",pkt_len, count);
 
 637                         err("Packet len & 2047: %x", pkt_len & 2047);
 
 638                         err("Count 2: %x", count2);
 
 639                         kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC);
 
 643                 if(!(skb = dev_alloc_skb(pkt_len+2))) {
 
 644                         kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC);
 
 648                 skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
 
 650                 skb_copy_to_linear_data(skb, kaweth->rx_buf + 2, pkt_len);
 
 652                 skb_put(skb, pkt_len);
 
 654                 skb->protocol = eth_type_trans(skb, net);
 
 658                 kaweth->stats.rx_packets++;
 
 659                 kaweth->stats.rx_bytes += pkt_len;
 
 662         kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC);
 
 665 /****************************************************************
 
 667  ****************************************************************/
 
 668 static int kaweth_open(struct net_device *net)
 
 670         struct kaweth_device *kaweth = netdev_priv(net);
 
 673         dbg("Opening network device.");
 
 675         res = usb_autopm_get_interface(kaweth->intf);
 
 677                 err("Interface cannot be resumed.");
 
 680         res = kaweth_resubmit_rx_urb(kaweth, GFP_KERNEL);
 
 687                 usb_rcvintpipe(kaweth->dev, 3),
 
 692                 250); /* overriding the descriptor */
 
 693         kaweth->irq_urb->transfer_dma = kaweth->intbufferhandle;
 
 694         kaweth->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
 696         res = usb_submit_urb(kaweth->irq_urb, GFP_KERNEL);
 
 698                 usb_kill_urb(kaweth->rx_urb);
 
 703         netif_start_queue(net);
 
 705         kaweth_async_set_rx_mode(kaweth);
 
 709         usb_autopm_enable(kaweth->intf);
 
 713 /****************************************************************
 
 715  ****************************************************************/
 
 716 static void kaweth_kill_urbs(struct kaweth_device *kaweth)
 
 718         usb_kill_urb(kaweth->irq_urb);
 
 719         usb_kill_urb(kaweth->rx_urb);
 
 720         usb_kill_urb(kaweth->tx_urb);
 
 722         cancel_delayed_work_sync(&kaweth->lowmem_work);
 
 724         /* a scheduled work may have resubmitted,
 
 726         usb_kill_urb(kaweth->irq_urb);
 
 727         usb_kill_urb(kaweth->rx_urb);
 
 730 /****************************************************************
 
 732  ****************************************************************/
 
 733 static int kaweth_close(struct net_device *net)
 
 735         struct kaweth_device *kaweth = netdev_priv(net);
 
 737         netif_stop_queue(net);
 
 740         kaweth->status |= KAWETH_STATUS_CLOSING;
 
 742         kaweth_kill_urbs(kaweth);
 
 744         kaweth->status &= ~KAWETH_STATUS_CLOSING;
 
 746         usb_autopm_enable(kaweth->intf);
 
 751 static void kaweth_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 
 753         struct kaweth_device *kaweth = netdev_priv(dev);
 
 755         strlcpy(info->driver, driver_name, sizeof(info->driver));
 
 756         usb_make_path(kaweth->dev, info->bus_info, sizeof (info->bus_info));
 
 759 static u32 kaweth_get_link(struct net_device *dev)
 
 761         struct kaweth_device *kaweth = netdev_priv(dev);
 
 763         return kaweth->linkstate;
 
 766 static struct ethtool_ops ops = {
 
 767         .get_drvinfo    = kaweth_get_drvinfo,
 
 768         .get_link       = kaweth_get_link
 
 771 /****************************************************************
 
 772  *     kaweth_usb_transmit_complete
 
 773  ****************************************************************/
 
 774 static void kaweth_usb_transmit_complete(struct urb *urb)
 
 776         struct kaweth_device *kaweth = urb->context;
 
 777         struct sk_buff *skb = kaweth->tx_skb;
 
 779         if (unlikely(urb->status != 0))
 
 780                 if (urb->status != -ENOENT)
 
 781                         dbg("%s: TX status %d.", kaweth->net->name, urb->status);
 
 783         netif_wake_queue(kaweth->net);
 
 784         dev_kfree_skb_irq(skb);
 
 787 /****************************************************************
 
 789  ****************************************************************/
 
 790 static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
 
 792         struct kaweth_device *kaweth = netdev_priv(net);
 
 793         __le16 *private_header;
 
 797         spin_lock(&kaweth->device_lock);
 
 799         kaweth_async_set_rx_mode(kaweth);
 
 800         netif_stop_queue(net);
 
 801         if (IS_BLOCKED(kaweth->status)) {
 
 805         /* We now decide whether we can put our special header into the sk_buff */
 
 806         if (skb_cloned(skb) || skb_headroom(skb) < 2) {
 
 807                 /* no such luck - we make our own */
 
 808                 struct sk_buff *copied_skb;
 
 809                 copied_skb = skb_copy_expand(skb, 2, 0, GFP_ATOMIC);
 
 810                 dev_kfree_skb_irq(skb);
 
 813                         kaweth->stats.tx_errors++;
 
 814                         netif_start_queue(net);
 
 815                         spin_unlock(&kaweth->device_lock);
 
 820         private_header = (__le16 *)__skb_push(skb, 2);
 
 821         *private_header = cpu_to_le16(skb->len-2);
 
 822         kaweth->tx_skb = skb;
 
 824         usb_fill_bulk_urb(kaweth->tx_urb,
 
 826                       usb_sndbulkpipe(kaweth->dev, 2),
 
 829                       kaweth_usb_transmit_complete,
 
 833         if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC)))
 
 835                 warn("kaweth failed tx_urb %d", res);
 
 837                 kaweth->stats.tx_errors++;
 
 839                 netif_start_queue(net);
 
 840                 dev_kfree_skb_irq(skb);
 
 844                 kaweth->stats.tx_packets++;
 
 845                 kaweth->stats.tx_bytes += skb->len;
 
 846                 net->trans_start = jiffies;
 
 849         spin_unlock(&kaweth->device_lock);
 
 854 /****************************************************************
 
 856  ****************************************************************/
 
 857 static void kaweth_set_rx_mode(struct net_device *net)
 
 859         struct kaweth_device *kaweth = netdev_priv(net);
 
 861         __u16 packet_filter_bitmap = KAWETH_PACKET_FILTER_DIRECTED |
 
 862                                      KAWETH_PACKET_FILTER_BROADCAST |
 
 863                                      KAWETH_PACKET_FILTER_MULTICAST;
 
 865         dbg("Setting Rx mode to %d", packet_filter_bitmap);
 
 867         netif_stop_queue(net);
 
 869         if (net->flags & IFF_PROMISC) {
 
 870                 packet_filter_bitmap |= KAWETH_PACKET_FILTER_PROMISCUOUS;
 
 872         else if ((net->mc_count) || (net->flags & IFF_ALLMULTI)) {
 
 873                 packet_filter_bitmap |= KAWETH_PACKET_FILTER_ALL_MULTICAST;
 
 876         kaweth->packet_filter_bitmap = packet_filter_bitmap;
 
 877         netif_wake_queue(net);
 
 880 /****************************************************************
 
 881  *     kaweth_async_set_rx_mode
 
 882  ****************************************************************/
 
 883 static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth)
 
 885         __u16 packet_filter_bitmap = kaweth->packet_filter_bitmap;
 
 886         kaweth->packet_filter_bitmap = 0;
 
 887         if (packet_filter_bitmap == 0)
 
 892         result = kaweth_control(kaweth,
 
 893                                 usb_sndctrlpipe(kaweth->dev, 0),
 
 894                                 KAWETH_COMMAND_SET_PACKET_FILTER,
 
 895                                 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
 
 896                                 packet_filter_bitmap,
 
 898                                 (void *)&kaweth->scratch,
 
 900                                 KAWETH_CONTROL_TIMEOUT);
 
 903                 err("Failed to set Rx mode: %d", result);
 
 906                 dbg("Set Rx mode to %d", packet_filter_bitmap);
 
 911 /****************************************************************
 
 912  *     kaweth_netdev_stats
 
 913  ****************************************************************/
 
 914 static struct net_device_stats *kaweth_netdev_stats(struct net_device *dev)
 
 916         struct kaweth_device *kaweth = netdev_priv(dev);
 
 917         return &kaweth->stats;
 
 920 /****************************************************************
 
 922  ****************************************************************/
 
 923 static void kaweth_tx_timeout(struct net_device *net)
 
 925         struct kaweth_device *kaweth = netdev_priv(net);
 
 927         warn("%s: Tx timed out. Resetting.", net->name);
 
 928         kaweth->stats.tx_errors++;
 
 929         net->trans_start = jiffies;
 
 931         usb_unlink_urb(kaweth->tx_urb);
 
 934 /****************************************************************
 
 936  ****************************************************************/
 
 937 static int kaweth_suspend(struct usb_interface *intf, pm_message_t message)
 
 939         struct kaweth_device *kaweth = usb_get_intfdata(intf);
 
 942         dbg("Suspending device");
 
 943         spin_lock_irqsave(&kaweth->device_lock, flags);
 
 944         kaweth->status |= KAWETH_STATUS_SUSPENDING;
 
 945         spin_unlock_irqrestore(&kaweth->device_lock, flags);
 
 947         kaweth_kill_urbs(kaweth);
 
 951 /****************************************************************
 
 953  ****************************************************************/
 
 954 static int kaweth_resume(struct usb_interface *intf)
 
 956         struct kaweth_device *kaweth = usb_get_intfdata(intf);
 
 959         dbg("Resuming device");
 
 960         spin_lock_irqsave(&kaweth->device_lock, flags);
 
 961         kaweth->status &= ~KAWETH_STATUS_SUSPENDING;
 
 962         spin_unlock_irqrestore(&kaweth->device_lock, flags);
 
 966         kaweth_resubmit_rx_urb(kaweth, GFP_NOIO);
 
 967         kaweth_resubmit_int_urb(kaweth, GFP_NOIO);
 
 972 /****************************************************************
 
 974  ****************************************************************/
 
 975 static int kaweth_probe(
 
 976                 struct usb_interface *intf,
 
 977                 const struct usb_device_id *id      /* from id_table */
 
 980         struct usb_device *dev = interface_to_usbdev(intf);
 
 981         struct kaweth_device *kaweth;
 
 982         struct net_device *netdev;
 
 983         const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
 
 986         dbg("Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x",
 
 988                  le16_to_cpu(dev->descriptor.idVendor),
 
 989                  le16_to_cpu(dev->descriptor.idProduct),
 
 990                  le16_to_cpu(dev->descriptor.bcdDevice));
 
 992         dbg("Device at %p", dev);
 
 994         dbg("Descriptor length: %x type: %x",
 
 995                  (int)dev->descriptor.bLength,
 
 996                  (int)dev->descriptor.bDescriptorType);
 
 998         netdev = alloc_etherdev(sizeof(*kaweth));
 
1002         kaweth = netdev_priv(netdev);
 
1004         kaweth->net = netdev;
 
1006         spin_lock_init(&kaweth->device_lock);
 
1007         init_waitqueue_head(&kaweth->term_wait);
 
1011         kaweth_reset(kaweth);
 
1014          * If high byte of bcdDevice is nonzero, firmware is already
 
1015          * downloaded. Don't try to do it again, or we'll hang the device.
 
1018         if (le16_to_cpu(dev->descriptor.bcdDevice) >> 8) {
 
1019                 info("Firmware present in device.");
 
1021                 /* Download the firmware */
 
1022                 info("Downloading firmware...");
 
1023                 kaweth->firmware_buf = (__u8 *)__get_free_page(GFP_KERNEL);
 
1024                 if ((result = kaweth_download_firmware(kaweth,
 
1025                                                       "kaweth/new_code.bin",
 
1028                         err("Error downloading firmware (%d)", result);
 
1032                 if ((result = kaweth_download_firmware(kaweth,
 
1033                                                       "kaweth/new_code_fix.bin",
 
1036                         err("Error downloading firmware fix (%d)", result);
 
1040                 if ((result = kaweth_download_firmware(kaweth,
 
1041                                                       "kaweth/trigger_code.bin",
 
1044                         err("Error downloading trigger code (%d)", result);
 
1049                 if ((result = kaweth_download_firmware(kaweth,
 
1050                                                       "kaweth/trigger_code_fix.bin",
 
1053                         err("Error downloading trigger code fix (%d)", result);
 
1058                 if ((result = kaweth_trigger_firmware(kaweth, 126)) < 0) {
 
1059                         err("Error triggering firmware (%d)", result);
 
1063                 /* Device will now disappear for a moment...  */
 
1064                 info("Firmware loaded.  I'll be back...");
 
1066                 free_page((unsigned long)kaweth->firmware_buf);
 
1067                 free_netdev(netdev);
 
1071         result = kaweth_read_configuration(kaweth);
 
1074                 err("Error reading configuration (%d), no net device created", result);
 
1075                 goto err_free_netdev;
 
1078         info("Statistics collection: %x", kaweth->configuration.statistics_mask);
 
1079         info("Multicast filter limit: %x", kaweth->configuration.max_multicast_filters & ((1 << 15) - 1));
 
1080         info("MTU: %d", le16_to_cpu(kaweth->configuration.segment_size));
 
1081         info("Read MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
 
1082                  (int)kaweth->configuration.hw_addr[0],
 
1083                  (int)kaweth->configuration.hw_addr[1],
 
1084                  (int)kaweth->configuration.hw_addr[2],
 
1085                  (int)kaweth->configuration.hw_addr[3],
 
1086                  (int)kaweth->configuration.hw_addr[4],
 
1087                  (int)kaweth->configuration.hw_addr[5]);
 
1089         if(!memcmp(&kaweth->configuration.hw_addr,
 
1091                    sizeof(bcast_addr))) {
 
1092                 err("Firmware not functioning properly, no net device created");
 
1093                 goto err_free_netdev;
 
1096         if(kaweth_set_urb_size(kaweth, KAWETH_BUF_SIZE) < 0) {
 
1097                 dbg("Error setting URB size");
 
1098                 goto err_free_netdev;
 
1101         if(kaweth_set_sofs_wait(kaweth, KAWETH_SOFS_TO_WAIT) < 0) {
 
1102                 err("Error setting SOFS wait");
 
1103                 goto err_free_netdev;
 
1106         result = kaweth_set_receive_filter(kaweth,
 
1107                                            KAWETH_PACKET_FILTER_DIRECTED |
 
1108                                            KAWETH_PACKET_FILTER_BROADCAST |
 
1109                                            KAWETH_PACKET_FILTER_MULTICAST);
 
1112                 err("Error setting receive filter");
 
1113                 goto err_free_netdev;
 
1116         dbg("Initializing net device.");
 
1118         kaweth->intf = intf;
 
1120         kaweth->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 
1121         if (!kaweth->tx_urb)
 
1122                 goto err_free_netdev;
 
1123         kaweth->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
 
1124         if (!kaweth->rx_urb)
 
1126         kaweth->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
 
1127         if (!kaweth->irq_urb)
 
1130         kaweth->intbuffer = usb_buffer_alloc(   kaweth->dev,
 
1133                                                 &kaweth->intbufferhandle);
 
1134         if (!kaweth->intbuffer)
 
1135                 goto err_tx_and_rx_and_irq;
 
1136         kaweth->rx_buf = usb_buffer_alloc(      kaweth->dev,
 
1139                                                 &kaweth->rxbufferhandle);
 
1140         if (!kaweth->rx_buf)
 
1141                 goto err_all_but_rxbuf;
 
1143         memcpy(netdev->broadcast, &bcast_addr, sizeof(bcast_addr));
 
1144         memcpy(netdev->dev_addr, &kaweth->configuration.hw_addr,
 
1145                sizeof(kaweth->configuration.hw_addr));
 
1147         netdev->open = kaweth_open;
 
1148         netdev->stop = kaweth_close;
 
1150         netdev->watchdog_timeo = KAWETH_TX_TIMEOUT;
 
1151         netdev->tx_timeout = kaweth_tx_timeout;
 
1153         netdev->hard_start_xmit = kaweth_start_xmit;
 
1154         netdev->set_multicast_list = kaweth_set_rx_mode;
 
1155         netdev->get_stats = kaweth_netdev_stats;
 
1156         netdev->mtu = le16_to_cpu(kaweth->configuration.segment_size);
 
1157         SET_ETHTOOL_OPS(netdev, &ops);
 
1159         /* kaweth is zeroed as part of alloc_netdev */
 
1161         INIT_DELAYED_WORK(&kaweth->lowmem_work, kaweth_resubmit_tl);
 
1163         usb_set_intfdata(intf, kaweth);
 
1166 // dma_supported() is deeply broken on almost all architectures
 
1167         if (dma_supported (&intf->dev, 0xffffffffffffffffULL))
 
1168                 kaweth->net->features |= NETIF_F_HIGHDMA;
 
1171         SET_NETDEV_DEV(netdev, &intf->dev);
 
1172         if (register_netdev(netdev) != 0) {
 
1173                 err("Error registering netdev.");
 
1177         info("kaweth interface created at %s", kaweth->net->name);
 
1179         dbg("Kaweth probe returning.");
 
1184         usb_set_intfdata(intf, NULL);
 
1185         usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle);
 
1187         usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle);
 
1188 err_tx_and_rx_and_irq:
 
1189         usb_free_urb(kaweth->irq_urb);
 
1191         usb_free_urb(kaweth->rx_urb);
 
1193         usb_free_urb(kaweth->tx_urb);
 
1195         free_netdev(netdev);
 
1200 /****************************************************************
 
1202  ****************************************************************/
 
1203 static void kaweth_disconnect(struct usb_interface *intf)
 
1205         struct kaweth_device *kaweth = usb_get_intfdata(intf);
 
1206         struct net_device *netdev;
 
1208         info("Unregistering");
 
1210         usb_set_intfdata(intf, NULL);
 
1212                 warn("unregistering non-existant device");
 
1215         netdev = kaweth->net;
 
1217         dbg("Unregistering net device");
 
1218         unregister_netdev(netdev);
 
1220         usb_free_urb(kaweth->rx_urb);
 
1221         usb_free_urb(kaweth->tx_urb);
 
1222         usb_free_urb(kaweth->irq_urb);
 
1224         usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle);
 
1225         usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle);
 
1227         free_netdev(netdev);
 
1231 // FIXME this completion stuff is a modified clone of
 
1232 // an OLD version of some stuff in usb.c ...
 
1233 struct usb_api_data {
 
1234         wait_queue_head_t wqh;
 
1238 /*-------------------------------------------------------------------*
 
1239  * completion handler for compatibility wrappers (sync control/bulk) *
 
1240  *-------------------------------------------------------------------*/
 
1241 static void usb_api_blocking_completion(struct urb *urb)
 
1243         struct usb_api_data *awd = (struct usb_api_data *)urb->context;
 
1249 /*-------------------------------------------------------------------*
 
1250  *                         COMPATIBILITY STUFF                       *
 
1251  *-------------------------------------------------------------------*/
 
1253 // Starts urb and waits for completion or timeout
 
1254 static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
 
1256         struct usb_api_data awd;
 
1259         init_waitqueue_head(&awd.wqh);
 
1262         urb->context = &awd;
 
1263         status = usb_submit_urb(urb, GFP_NOIO);
 
1265                 // something went wrong
 
1270         if (!wait_event_timeout(awd.wqh, awd.done, timeout)) {
 
1272                 warn("usb_control/bulk_msg: timeout");
 
1273                 usb_kill_urb(urb);  // remove urb safely
 
1274                 status = -ETIMEDOUT;
 
1277                 status = urb->status;
 
1280         if (actual_length) {
 
1281                 *actual_length = urb->actual_length;
 
1288 /*-------------------------------------------------------------------*/
 
1289 // returns status (negative) or length (positive)
 
1290 static int kaweth_internal_control_msg(struct usb_device *usb_dev,
 
1292                                        struct usb_ctrlrequest *cmd, void *data,
 
1293                                        int len, int timeout)
 
1297         int length = 0; /* shut up GCC */
 
1299         urb = usb_alloc_urb(0, GFP_NOIO);
 
1303         usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data,
 
1304                          len, usb_api_blocking_completion, NULL);
 
1306         retv = usb_start_wait_urb(urb, timeout, &length);
 
1316 /****************************************************************
 
1318  ****************************************************************/
 
1319 static int __init kaweth_init(void)
 
1321         dbg("Driver loading");
 
1322         return usb_register(&kaweth_driver);
 
1325 /****************************************************************
 
1327  ****************************************************************/
 
1328 static void __exit kaweth_exit(void)
 
1330         usb_deregister(&kaweth_driver);
 
1333 module_init(kaweth_init);
 
1334 module_exit(kaweth_exit);