root/drivers/net/usb/pegasus.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. async_ctrl_callback
  2. get_registers
  3. set_registers
  4. set_register
  5. update_eth_regs_async
  6. __mii_op
  7. read_mii_word
  8. write_mii_word
  9. mdio_read
  10. mdio_write
  11. read_eprom_word
  12. enable_eprom_write
  13. disable_eprom_write
  14. write_eprom_word
  15. get_node_id
  16. set_ethernet_addr
  17. reset_mac
  18. enable_net_traffic
  19. read_bulk_callback
  20. rx_fixup
  21. write_bulk_callback
  22. intr_callback
  23. pegasus_tx_timeout
  24. pegasus_start_xmit
  25. disable_net_traffic
  26. get_interrupt_interval
  27. set_carrier
  28. free_all_urbs
  29. unlink_all_urbs
  30. alloc_urbs
  31. pegasus_open
  32. pegasus_close
  33. pegasus_get_drvinfo
  34. pegasus_get_wol
  35. pegasus_set_wol
  36. pegasus_reset_wol
  37. pegasus_get_link_ksettings
  38. pegasus_set_link_ksettings
  39. pegasus_nway_reset
  40. pegasus_get_link
  41. pegasus_get_msglevel
  42. pegasus_set_msglevel
  43. pegasus_ioctl
  44. pegasus_set_multicast
  45. mii_phy_probe
  46. setup_pegasus_II
  47. check_carrier
  48. pegasus_blacklisted
  49. pegasus_dec_workqueue
  50. pegasus_probe
  51. pegasus_disconnect
  52. pegasus_suspend
  53. pegasus_resume
  54. parse_id
  55. pegasus_init
  56. pegasus_exit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *  Copyright (c) 1999-2013 Petko Manolov (petkan@nucleusys.com)
   4  *
   5  *      ChangeLog:
   6  *              ....    Most of the time spent on reading sources & docs.
   7  *              v0.2.x  First official release for the Linux kernel.
   8  *              v0.3.0  Beutified and structured, some bugs fixed.
   9  *              v0.3.x  URBifying bulk requests and bugfixing. First relatively
  10  *                      stable release. Still can touch device's registers only
  11  *                      from top-halves.
  12  *              v0.4.0  Control messages remained unurbified are now URBs.
  13  *                      Now we can touch the HW at any time.
  14  *              v0.4.9  Control urbs again use process context to wait. Argh...
  15  *                      Some long standing bugs (enable_net_traffic) fixed.
  16  *                      Also nasty trick about resubmiting control urb from
  17  *                      interrupt context used. Please let me know how it
  18  *                      behaves. Pegasus II support added since this version.
  19  *                      TODO: suppressing HCD warnings spewage on disconnect.
  20  *              v0.4.13 Ethernet address is now set at probe(), not at open()
  21  *                      time as this seems to break dhcpd.
  22  *              v0.5.0  branch to 2.5.x kernels
  23  *              v0.5.1  ethtool support added
  24  *              v0.5.5  rx socket buffers are in a pool and the their allocation
  25  *                      is out of the interrupt routine.
  26  *              ...
  27  *              v0.9.3  simplified [get|set]_register(s), async update registers
  28  *                      logic revisited, receive skb_pool removed.
  29  */
  30 
  31 #include <linux/sched.h>
  32 #include <linux/slab.h>
  33 #include <linux/init.h>
  34 #include <linux/delay.h>
  35 #include <linux/netdevice.h>
  36 #include <linux/etherdevice.h>
  37 #include <linux/ethtool.h>
  38 #include <linux/mii.h>
  39 #include <linux/usb.h>
  40 #include <linux/module.h>
  41 #include <asm/byteorder.h>
  42 #include <linux/uaccess.h>
  43 #include "pegasus.h"
  44 
  45 /*
  46  * Version Information
  47  */
  48 #define DRIVER_VERSION "v0.9.3 (2013/04/25)"
  49 #define DRIVER_AUTHOR "Petko Manolov <petkan@nucleusys.com>"
  50 #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver"
  51 
  52 static const char driver_name[] = "pegasus";
  53 
  54 #undef  PEGASUS_WRITE_EEPROM
  55 #define BMSR_MEDIA      (BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | \
  56                         BMSR_100FULL | BMSR_ANEGCAPABLE)
  57 
  58 static bool loopback;
  59 static bool mii_mode;
  60 static char *devid;
  61 
  62 static struct usb_eth_dev usb_dev_id[] = {
  63 #define PEGASUS_DEV(pn, vid, pid, flags)        \
  64         {.name = pn, .vendor = vid, .device = pid, .private = flags},
  65 #define PEGASUS_DEV_CLASS(pn, vid, pid, dclass, flags) \
  66         PEGASUS_DEV(pn, vid, pid, flags)
  67 #include "pegasus.h"
  68 #undef  PEGASUS_DEV
  69 #undef  PEGASUS_DEV_CLASS
  70         {NULL, 0, 0, 0},
  71         {NULL, 0, 0, 0}
  72 };
  73 
  74 static struct usb_device_id pegasus_ids[] = {
  75 #define PEGASUS_DEV(pn, vid, pid, flags) \
  76         {.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = vid, .idProduct = pid},
  77 /*
  78  * The Belkin F8T012xx1 bluetooth adaptor has the same vendor and product
  79  * IDs as the Belkin F5D5050, so we need to teach the pegasus driver to
  80  * ignore adaptors belonging to the "Wireless" class 0xE0. For this one
  81  * case anyway, seeing as the pegasus is for "Wired" adaptors.
  82  */
  83 #define PEGASUS_DEV_CLASS(pn, vid, pid, dclass, flags) \
  84         {.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_CLASS), \
  85         .idVendor = vid, .idProduct = pid, .bDeviceClass = dclass},
  86 #include "pegasus.h"
  87 #undef  PEGASUS_DEV
  88 #undef  PEGASUS_DEV_CLASS
  89         {},
  90         {}
  91 };
  92 
  93 MODULE_AUTHOR(DRIVER_AUTHOR);
  94 MODULE_DESCRIPTION(DRIVER_DESC);
  95 MODULE_LICENSE("GPL");
  96 module_param(loopback, bool, 0);
  97 module_param(mii_mode, bool, 0);
  98 module_param(devid, charp, 0);
  99 MODULE_PARM_DESC(loopback, "Enable MAC loopback mode (bit 0)");
 100 MODULE_PARM_DESC(mii_mode, "Enable HomePNA mode (bit 0),default=MII mode = 0");
 101 MODULE_PARM_DESC(devid, "The format is: 'DEV_name:VendorID:DeviceID:Flags'");
 102 
 103 /* use ethtool to change the level for any given device */
 104 static int msg_level = -1;
 105 module_param(msg_level, int, 0);
 106 MODULE_PARM_DESC(msg_level, "Override default message level");
 107 
 108 MODULE_DEVICE_TABLE(usb, pegasus_ids);
 109 static const struct net_device_ops pegasus_netdev_ops;
 110 
 111 /*****/
 112 
 113 static void async_ctrl_callback(struct urb *urb)
 114 {
 115         struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
 116         int status = urb->status;
 117 
 118         if (status < 0)
 119                 dev_dbg(&urb->dev->dev, "%s failed with %d", __func__, status);
 120         kfree(req);
 121         usb_free_urb(urb);
 122 }
 123 
 124 static int get_registers(pegasus_t *pegasus, __u16 indx, __u16 size, void *data)
 125 {
 126         u8 *buf;
 127         int ret;
 128 
 129         buf = kmalloc(size, GFP_NOIO);
 130         if (!buf)
 131                 return -ENOMEM;
 132 
 133         ret = usb_control_msg(pegasus->usb, usb_rcvctrlpipe(pegasus->usb, 0),
 134                               PEGASUS_REQ_GET_REGS, PEGASUS_REQT_READ, 0,
 135                               indx, buf, size, 1000);
 136         if (ret < 0)
 137                 netif_dbg(pegasus, drv, pegasus->net,
 138                           "%s returned %d\n", __func__, ret);
 139         else if (ret <= size)
 140                 memcpy(data, buf, ret);
 141         kfree(buf);
 142         return ret;
 143 }
 144 
 145 static int set_registers(pegasus_t *pegasus, __u16 indx, __u16 size,
 146                          const void *data)
 147 {
 148         u8 *buf;
 149         int ret;
 150 
 151         buf = kmemdup(data, size, GFP_NOIO);
 152         if (!buf)
 153                 return -ENOMEM;
 154 
 155         ret = usb_control_msg(pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0),
 156                               PEGASUS_REQ_SET_REGS, PEGASUS_REQT_WRITE, 0,
 157                               indx, buf, size, 100);
 158         if (ret < 0)
 159                 netif_dbg(pegasus, drv, pegasus->net,
 160                           "%s returned %d\n", __func__, ret);
 161         kfree(buf);
 162         return ret;
 163 }
 164 
 165 static int set_register(pegasus_t *pegasus, __u16 indx, __u8 data)
 166 {
 167         u8 *buf;
 168         int ret;
 169 
 170         buf = kmemdup(&data, 1, GFP_NOIO);
 171         if (!buf)
 172                 return -ENOMEM;
 173 
 174         ret = usb_control_msg(pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0),
 175                               PEGASUS_REQ_SET_REG, PEGASUS_REQT_WRITE, data,
 176                               indx, buf, 1, 1000);
 177         if (ret < 0)
 178                 netif_dbg(pegasus, drv, pegasus->net,
 179                           "%s returned %d\n", __func__, ret);
 180         kfree(buf);
 181         return ret;
 182 }
 183 
 184 static int update_eth_regs_async(pegasus_t *pegasus)
 185 {
 186         int ret = -ENOMEM;
 187         struct urb *async_urb;
 188         struct usb_ctrlrequest *req;
 189 
 190         req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
 191         if (req == NULL)
 192                 return ret;
 193 
 194         async_urb = usb_alloc_urb(0, GFP_ATOMIC);
 195         if (async_urb == NULL) {
 196                 kfree(req);
 197                 return ret;
 198         }
 199         req->bRequestType = PEGASUS_REQT_WRITE;
 200         req->bRequest = PEGASUS_REQ_SET_REGS;
 201         req->wValue = cpu_to_le16(0);
 202         req->wIndex = cpu_to_le16(EthCtrl0);
 203         req->wLength = cpu_to_le16(3);
 204 
 205         usb_fill_control_urb(async_urb, pegasus->usb,
 206                              usb_sndctrlpipe(pegasus->usb, 0), (void *)req,
 207                              pegasus->eth_regs, 3, async_ctrl_callback, req);
 208 
 209         ret = usb_submit_urb(async_urb, GFP_ATOMIC);
 210         if (ret) {
 211                 if (ret == -ENODEV)
 212                         netif_device_detach(pegasus->net);
 213                 netif_err(pegasus, drv, pegasus->net,
 214                           "%s returned %d\n", __func__, ret);
 215         }
 216         return ret;
 217 }
 218 
 219 static int __mii_op(pegasus_t *p, __u8 phy, __u8 indx, __u16 *regd, __u8 cmd)
 220 {
 221         int i;
 222         __u8 data[4] = { phy, 0, 0, indx };
 223         __le16 regdi;
 224         int ret = -ETIMEDOUT;
 225 
 226         if (cmd & PHY_WRITE) {
 227                 __le16 *t = (__le16 *) & data[1];
 228                 *t = cpu_to_le16(*regd);
 229         }
 230         set_register(p, PhyCtrl, 0);
 231         set_registers(p, PhyAddr, sizeof(data), data);
 232         set_register(p, PhyCtrl, (indx | cmd));
 233         for (i = 0; i < REG_TIMEOUT; i++) {
 234                 ret = get_registers(p, PhyCtrl, 1, data);
 235                 if (ret < 0)
 236                         goto fail;
 237                 if (data[0] & PHY_DONE)
 238                         break;
 239         }
 240         if (i >= REG_TIMEOUT)
 241                 goto fail;
 242         if (cmd & PHY_READ) {
 243                 ret = get_registers(p, PhyData, 2, &regdi);
 244                 *regd = le16_to_cpu(regdi);
 245                 return ret;
 246         }
 247         return 0;
 248 fail:
 249         netif_dbg(p, drv, p->net, "%s failed\n", __func__);
 250         return ret;
 251 }
 252 
 253 /* Returns non-negative int on success, error on failure */
 254 static int read_mii_word(pegasus_t *pegasus, __u8 phy, __u8 indx, __u16 *regd)
 255 {
 256         return __mii_op(pegasus, phy, indx, regd, PHY_READ);
 257 }
 258 
 259 /* Returns zero on success, error on failure */
 260 static int write_mii_word(pegasus_t *pegasus, __u8 phy, __u8 indx, __u16 *regd)
 261 {
 262         return __mii_op(pegasus, phy, indx, regd, PHY_WRITE);
 263 }
 264 
 265 static int mdio_read(struct net_device *dev, int phy_id, int loc)
 266 {
 267         pegasus_t *pegasus = netdev_priv(dev);
 268         u16 res;
 269 
 270         read_mii_word(pegasus, phy_id, loc, &res);
 271         return (int)res;
 272 }
 273 
 274 static void mdio_write(struct net_device *dev, int phy_id, int loc, int val)
 275 {
 276         pegasus_t *pegasus = netdev_priv(dev);
 277         u16 data = val;
 278 
 279         write_mii_word(pegasus, phy_id, loc, &data);
 280 }
 281 
 282 static int read_eprom_word(pegasus_t *pegasus, __u8 index, __u16 *retdata)
 283 {
 284         int i;
 285         __u8 tmp = 0;
 286         __le16 retdatai;
 287         int ret;
 288 
 289         set_register(pegasus, EpromCtrl, 0);
 290         set_register(pegasus, EpromOffset, index);
 291         set_register(pegasus, EpromCtrl, EPROM_READ);
 292 
 293         for (i = 0; i < REG_TIMEOUT; i++) {
 294                 ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
 295                 if (tmp & EPROM_DONE)
 296                         break;
 297                 if (ret == -ESHUTDOWN)
 298                         goto fail;
 299         }
 300         if (i >= REG_TIMEOUT)
 301                 goto fail;
 302 
 303         ret = get_registers(pegasus, EpromData, 2, &retdatai);
 304         *retdata = le16_to_cpu(retdatai);
 305         return ret;
 306 
 307 fail:
 308         netif_warn(pegasus, drv, pegasus->net, "%s failed\n", __func__);
 309         return -ETIMEDOUT;
 310 }
 311 
 312 #ifdef  PEGASUS_WRITE_EEPROM
 313 static inline void enable_eprom_write(pegasus_t *pegasus)
 314 {
 315         __u8 tmp;
 316 
 317         get_registers(pegasus, EthCtrl2, 1, &tmp);
 318         set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE);
 319 }
 320 
 321 static inline void disable_eprom_write(pegasus_t *pegasus)
 322 {
 323         __u8 tmp;
 324 
 325         get_registers(pegasus, EthCtrl2, 1, &tmp);
 326         set_register(pegasus, EpromCtrl, 0);
 327         set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE);
 328 }
 329 
 330 static int write_eprom_word(pegasus_t *pegasus, __u8 index, __u16 data)
 331 {
 332         int i;
 333         __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE };
 334         int ret;
 335         __le16 le_data = cpu_to_le16(data);
 336 
 337         set_registers(pegasus, EpromOffset, 4, d);
 338         enable_eprom_write(pegasus);
 339         set_register(pegasus, EpromOffset, index);
 340         set_registers(pegasus, EpromData, 2, &le_data);
 341         set_register(pegasus, EpromCtrl, EPROM_WRITE);
 342 
 343         for (i = 0; i < REG_TIMEOUT; i++) {
 344                 ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
 345                 if (ret == -ESHUTDOWN)
 346                         goto fail;
 347                 if (tmp & EPROM_DONE)
 348                         break;
 349         }
 350         disable_eprom_write(pegasus);
 351         if (i >= REG_TIMEOUT)
 352                 goto fail;
 353 
 354         return ret;
 355 
 356 fail:
 357         netif_warn(pegasus, drv, pegasus->net, "%s failed\n", __func__);
 358         return -ETIMEDOUT;
 359 }
 360 #endif                          /* PEGASUS_WRITE_EEPROM */
 361 
 362 static inline void get_node_id(pegasus_t *pegasus, __u8 *id)
 363 {
 364         int i;
 365         __u16 w16;
 366 
 367         for (i = 0; i < 3; i++) {
 368                 read_eprom_word(pegasus, i, &w16);
 369                 ((__le16 *) id)[i] = cpu_to_le16(w16);
 370         }
 371 }
 372 
 373 static void set_ethernet_addr(pegasus_t *pegasus)
 374 {
 375         __u8 node_id[6];
 376 
 377         if (pegasus->features & PEGASUS_II) {
 378                 get_registers(pegasus, 0x10, sizeof(node_id), node_id);
 379         } else {
 380                 get_node_id(pegasus, node_id);
 381                 set_registers(pegasus, EthID, sizeof(node_id), node_id);
 382         }
 383         memcpy(pegasus->net->dev_addr, node_id, sizeof(node_id));
 384 }
 385 
 386 static inline int reset_mac(pegasus_t *pegasus)
 387 {
 388         __u8 data = 0x8;
 389         int i;
 390 
 391         set_register(pegasus, EthCtrl1, data);
 392         for (i = 0; i < REG_TIMEOUT; i++) {
 393                 get_registers(pegasus, EthCtrl1, 1, &data);
 394                 if (~data & 0x08) {
 395                         if (loopback)
 396                                 break;
 397                         if (mii_mode && (pegasus->features & HAS_HOME_PNA))
 398                                 set_register(pegasus, Gpio1, 0x34);
 399                         else
 400                                 set_register(pegasus, Gpio1, 0x26);
 401                         set_register(pegasus, Gpio0, pegasus->features);
 402                         set_register(pegasus, Gpio0, DEFAULT_GPIO_SET);
 403                         break;
 404                 }
 405         }
 406         if (i == REG_TIMEOUT)
 407                 return -ETIMEDOUT;
 408 
 409         if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
 410             usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
 411                 set_register(pegasus, Gpio0, 0x24);
 412                 set_register(pegasus, Gpio0, 0x26);
 413         }
 414         if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) {
 415                 __u16 auxmode;
 416                 read_mii_word(pegasus, 3, 0x1b, &auxmode);
 417                 auxmode |= 4;
 418                 write_mii_word(pegasus, 3, 0x1b, &auxmode);
 419         }
 420 
 421         return 0;
 422 }
 423 
 424 static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
 425 {
 426         __u16 linkpart;
 427         __u8 data[4];
 428         pegasus_t *pegasus = netdev_priv(dev);
 429         int ret;
 430 
 431         read_mii_word(pegasus, pegasus->phy, MII_LPA, &linkpart);
 432         data[0] = 0xc8; /* TX & RX enable, append status, no CRC */
 433         data[1] = 0;
 434         if (linkpart & (ADVERTISE_100FULL | ADVERTISE_10FULL))
 435                 data[1] |= 0x20;        /* set full duplex */
 436         if (linkpart & (ADVERTISE_100FULL | ADVERTISE_100HALF))
 437                 data[1] |= 0x10;        /* set 100 Mbps */
 438         if (mii_mode)
 439                 data[1] = 0;
 440         data[2] = loopback ? 0x09 : 0x01;
 441 
 442         memcpy(pegasus->eth_regs, data, sizeof(data));
 443         ret = set_registers(pegasus, EthCtrl0, 3, data);
 444 
 445         if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
 446             usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS2 ||
 447             usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
 448                 u16 auxmode;
 449                 read_mii_word(pegasus, 0, 0x1b, &auxmode);
 450                 auxmode |= 4;
 451                 write_mii_word(pegasus, 0, 0x1b, &auxmode);
 452         }
 453 
 454         return ret;
 455 }
 456 
 457 static void read_bulk_callback(struct urb *urb)
 458 {
 459         pegasus_t *pegasus = urb->context;
 460         struct net_device *net;
 461         int rx_status, count = urb->actual_length;
 462         int status = urb->status;
 463         u8 *buf = urb->transfer_buffer;
 464         __u16 pkt_len;
 465 
 466         if (!pegasus)
 467                 return;
 468 
 469         net = pegasus->net;
 470         if (!netif_device_present(net) || !netif_running(net))
 471                 return;
 472 
 473         switch (status) {
 474         case 0:
 475                 break;
 476         case -ETIME:
 477                 netif_dbg(pegasus, rx_err, net, "reset MAC\n");
 478                 pegasus->flags &= ~PEGASUS_RX_BUSY;
 479                 break;
 480         case -EPIPE:            /* stall, or disconnect from TT */
 481                 /* FIXME schedule work to clear the halt */
 482                 netif_warn(pegasus, rx_err, net, "no rx stall recovery\n");
 483                 return;
 484         case -ENOENT:
 485         case -ECONNRESET:
 486         case -ESHUTDOWN:
 487                 netif_dbg(pegasus, ifdown, net, "rx unlink, %d\n", status);
 488                 return;
 489         default:
 490                 netif_dbg(pegasus, rx_err, net, "RX status %d\n", status);
 491                 goto goon;
 492         }
 493 
 494         if (count < 4)
 495                 goto goon;
 496 
 497         rx_status = buf[count - 2];
 498         if (rx_status & 0x1e) {
 499                 netif_dbg(pegasus, rx_err, net,
 500                           "RX packet error %x\n", rx_status);
 501                 net->stats.rx_errors++;
 502                 if (rx_status & 0x06)   /* long or runt */
 503                         net->stats.rx_length_errors++;
 504                 if (rx_status & 0x08)
 505                         net->stats.rx_crc_errors++;
 506                 if (rx_status & 0x10)   /* extra bits   */
 507                         net->stats.rx_frame_errors++;
 508                 goto goon;
 509         }
 510         if (pegasus->chip == 0x8513) {
 511                 pkt_len = le32_to_cpu(*(__le32 *)urb->transfer_buffer);
 512                 pkt_len &= 0x0fff;
 513                 pegasus->rx_skb->data += 2;
 514         } else {
 515                 pkt_len = buf[count - 3] << 8;
 516                 pkt_len += buf[count - 4];
 517                 pkt_len &= 0xfff;
 518                 pkt_len -= 4;
 519         }
 520 
 521         /*
 522          * If the packet is unreasonably long, quietly drop it rather than
 523          * kernel panicing by calling skb_put.
 524          */
 525         if (pkt_len > PEGASUS_MTU)
 526                 goto goon;
 527 
 528         /*
 529          * at this point we are sure pegasus->rx_skb != NULL
 530          * so we go ahead and pass up the packet.
 531          */
 532         skb_put(pegasus->rx_skb, pkt_len);
 533         pegasus->rx_skb->protocol = eth_type_trans(pegasus->rx_skb, net);
 534         netif_rx(pegasus->rx_skb);
 535         net->stats.rx_packets++;
 536         net->stats.rx_bytes += pkt_len;
 537 
 538         if (pegasus->flags & PEGASUS_UNPLUG)
 539                 return;
 540 
 541         pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net, PEGASUS_MTU,
 542                                                       GFP_ATOMIC);
 543 
 544         if (pegasus->rx_skb == NULL)
 545                 goto tl_sched;
 546 goon:
 547         usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
 548                           usb_rcvbulkpipe(pegasus->usb, 1),
 549                           pegasus->rx_skb->data, PEGASUS_MTU,
 550                           read_bulk_callback, pegasus);
 551         rx_status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
 552         if (rx_status == -ENODEV)
 553                 netif_device_detach(pegasus->net);
 554         else if (rx_status) {
 555                 pegasus->flags |= PEGASUS_RX_URB_FAIL;
 556                 goto tl_sched;
 557         } else {
 558                 pegasus->flags &= ~PEGASUS_RX_URB_FAIL;
 559         }
 560 
 561         return;
 562 
 563 tl_sched:
 564         tasklet_schedule(&pegasus->rx_tl);
 565 }
 566 
 567 static void rx_fixup(unsigned long data)
 568 {
 569         pegasus_t *pegasus;
 570         int status;
 571 
 572         pegasus = (pegasus_t *) data;
 573         if (pegasus->flags & PEGASUS_UNPLUG)
 574                 return;
 575 
 576         if (pegasus->flags & PEGASUS_RX_URB_FAIL)
 577                 if (pegasus->rx_skb)
 578                         goto try_again;
 579         if (pegasus->rx_skb == NULL)
 580                 pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net,
 581                                                               PEGASUS_MTU,
 582                                                               GFP_ATOMIC);
 583         if (pegasus->rx_skb == NULL) {
 584                 netif_warn(pegasus, rx_err, pegasus->net, "low on memory\n");
 585                 tasklet_schedule(&pegasus->rx_tl);
 586                 return;
 587         }
 588         usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
 589                           usb_rcvbulkpipe(pegasus->usb, 1),
 590                           pegasus->rx_skb->data, PEGASUS_MTU,
 591                           read_bulk_callback, pegasus);
 592 try_again:
 593         status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
 594         if (status == -ENODEV)
 595                 netif_device_detach(pegasus->net);
 596         else if (status) {
 597                 pegasus->flags |= PEGASUS_RX_URB_FAIL;
 598                 tasklet_schedule(&pegasus->rx_tl);
 599         } else {
 600                 pegasus->flags &= ~PEGASUS_RX_URB_FAIL;
 601         }
 602 }
 603 
 604 static void write_bulk_callback(struct urb *urb)
 605 {
 606         pegasus_t *pegasus = urb->context;
 607         struct net_device *net;
 608         int status = urb->status;
 609 
 610         if (!pegasus)
 611                 return;
 612 
 613         net = pegasus->net;
 614 
 615         if (!netif_device_present(net) || !netif_running(net))
 616                 return;
 617 
 618         switch (status) {
 619         case -EPIPE:
 620                 /* FIXME schedule_work() to clear the tx halt */
 621                 netif_stop_queue(net);
 622                 netif_warn(pegasus, tx_err, net, "no tx stall recovery\n");
 623                 return;
 624         case -ENOENT:
 625         case -ECONNRESET:
 626         case -ESHUTDOWN:
 627                 netif_dbg(pegasus, ifdown, net, "tx unlink, %d\n", status);
 628                 return;
 629         default:
 630                 netif_info(pegasus, tx_err, net, "TX status %d\n", status);
 631                 /* FALL THROUGH */
 632         case 0:
 633                 break;
 634         }
 635 
 636         netif_trans_update(net); /* prevent tx timeout */
 637         netif_wake_queue(net);
 638 }
 639 
 640 static void intr_callback(struct urb *urb)
 641 {
 642         pegasus_t *pegasus = urb->context;
 643         struct net_device *net;
 644         int res, status = urb->status;
 645 
 646         if (!pegasus)
 647                 return;
 648         net = pegasus->net;
 649 
 650         switch (status) {
 651         case 0:
 652                 break;
 653         case -ECONNRESET:       /* unlink */
 654         case -ENOENT:
 655         case -ESHUTDOWN:
 656                 return;
 657         default:
 658                 /* some Pegasus-I products report LOTS of data
 659                  * toggle errors... avoid log spamming
 660                  */
 661                 netif_dbg(pegasus, timer, net, "intr status %d\n", status);
 662         }
 663 
 664         if (urb->actual_length >= 6) {
 665                 u8 *d = urb->transfer_buffer;
 666 
 667                 /* byte 0 == tx_status1, reg 2B */
 668                 if (d[0] & (TX_UNDERRUN|EXCESSIVE_COL
 669                                         |LATE_COL|JABBER_TIMEOUT)) {
 670                         net->stats.tx_errors++;
 671                         if (d[0] & TX_UNDERRUN)
 672                                 net->stats.tx_fifo_errors++;
 673                         if (d[0] & (EXCESSIVE_COL | JABBER_TIMEOUT))
 674                                 net->stats.tx_aborted_errors++;
 675                         if (d[0] & LATE_COL)
 676                                 net->stats.tx_window_errors++;
 677                 }
 678 
 679                 /* d[5].LINK_STATUS lies on some adapters.
 680                  * d[0].NO_CARRIER kicks in only with failed TX.
 681                  * ... so monitoring with MII may be safest.
 682                  */
 683 
 684                 /* bytes 3-4 == rx_lostpkt, reg 2E/2F */
 685                 net->stats.rx_missed_errors += ((d[3] & 0x7f) << 8) | d[4];
 686         }
 687 
 688         res = usb_submit_urb(urb, GFP_ATOMIC);
 689         if (res == -ENODEV)
 690                 netif_device_detach(pegasus->net);
 691         if (res)
 692                 netif_err(pegasus, timer, net,
 693                           "can't resubmit interrupt urb, %d\n", res);
 694 }
 695 
 696 static void pegasus_tx_timeout(struct net_device *net)
 697 {
 698         pegasus_t *pegasus = netdev_priv(net);
 699         netif_warn(pegasus, timer, net, "tx timeout\n");
 700         usb_unlink_urb(pegasus->tx_urb);
 701         net->stats.tx_errors++;
 702 }
 703 
 704 static netdev_tx_t pegasus_start_xmit(struct sk_buff *skb,
 705                                             struct net_device *net)
 706 {
 707         pegasus_t *pegasus = netdev_priv(net);
 708         int count = ((skb->len + 2) & 0x3f) ? skb->len + 2 : skb->len + 3;
 709         int res;
 710         __u16 l16 = skb->len;
 711 
 712         netif_stop_queue(net);
 713 
 714         ((__le16 *) pegasus->tx_buff)[0] = cpu_to_le16(l16);
 715         skb_copy_from_linear_data(skb, pegasus->tx_buff + 2, skb->len);
 716         usb_fill_bulk_urb(pegasus->tx_urb, pegasus->usb,
 717                           usb_sndbulkpipe(pegasus->usb, 2),
 718                           pegasus->tx_buff, count,
 719                           write_bulk_callback, pegasus);
 720         if ((res = usb_submit_urb(pegasus->tx_urb, GFP_ATOMIC))) {
 721                 netif_warn(pegasus, tx_err, net, "fail tx, %d\n", res);
 722                 switch (res) {
 723                 case -EPIPE:            /* stall, or disconnect from TT */
 724                         /* cleanup should already have been scheduled */
 725                         break;
 726                 case -ENODEV:           /* disconnect() upcoming */
 727                 case -EPERM:
 728                         netif_device_detach(pegasus->net);
 729                         break;
 730                 default:
 731                         net->stats.tx_errors++;
 732                         netif_start_queue(net);
 733                 }
 734         } else {
 735                 net->stats.tx_packets++;
 736                 net->stats.tx_bytes += skb->len;
 737         }
 738         dev_kfree_skb(skb);
 739 
 740         return NETDEV_TX_OK;
 741 }
 742 
 743 static inline void disable_net_traffic(pegasus_t *pegasus)
 744 {
 745         __le16 tmp = cpu_to_le16(0);
 746 
 747         set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp);
 748 }
 749 
 750 static inline void get_interrupt_interval(pegasus_t *pegasus)
 751 {
 752         u16 data;
 753         u8 interval;
 754 
 755         read_eprom_word(pegasus, 4, &data);
 756         interval = data >> 8;
 757         if (pegasus->usb->speed != USB_SPEED_HIGH) {
 758                 if (interval < 0x80) {
 759                         netif_info(pegasus, timer, pegasus->net,
 760                                    "intr interval changed from %ums to %ums\n",
 761                                    interval, 0x80);
 762                         interval = 0x80;
 763                         data = (data & 0x00FF) | ((u16)interval << 8);
 764 #ifdef PEGASUS_WRITE_EEPROM
 765                         write_eprom_word(pegasus, 4, data);
 766 #endif
 767                 }
 768         }
 769         pegasus->intr_interval = interval;
 770 }
 771 
 772 static void set_carrier(struct net_device *net)
 773 {
 774         pegasus_t *pegasus = netdev_priv(net);
 775         u16 tmp;
 776 
 777         if (read_mii_word(pegasus, pegasus->phy, MII_BMSR, &tmp))
 778                 return;
 779 
 780         if (tmp & BMSR_LSTATUS)
 781                 netif_carrier_on(net);
 782         else
 783                 netif_carrier_off(net);
 784 }
 785 
 786 static void free_all_urbs(pegasus_t *pegasus)
 787 {
 788         usb_free_urb(pegasus->intr_urb);
 789         usb_free_urb(pegasus->tx_urb);
 790         usb_free_urb(pegasus->rx_urb);
 791 }
 792 
 793 static void unlink_all_urbs(pegasus_t *pegasus)
 794 {
 795         usb_kill_urb(pegasus->intr_urb);
 796         usb_kill_urb(pegasus->tx_urb);
 797         usb_kill_urb(pegasus->rx_urb);
 798 }
 799 
 800 static int alloc_urbs(pegasus_t *pegasus)
 801 {
 802         int res = -ENOMEM;
 803 
 804         pegasus->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
 805         if (!pegasus->rx_urb) {
 806                 return res;
 807         }
 808         pegasus->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 809         if (!pegasus->tx_urb) {
 810                 usb_free_urb(pegasus->rx_urb);
 811                 return res;
 812         }
 813         pegasus->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
 814         if (!pegasus->intr_urb) {
 815                 usb_free_urb(pegasus->tx_urb);
 816                 usb_free_urb(pegasus->rx_urb);
 817                 return res;
 818         }
 819 
 820         return 0;
 821 }
 822 
 823 static int pegasus_open(struct net_device *net)
 824 {
 825         pegasus_t *pegasus = netdev_priv(net);
 826         int res=-ENOMEM;
 827 
 828         if (pegasus->rx_skb == NULL)
 829                 pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net,
 830                                                               PEGASUS_MTU,
 831                                                               GFP_KERNEL);
 832         if (!pegasus->rx_skb)
 833                 goto exit;
 834 
 835         res = set_registers(pegasus, EthID, 6, net->dev_addr);
 836 
 837         usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
 838                           usb_rcvbulkpipe(pegasus->usb, 1),
 839                           pegasus->rx_skb->data, PEGASUS_MTU,
 840                           read_bulk_callback, pegasus);
 841         if ((res = usb_submit_urb(pegasus->rx_urb, GFP_KERNEL))) {
 842                 if (res == -ENODEV)
 843                         netif_device_detach(pegasus->net);
 844                 netif_dbg(pegasus, ifup, net, "failed rx_urb, %d\n", res);
 845                 goto exit;
 846         }
 847 
 848         usb_fill_int_urb(pegasus->intr_urb, pegasus->usb,
 849                          usb_rcvintpipe(pegasus->usb, 3),
 850                          pegasus->intr_buff, sizeof(pegasus->intr_buff),
 851                          intr_callback, pegasus, pegasus->intr_interval);
 852         if ((res = usb_submit_urb(pegasus->intr_urb, GFP_KERNEL))) {
 853                 if (res == -ENODEV)
 854                         netif_device_detach(pegasus->net);
 855                 netif_dbg(pegasus, ifup, net, "failed intr_urb, %d\n", res);
 856                 usb_kill_urb(pegasus->rx_urb);
 857                 goto exit;
 858         }
 859         res = enable_net_traffic(net, pegasus->usb);
 860         if (res < 0) {
 861                 netif_dbg(pegasus, ifup, net,
 862                           "can't enable_net_traffic() - %d\n", res);
 863                 res = -EIO;
 864                 usb_kill_urb(pegasus->rx_urb);
 865                 usb_kill_urb(pegasus->intr_urb);
 866                 goto exit;
 867         }
 868         set_carrier(net);
 869         netif_start_queue(net);
 870         netif_dbg(pegasus, ifup, net, "open\n");
 871         res = 0;
 872 exit:
 873         return res;
 874 }
 875 
 876 static int pegasus_close(struct net_device *net)
 877 {
 878         pegasus_t *pegasus = netdev_priv(net);
 879 
 880         netif_stop_queue(net);
 881         if (!(pegasus->flags & PEGASUS_UNPLUG))
 882                 disable_net_traffic(pegasus);
 883         tasklet_kill(&pegasus->rx_tl);
 884         unlink_all_urbs(pegasus);
 885 
 886         return 0;
 887 }
 888 
 889 static void pegasus_get_drvinfo(struct net_device *dev,
 890                                 struct ethtool_drvinfo *info)
 891 {
 892         pegasus_t *pegasus = netdev_priv(dev);
 893 
 894         strlcpy(info->driver, driver_name, sizeof(info->driver));
 895         strlcpy(info->version, DRIVER_VERSION, sizeof(info->version));
 896         usb_make_path(pegasus->usb, info->bus_info, sizeof(info->bus_info));
 897 }
 898 
 899 /* also handles three patterns of some kind in hardware */
 900 #define WOL_SUPPORTED   (WAKE_MAGIC|WAKE_PHY)
 901 
 902 static void
 903 pegasus_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 904 {
 905         pegasus_t       *pegasus = netdev_priv(dev);
 906 
 907         wol->supported = WAKE_MAGIC | WAKE_PHY;
 908         wol->wolopts = pegasus->wolopts;
 909 }
 910 
 911 static int
 912 pegasus_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 913 {
 914         pegasus_t       *pegasus = netdev_priv(dev);
 915         u8              reg78 = 0x04;
 916         int             ret;
 917 
 918         if (wol->wolopts & ~WOL_SUPPORTED)
 919                 return -EINVAL;
 920 
 921         if (wol->wolopts & WAKE_MAGIC)
 922                 reg78 |= 0x80;
 923         if (wol->wolopts & WAKE_PHY)
 924                 reg78 |= 0x40;
 925         /* FIXME this 0x10 bit still needs to get set in the chip... */
 926         if (wol->wolopts)
 927                 pegasus->eth_regs[0] |= 0x10;
 928         else
 929                 pegasus->eth_regs[0] &= ~0x10;
 930         pegasus->wolopts = wol->wolopts;
 931 
 932         ret = set_register(pegasus, WakeupControl, reg78);
 933         if (!ret)
 934                 ret = device_set_wakeup_enable(&pegasus->usb->dev,
 935                                                 wol->wolopts);
 936         return ret;
 937 }
 938 
 939 static inline void pegasus_reset_wol(struct net_device *dev)
 940 {
 941         struct ethtool_wolinfo wol;
 942 
 943         memset(&wol, 0, sizeof wol);
 944         (void) pegasus_set_wol(dev, &wol);
 945 }
 946 
 947 static int
 948 pegasus_get_link_ksettings(struct net_device *dev,
 949                            struct ethtool_link_ksettings *ecmd)
 950 {
 951         pegasus_t *pegasus;
 952 
 953         pegasus = netdev_priv(dev);
 954         mii_ethtool_get_link_ksettings(&pegasus->mii, ecmd);
 955         return 0;
 956 }
 957 
 958 static int
 959 pegasus_set_link_ksettings(struct net_device *dev,
 960                            const struct ethtool_link_ksettings *ecmd)
 961 {
 962         pegasus_t *pegasus = netdev_priv(dev);
 963         return mii_ethtool_set_link_ksettings(&pegasus->mii, ecmd);
 964 }
 965 
 966 static int pegasus_nway_reset(struct net_device *dev)
 967 {
 968         pegasus_t *pegasus = netdev_priv(dev);
 969         return mii_nway_restart(&pegasus->mii);
 970 }
 971 
 972 static u32 pegasus_get_link(struct net_device *dev)
 973 {
 974         pegasus_t *pegasus = netdev_priv(dev);
 975         return mii_link_ok(&pegasus->mii);
 976 }
 977 
 978 static u32 pegasus_get_msglevel(struct net_device *dev)
 979 {
 980         pegasus_t *pegasus = netdev_priv(dev);
 981         return pegasus->msg_enable;
 982 }
 983 
 984 static void pegasus_set_msglevel(struct net_device *dev, u32 v)
 985 {
 986         pegasus_t *pegasus = netdev_priv(dev);
 987         pegasus->msg_enable = v;
 988 }
 989 
 990 static const struct ethtool_ops ops = {
 991         .get_drvinfo = pegasus_get_drvinfo,
 992         .nway_reset = pegasus_nway_reset,
 993         .get_link = pegasus_get_link,
 994         .get_msglevel = pegasus_get_msglevel,
 995         .set_msglevel = pegasus_set_msglevel,
 996         .get_wol = pegasus_get_wol,
 997         .set_wol = pegasus_set_wol,
 998         .get_link_ksettings = pegasus_get_link_ksettings,
 999         .set_link_ksettings = pegasus_set_link_ksettings,
1000 };
1001 
1002 static int pegasus_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
1003 {
1004         __u16 *data = (__u16 *) &rq->ifr_ifru;
1005         pegasus_t *pegasus = netdev_priv(net);
1006         int res;
1007 
1008         switch (cmd) {
1009         case SIOCDEVPRIVATE:
1010                 data[0] = pegasus->phy;
1011                 /* fall through */
1012         case SIOCDEVPRIVATE + 1:
1013                 read_mii_word(pegasus, data[0], data[1] & 0x1f, &data[3]);
1014                 res = 0;
1015                 break;
1016         case SIOCDEVPRIVATE + 2:
1017                 if (!capable(CAP_NET_ADMIN))
1018                         return -EPERM;
1019                 write_mii_word(pegasus, pegasus->phy, data[1] & 0x1f, &data[2]);
1020                 res = 0;
1021                 break;
1022         default:
1023                 res = -EOPNOTSUPP;
1024         }
1025         return res;
1026 }
1027 
1028 static void pegasus_set_multicast(struct net_device *net)
1029 {
1030         pegasus_t *pegasus = netdev_priv(net);
1031 
1032         if (net->flags & IFF_PROMISC) {
1033                 pegasus->eth_regs[EthCtrl2] |= RX_PROMISCUOUS;
1034                 netif_info(pegasus, link, net, "Promiscuous mode enabled\n");
1035         } else if (!netdev_mc_empty(net) || (net->flags & IFF_ALLMULTI)) {
1036                 pegasus->eth_regs[EthCtrl0] |= RX_MULTICAST;
1037                 pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS;
1038                 netif_dbg(pegasus, link, net, "set allmulti\n");
1039         } else {
1040                 pegasus->eth_regs[EthCtrl0] &= ~RX_MULTICAST;
1041                 pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS;
1042         }
1043         update_eth_regs_async(pegasus);
1044 }
1045 
1046 static __u8 mii_phy_probe(pegasus_t *pegasus)
1047 {
1048         int i;
1049         __u16 tmp;
1050 
1051         for (i = 0; i < 32; i++) {
1052                 read_mii_word(pegasus, i, MII_BMSR, &tmp);
1053                 if (tmp == 0 || tmp == 0xffff || (tmp & BMSR_MEDIA) == 0)
1054                         continue;
1055                 else
1056                         return i;
1057         }
1058 
1059         return 0xff;
1060 }
1061 
1062 static inline void setup_pegasus_II(pegasus_t *pegasus)
1063 {
1064         __u8 data = 0xa5;
1065 
1066         set_register(pegasus, Reg1d, 0);
1067         set_register(pegasus, Reg7b, 1);
1068         msleep(100);
1069         if ((pegasus->features & HAS_HOME_PNA) && mii_mode)
1070                 set_register(pegasus, Reg7b, 0);
1071         else
1072                 set_register(pegasus, Reg7b, 2);
1073 
1074         set_register(pegasus, 0x83, data);
1075         get_registers(pegasus, 0x83, 1, &data);
1076 
1077         if (data == 0xa5)
1078                 pegasus->chip = 0x8513;
1079         else
1080                 pegasus->chip = 0;
1081 
1082         set_register(pegasus, 0x80, 0xc0);
1083         set_register(pegasus, 0x83, 0xff);
1084         set_register(pegasus, 0x84, 0x01);
1085 
1086         if (pegasus->features & HAS_HOME_PNA && mii_mode)
1087                 set_register(pegasus, Reg81, 6);
1088         else
1089                 set_register(pegasus, Reg81, 2);
1090 }
1091 
1092 
1093 static int pegasus_count;
1094 static struct workqueue_struct *pegasus_workqueue;
1095 #define CARRIER_CHECK_DELAY (2 * HZ)
1096 
1097 static void check_carrier(struct work_struct *work)
1098 {
1099         pegasus_t *pegasus = container_of(work, pegasus_t, carrier_check.work);
1100         set_carrier(pegasus->net);
1101         if (!(pegasus->flags & PEGASUS_UNPLUG)) {
1102                 queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
1103                         CARRIER_CHECK_DELAY);
1104         }
1105 }
1106 
1107 static int pegasus_blacklisted(struct usb_device *udev)
1108 {
1109         struct usb_device_descriptor *udd = &udev->descriptor;
1110 
1111         /* Special quirk to keep the driver from handling the Belkin Bluetooth
1112          * dongle which happens to have the same ID.
1113          */
1114         if ((udd->idVendor == cpu_to_le16(VENDOR_BELKIN)) &&
1115             (udd->idProduct == cpu_to_le16(0x0121)) &&
1116             (udd->bDeviceClass == USB_CLASS_WIRELESS_CONTROLLER) &&
1117             (udd->bDeviceProtocol == 1))
1118                 return 1;
1119 
1120         return 0;
1121 }
1122 
1123 /* we rely on probe() and remove() being serialized so we
1124  * don't need extra locking on pegasus_count.
1125  */
1126 static void pegasus_dec_workqueue(void)
1127 {
1128         pegasus_count--;
1129         if (pegasus_count == 0) {
1130                 destroy_workqueue(pegasus_workqueue);
1131                 pegasus_workqueue = NULL;
1132         }
1133 }
1134 
1135 static int pegasus_probe(struct usb_interface *intf,
1136                          const struct usb_device_id *id)
1137 {
1138         struct usb_device *dev = interface_to_usbdev(intf);
1139         struct net_device *net;
1140         pegasus_t *pegasus;
1141         int dev_index = id - pegasus_ids;
1142         int res = -ENOMEM;
1143 
1144         if (pegasus_blacklisted(dev))
1145                 return -ENODEV;
1146 
1147         if (pegasus_count == 0) {
1148                 pegasus_workqueue = alloc_workqueue("pegasus", WQ_MEM_RECLAIM,
1149                                                     0);
1150                 if (!pegasus_workqueue)
1151                         return -ENOMEM;
1152         }
1153         pegasus_count++;
1154 
1155         net = alloc_etherdev(sizeof(struct pegasus));
1156         if (!net)
1157                 goto out;
1158 
1159         pegasus = netdev_priv(net);
1160         pegasus->dev_index = dev_index;
1161 
1162         res = alloc_urbs(pegasus);
1163         if (res < 0) {
1164                 dev_err(&intf->dev, "can't allocate %s\n", "urbs");
1165                 goto out1;
1166         }
1167 
1168         tasklet_init(&pegasus->rx_tl, rx_fixup, (unsigned long) pegasus);
1169 
1170         INIT_DELAYED_WORK(&pegasus->carrier_check, check_carrier);
1171 
1172         pegasus->intf = intf;
1173         pegasus->usb = dev;
1174         pegasus->net = net;
1175 
1176 
1177         net->watchdog_timeo = PEGASUS_TX_TIMEOUT;
1178         net->netdev_ops = &pegasus_netdev_ops;
1179         net->ethtool_ops = &ops;
1180         pegasus->mii.dev = net;
1181         pegasus->mii.mdio_read = mdio_read;
1182         pegasus->mii.mdio_write = mdio_write;
1183         pegasus->mii.phy_id_mask = 0x1f;
1184         pegasus->mii.reg_num_mask = 0x1f;
1185         pegasus->msg_enable = netif_msg_init(msg_level, NETIF_MSG_DRV
1186                                 | NETIF_MSG_PROBE | NETIF_MSG_LINK);
1187 
1188         pegasus->features = usb_dev_id[dev_index].private;
1189         get_interrupt_interval(pegasus);
1190         if (reset_mac(pegasus)) {
1191                 dev_err(&intf->dev, "can't reset MAC\n");
1192                 res = -EIO;
1193                 goto out2;
1194         }
1195         set_ethernet_addr(pegasus);
1196         if (pegasus->features & PEGASUS_II) {
1197                 dev_info(&intf->dev, "setup Pegasus II specific registers\n");
1198                 setup_pegasus_II(pegasus);
1199         }
1200         pegasus->phy = mii_phy_probe(pegasus);
1201         if (pegasus->phy == 0xff) {
1202                 dev_warn(&intf->dev, "can't locate MII phy, using default\n");
1203                 pegasus->phy = 1;
1204         }
1205         pegasus->mii.phy_id = pegasus->phy;
1206         usb_set_intfdata(intf, pegasus);
1207         SET_NETDEV_DEV(net, &intf->dev);
1208         pegasus_reset_wol(net);
1209         res = register_netdev(net);
1210         if (res)
1211                 goto out3;
1212         queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
1213                            CARRIER_CHECK_DELAY);
1214         dev_info(&intf->dev, "%s, %s, %pM\n", net->name,
1215                  usb_dev_id[dev_index].name, net->dev_addr);
1216         return 0;
1217 
1218 out3:
1219         usb_set_intfdata(intf, NULL);
1220 out2:
1221         free_all_urbs(pegasus);
1222 out1:
1223         free_netdev(net);
1224 out:
1225         pegasus_dec_workqueue();
1226         return res;
1227 }
1228 
1229 static void pegasus_disconnect(struct usb_interface *intf)
1230 {
1231         struct pegasus *pegasus = usb_get_intfdata(intf);
1232 
1233         usb_set_intfdata(intf, NULL);
1234         if (!pegasus) {
1235                 dev_dbg(&intf->dev, "unregistering non-bound device?\n");
1236                 return;
1237         }
1238 
1239         pegasus->flags |= PEGASUS_UNPLUG;
1240         cancel_delayed_work(&pegasus->carrier_check);
1241         unregister_netdev(pegasus->net);
1242         unlink_all_urbs(pegasus);
1243         free_all_urbs(pegasus);
1244         if (pegasus->rx_skb != NULL) {
1245                 dev_kfree_skb(pegasus->rx_skb);
1246                 pegasus->rx_skb = NULL;
1247         }
1248         free_netdev(pegasus->net);
1249         pegasus_dec_workqueue();
1250 }
1251 
1252 static int pegasus_suspend(struct usb_interface *intf, pm_message_t message)
1253 {
1254         struct pegasus *pegasus = usb_get_intfdata(intf);
1255 
1256         netif_device_detach(pegasus->net);
1257         cancel_delayed_work(&pegasus->carrier_check);
1258         if (netif_running(pegasus->net)) {
1259                 usb_kill_urb(pegasus->rx_urb);
1260                 usb_kill_urb(pegasus->intr_urb);
1261         }
1262         return 0;
1263 }
1264 
1265 static int pegasus_resume(struct usb_interface *intf)
1266 {
1267         struct pegasus *pegasus = usb_get_intfdata(intf);
1268 
1269         netif_device_attach(pegasus->net);
1270         if (netif_running(pegasus->net)) {
1271                 pegasus->rx_urb->status = 0;
1272                 pegasus->rx_urb->actual_length = 0;
1273                 read_bulk_callback(pegasus->rx_urb);
1274 
1275                 pegasus->intr_urb->status = 0;
1276                 pegasus->intr_urb->actual_length = 0;
1277                 intr_callback(pegasus->intr_urb);
1278         }
1279         queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
1280                                 CARRIER_CHECK_DELAY);
1281         return 0;
1282 }
1283 
1284 static const struct net_device_ops pegasus_netdev_ops = {
1285         .ndo_open =                     pegasus_open,
1286         .ndo_stop =                     pegasus_close,
1287         .ndo_do_ioctl =                 pegasus_ioctl,
1288         .ndo_start_xmit =               pegasus_start_xmit,
1289         .ndo_set_rx_mode =              pegasus_set_multicast,
1290         .ndo_tx_timeout =               pegasus_tx_timeout,
1291         .ndo_set_mac_address =          eth_mac_addr,
1292         .ndo_validate_addr =            eth_validate_addr,
1293 };
1294 
1295 static struct usb_driver pegasus_driver = {
1296         .name = driver_name,
1297         .probe = pegasus_probe,
1298         .disconnect = pegasus_disconnect,
1299         .id_table = pegasus_ids,
1300         .suspend = pegasus_suspend,
1301         .resume = pegasus_resume,
1302         .disable_hub_initiated_lpm = 1,
1303 };
1304 
1305 static void __init parse_id(char *id)
1306 {
1307         unsigned int vendor_id = 0, device_id = 0, flags = 0, i = 0;
1308         char *token, *name = NULL;
1309 
1310         if ((token = strsep(&id, ":")) != NULL)
1311                 name = token;
1312         /* name now points to a null terminated string*/
1313         if ((token = strsep(&id, ":")) != NULL)
1314                 vendor_id = simple_strtoul(token, NULL, 16);
1315         if ((token = strsep(&id, ":")) != NULL)
1316                 device_id = simple_strtoul(token, NULL, 16);
1317         flags = simple_strtoul(id, NULL, 16);
1318         pr_info("%s: new device %s, vendor ID 0x%04x, device ID 0x%04x, flags: 0x%x\n",
1319                 driver_name, name, vendor_id, device_id, flags);
1320 
1321         if (vendor_id > 0x10000 || vendor_id == 0)
1322                 return;
1323         if (device_id > 0x10000 || device_id == 0)
1324                 return;
1325 
1326         for (i = 0; usb_dev_id[i].name; i++);
1327         usb_dev_id[i].name = name;
1328         usb_dev_id[i].vendor = vendor_id;
1329         usb_dev_id[i].device = device_id;
1330         usb_dev_id[i].private = flags;
1331         pegasus_ids[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
1332         pegasus_ids[i].idVendor = vendor_id;
1333         pegasus_ids[i].idProduct = device_id;
1334 }
1335 
1336 static int __init pegasus_init(void)
1337 {
1338         pr_info("%s: %s, " DRIVER_DESC "\n", driver_name, DRIVER_VERSION);
1339         if (devid)
1340                 parse_id(devid);
1341         return usb_register(&pegasus_driver);
1342 }
1343 
1344 static void __exit pegasus_exit(void)
1345 {
1346         usb_deregister(&pegasus_driver);
1347 }
1348 
1349 module_init(pegasus_init);
1350 module_exit(pegasus_exit);

/* [<][>][^][v][top][bottom][index][help] */