linux/drivers/net/usb/asix_common.c
<<
>>
Prefs
   1/*
   2 * ASIX AX8817X based USB 2.0 Ethernet Devices
   3 * Copyright (C) 2003-2006 David Hollis <dhollis@davehollis.com>
   4 * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
   5 * Copyright (C) 2006 James Painter <jamie.painter@iname.com>
   6 * Copyright (c) 2002-2003 TiVo Inc.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
  20 */
  21
  22#include "asix.h"
  23
  24int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
  25                  u16 size, void *data, int in_pm)
  26{
  27        int ret;
  28        int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16);
  29
  30        BUG_ON(!dev);
  31
  32        if (!in_pm)
  33                fn = usbnet_read_cmd;
  34        else
  35                fn = usbnet_read_cmd_nopm;
  36
  37        ret = fn(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  38                 value, index, data, size);
  39
  40        if (unlikely(ret < 0))
  41                netdev_warn(dev->net, "Failed to read reg index 0x%04x: %d\n",
  42                            index, ret);
  43
  44        return ret;
  45}
  46
  47int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
  48                   u16 size, void *data, int in_pm)
  49{
  50        int ret;
  51        int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16);
  52
  53        BUG_ON(!dev);
  54
  55        if (!in_pm)
  56                fn = usbnet_write_cmd;
  57        else
  58                fn = usbnet_write_cmd_nopm;
  59
  60        ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  61                 value, index, data, size);
  62
  63        if (unlikely(ret < 0))
  64                netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n",
  65                            index, ret);
  66
  67        return ret;
  68}
  69
  70void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
  71                          u16 size, void *data)
  72{
  73        usbnet_write_cmd_async(dev, cmd,
  74                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  75                               value, index, data, size);
  76}
  77
  78static void reset_asix_rx_fixup_info(struct asix_rx_fixup_info *rx)
  79{
  80        /* Reset the variables that have a lifetime outside of
  81         * asix_rx_fixup_internal() so that future processing starts from a
  82         * known set of initial conditions.
  83         */
  84
  85        if (rx->ax_skb) {
  86                /* Discard any incomplete Ethernet frame in the netdev buffer */
  87                kfree_skb(rx->ax_skb);
  88                rx->ax_skb = NULL;
  89        }
  90
  91        /* Assume the Data header 32-bit word is at the start of the current
  92         * or next URB socket buffer so reset all the state variables.
  93         */
  94        rx->remaining = 0;
  95        rx->split_head = false;
  96        rx->header = 0;
  97}
  98
  99int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
 100                           struct asix_rx_fixup_info *rx)
 101{
 102        int offset = 0;
 103        u16 size;
 104
 105        /* When an Ethernet frame spans multiple URB socket buffers,
 106         * do a sanity test for the Data header synchronisation.
 107         * Attempt to detect the situation of the previous socket buffer having
 108         * been truncated or a socket buffer was missing. These situations
 109         * cause a discontinuity in the data stream and therefore need to avoid
 110         * appending bad data to the end of the current netdev socket buffer.
 111         * Also avoid unnecessarily discarding a good current netdev socket
 112         * buffer.
 113         */
 114        if (rx->remaining && (rx->remaining + sizeof(u32) <= skb->len)) {
 115                offset = ((rx->remaining + 1) & 0xfffe);
 116                rx->header = get_unaligned_le32(skb->data + offset);
 117                offset = 0;
 118
 119                size = (u16)(rx->header & 0x7ff);
 120                if (size != ((~rx->header >> 16) & 0x7ff)) {
 121                        netdev_err(dev->net, "asix_rx_fixup() Data Header synchronisation was lost, remaining %d\n",
 122                                   rx->remaining);
 123                        reset_asix_rx_fixup_info(rx);
 124                }
 125        }
 126
 127        while (offset + sizeof(u16) <= skb->len) {
 128                u16 copy_length;
 129
 130                if (!rx->remaining) {
 131                        if (skb->len - offset == sizeof(u16)) {
 132                                rx->header = get_unaligned_le16(
 133                                                skb->data + offset);
 134                                rx->split_head = true;
 135                                offset += sizeof(u16);
 136                                break;
 137                        }
 138
 139                        if (rx->split_head == true) {
 140                                rx->header |= (get_unaligned_le16(
 141                                                skb->data + offset) << 16);
 142                                rx->split_head = false;
 143                                offset += sizeof(u16);
 144                        } else {
 145                                rx->header = get_unaligned_le32(skb->data +
 146                                                                offset);
 147                                offset += sizeof(u32);
 148                        }
 149
 150                        /* take frame length from Data header 32-bit word */
 151                        size = (u16)(rx->header & 0x7ff);
 152                        if (size != ((~rx->header >> 16) & 0x7ff)) {
 153                                netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n",
 154                                           rx->header, offset);
 155                                reset_asix_rx_fixup_info(rx);
 156                                return 0;
 157                        }
 158                        if (size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) {
 159                                netdev_dbg(dev->net, "asix_rx_fixup() Bad RX Length %d\n",
 160                                           size);
 161                                reset_asix_rx_fixup_info(rx);
 162                                return 0;
 163                        }
 164
 165                        /* Sometimes may fail to get a netdev socket buffer but
 166                         * continue to process the URB socket buffer so that
 167                         * synchronisation of the Ethernet frame Data header
 168                         * word is maintained.
 169                         */
 170                        rx->ax_skb = netdev_alloc_skb_ip_align(dev->net, size);
 171
 172                        rx->remaining = size;
 173                }
 174
 175                if (rx->remaining > skb->len - offset) {
 176                        copy_length = skb->len - offset;
 177                        rx->remaining -= copy_length;
 178                } else {
 179                        copy_length = rx->remaining;
 180                        rx->remaining = 0;
 181                }
 182
 183                if (rx->ax_skb) {
 184                        skb_put_data(rx->ax_skb, skb->data + offset,
 185                                     copy_length);
 186                        if (!rx->remaining) {
 187                                usbnet_skb_return(dev, rx->ax_skb);
 188                                rx->ax_skb = NULL;
 189                        }
 190                }
 191
 192                offset += (copy_length + 1) & 0xfffe;
 193        }
 194
 195        if (skb->len != offset) {
 196                netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d, %d\n",
 197                           skb->len, offset);
 198                reset_asix_rx_fixup_info(rx);
 199                return 0;
 200        }
 201
 202        return 1;
 203}
 204
 205int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb)
 206{
 207        struct asix_common_private *dp = dev->driver_priv;
 208        struct asix_rx_fixup_info *rx = &dp->rx_fixup_info;
 209
 210        return asix_rx_fixup_internal(dev, skb, rx);
 211}
 212
 213void asix_rx_fixup_common_free(struct asix_common_private *dp)
 214{
 215        struct asix_rx_fixup_info *rx;
 216
 217        if (!dp)
 218                return;
 219
 220        rx = &dp->rx_fixup_info;
 221
 222        if (rx->ax_skb) {
 223                kfree_skb(rx->ax_skb);
 224                rx->ax_skb = NULL;
 225        }
 226}
 227
 228struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 229                              gfp_t flags)
 230{
 231        int padlen;
 232        int headroom = skb_headroom(skb);
 233        int tailroom = skb_tailroom(skb);
 234        u32 packet_len;
 235        u32 padbytes = 0xffff0000;
 236
 237        padlen = ((skb->len + 4) & (dev->maxpacket - 1)) ? 0 : 4;
 238
 239        /* We need to push 4 bytes in front of frame (packet_len)
 240         * and maybe add 4 bytes after the end (if padlen is 4)
 241         *
 242         * Avoid skb_copy_expand() expensive call, using following rules :
 243         * - We are allowed to push 4 bytes in headroom if skb_header_cloned()
 244         *   is false (and if we have 4 bytes of headroom)
 245         * - We are allowed to put 4 bytes at tail if skb_cloned()
 246         *   is false (and if we have 4 bytes of tailroom)
 247         *
 248         * TCP packets for example are cloned, but __skb_header_release()
 249         * was called in tcp stack, allowing us to use headroom for our needs.
 250         */
 251        if (!skb_header_cloned(skb) &&
 252            !(padlen && skb_cloned(skb)) &&
 253            headroom + tailroom >= 4 + padlen) {
 254                /* following should not happen, but better be safe */
 255                if (headroom < 4 ||
 256                    tailroom < padlen) {
 257                        skb->data = memmove(skb->head + 4, skb->data, skb->len);
 258                        skb_set_tail_pointer(skb, skb->len);
 259                }
 260        } else {
 261                struct sk_buff *skb2;
 262
 263                skb2 = skb_copy_expand(skb, 4, padlen, flags);
 264                dev_kfree_skb_any(skb);
 265                skb = skb2;
 266                if (!skb)
 267                        return NULL;
 268        }
 269
 270        packet_len = ((skb->len ^ 0x0000ffff) << 16) + skb->len;
 271        skb_push(skb, 4);
 272        cpu_to_le32s(&packet_len);
 273        skb_copy_to_linear_data(skb, &packet_len, sizeof(packet_len));
 274
 275        if (padlen) {
 276                cpu_to_le32s(&padbytes);
 277                memcpy(skb_tail_pointer(skb), &padbytes, sizeof(padbytes));
 278                skb_put(skb, sizeof(padbytes));
 279        }
 280
 281        usbnet_set_skb_tx_stats(skb, 1, 0);
 282        return skb;
 283}
 284
 285int asix_set_sw_mii(struct usbnet *dev, int in_pm)
 286{
 287        int ret;
 288        ret = asix_write_cmd(dev, AX_CMD_SET_SW_MII, 0x0000, 0, 0, NULL, in_pm);
 289
 290        if (ret < 0)
 291                netdev_err(dev->net, "Failed to enable software MII access\n");
 292        return ret;
 293}
 294
 295int asix_set_hw_mii(struct usbnet *dev, int in_pm)
 296{
 297        int ret;
 298        ret = asix_write_cmd(dev, AX_CMD_SET_HW_MII, 0x0000, 0, 0, NULL, in_pm);
 299        if (ret < 0)
 300                netdev_err(dev->net, "Failed to enable hardware MII access\n");
 301        return ret;
 302}
 303
 304int asix_read_phy_addr(struct usbnet *dev, int internal)
 305{
 306        int offset = (internal ? 1 : 0);
 307        u8 buf[2];
 308        int ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf, 0);
 309
 310        netdev_dbg(dev->net, "asix_get_phy_addr()\n");
 311
 312        if (ret < 0) {
 313                netdev_err(dev->net, "Error reading PHYID register: %02x\n", ret);
 314                goto out;
 315        }
 316        netdev_dbg(dev->net, "asix_get_phy_addr() returning 0x%04x\n",
 317                   *((__le16 *)buf));
 318        ret = buf[offset];
 319
 320out:
 321        return ret;
 322}
 323
 324int asix_get_phy_addr(struct usbnet *dev)
 325{
 326        /* return the address of the internal phy */
 327        return asix_read_phy_addr(dev, 1);
 328}
 329
 330
 331int asix_sw_reset(struct usbnet *dev, u8 flags, int in_pm)
 332{
 333        int ret;
 334
 335        ret = asix_write_cmd(dev, AX_CMD_SW_RESET, flags, 0, 0, NULL, in_pm);
 336        if (ret < 0)
 337                netdev_err(dev->net, "Failed to send software reset: %02x\n", ret);
 338
 339        return ret;
 340}
 341
 342u16 asix_read_rx_ctl(struct usbnet *dev, int in_pm)
 343{
 344        __le16 v;
 345        int ret = asix_read_cmd(dev, AX_CMD_READ_RX_CTL, 0, 0, 2, &v, in_pm);
 346
 347        if (ret < 0) {
 348                netdev_err(dev->net, "Error reading RX_CTL register: %02x\n", ret);
 349                goto out;
 350        }
 351        ret = le16_to_cpu(v);
 352out:
 353        return ret;
 354}
 355
 356int asix_write_rx_ctl(struct usbnet *dev, u16 mode, int in_pm)
 357{
 358        int ret;
 359
 360        netdev_dbg(dev->net, "asix_write_rx_ctl() - mode = 0x%04x\n", mode);
 361        ret = asix_write_cmd(dev, AX_CMD_WRITE_RX_CTL, mode, 0, 0, NULL, in_pm);
 362        if (ret < 0)
 363                netdev_err(dev->net, "Failed to write RX_CTL mode to 0x%04x: %02x\n",
 364                           mode, ret);
 365
 366        return ret;
 367}
 368
 369u16 asix_read_medium_status(struct usbnet *dev, int in_pm)
 370{
 371        __le16 v;
 372        int ret = asix_read_cmd(dev, AX_CMD_READ_MEDIUM_STATUS,
 373                                0, 0, 2, &v, in_pm);
 374
 375        if (ret < 0) {
 376                netdev_err(dev->net, "Error reading Medium Status register: %02x\n",
 377                           ret);
 378                return ret;     /* TODO: callers not checking for error ret */
 379        }
 380
 381        return le16_to_cpu(v);
 382
 383}
 384
 385int asix_write_medium_mode(struct usbnet *dev, u16 mode, int in_pm)
 386{
 387        int ret;
 388
 389        netdev_dbg(dev->net, "asix_write_medium_mode() - mode = 0x%04x\n", mode);
 390        ret = asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE,
 391                             mode, 0, 0, NULL, in_pm);
 392        if (ret < 0)
 393                netdev_err(dev->net, "Failed to write Medium Mode mode to 0x%04x: %02x\n",
 394                           mode, ret);
 395
 396        return ret;
 397}
 398
 399int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm)
 400{
 401        int ret;
 402
 403        netdev_dbg(dev->net, "asix_write_gpio() - value = 0x%04x\n", value);
 404        ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, value, 0, 0, NULL, in_pm);
 405        if (ret < 0)
 406                netdev_err(dev->net, "Failed to write GPIO value 0x%04x: %02x\n",
 407                           value, ret);
 408
 409        if (sleep)
 410                msleep(sleep);
 411
 412        return ret;
 413}
 414
 415/*
 416 * AX88772 & AX88178 have a 16-bit RX_CTL value
 417 */
 418void asix_set_multicast(struct net_device *net)
 419{
 420        struct usbnet *dev = netdev_priv(net);
 421        struct asix_data *data = (struct asix_data *)&dev->data;
 422        u16 rx_ctl = AX_DEFAULT_RX_CTL;
 423
 424        if (net->flags & IFF_PROMISC) {
 425                rx_ctl |= AX_RX_CTL_PRO;
 426        } else if (net->flags & IFF_ALLMULTI ||
 427                   netdev_mc_count(net) > AX_MAX_MCAST) {
 428                rx_ctl |= AX_RX_CTL_AMALL;
 429        } else if (netdev_mc_empty(net)) {
 430                /* just broadcast and directed */
 431        } else {
 432                /* We use the 20 byte dev->data
 433                 * for our 8 byte filter buffer
 434                 * to avoid allocating memory that
 435                 * is tricky to free later */
 436                struct netdev_hw_addr *ha;
 437                u32 crc_bits;
 438
 439                memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE);
 440
 441                /* Build the multicast hash filter. */
 442                netdev_for_each_mc_addr(ha, net) {
 443                        crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26;
 444                        data->multi_filter[crc_bits >> 3] |=
 445                            1 << (crc_bits & 7);
 446                }
 447
 448                asix_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0,
 449                                   AX_MCAST_FILTER_SIZE, data->multi_filter);
 450
 451                rx_ctl |= AX_RX_CTL_AM;
 452        }
 453
 454        asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);
 455}
 456
 457int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
 458{
 459        struct usbnet *dev = netdev_priv(netdev);
 460        __le16 res;
 461        u8 smsr;
 462        int i = 0;
 463        int ret;
 464
 465        mutex_lock(&dev->phy_mutex);
 466        do {
 467                ret = asix_set_sw_mii(dev, 0);
 468                if (ret == -ENODEV || ret == -ETIMEDOUT)
 469                        break;
 470                usleep_range(1000, 1100);
 471                ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
 472                                    0, 0, 1, &smsr, 0);
 473        } while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
 474        if (ret == -ENODEV || ret == -ETIMEDOUT) {
 475                mutex_unlock(&dev->phy_mutex);
 476                return ret;
 477        }
 478
 479        asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id,
 480                                (__u16)loc, 2, &res, 0);
 481        asix_set_hw_mii(dev, 0);
 482        mutex_unlock(&dev->phy_mutex);
 483
 484        netdev_dbg(dev->net, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",
 485                        phy_id, loc, le16_to_cpu(res));
 486
 487        return le16_to_cpu(res);
 488}
 489
 490void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
 491{
 492        struct usbnet *dev = netdev_priv(netdev);
 493        __le16 res = cpu_to_le16(val);
 494        u8 smsr;
 495        int i = 0;
 496        int ret;
 497
 498        netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",
 499                        phy_id, loc, val);
 500
 501        mutex_lock(&dev->phy_mutex);
 502        do {
 503                ret = asix_set_sw_mii(dev, 0);
 504                if (ret == -ENODEV)
 505                        break;
 506                usleep_range(1000, 1100);
 507                ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
 508                                    0, 0, 1, &smsr, 0);
 509        } while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
 510        if (ret == -ENODEV) {
 511                mutex_unlock(&dev->phy_mutex);
 512                return;
 513        }
 514
 515        asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id,
 516                       (__u16)loc, 2, &res, 0);
 517        asix_set_hw_mii(dev, 0);
 518        mutex_unlock(&dev->phy_mutex);
 519}
 520
 521int asix_mdio_read_nopm(struct net_device *netdev, int phy_id, int loc)
 522{
 523        struct usbnet *dev = netdev_priv(netdev);
 524        __le16 res;
 525        u8 smsr;
 526        int i = 0;
 527        int ret;
 528
 529        mutex_lock(&dev->phy_mutex);
 530        do {
 531                ret = asix_set_sw_mii(dev, 1);
 532                if (ret == -ENODEV || ret == -ETIMEDOUT)
 533                        break;
 534                usleep_range(1000, 1100);
 535                ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
 536                                    0, 0, 1, &smsr, 1);
 537        } while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
 538        if (ret == -ENODEV || ret == -ETIMEDOUT) {
 539                mutex_unlock(&dev->phy_mutex);
 540                return ret;
 541        }
 542
 543        asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id,
 544                      (__u16)loc, 2, &res, 1);
 545        asix_set_hw_mii(dev, 1);
 546        mutex_unlock(&dev->phy_mutex);
 547
 548        netdev_dbg(dev->net, "asix_mdio_read_nopm() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",
 549                        phy_id, loc, le16_to_cpu(res));
 550
 551        return le16_to_cpu(res);
 552}
 553
 554void
 555asix_mdio_write_nopm(struct net_device *netdev, int phy_id, int loc, int val)
 556{
 557        struct usbnet *dev = netdev_priv(netdev);
 558        __le16 res = cpu_to_le16(val);
 559        u8 smsr;
 560        int i = 0;
 561        int ret;
 562
 563        netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",
 564                        phy_id, loc, val);
 565
 566        mutex_lock(&dev->phy_mutex);
 567        do {
 568                ret = asix_set_sw_mii(dev, 1);
 569                if (ret == -ENODEV)
 570                        break;
 571                usleep_range(1000, 1100);
 572                ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
 573                                    0, 0, 1, &smsr, 1);
 574        } while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
 575        if (ret == -ENODEV) {
 576                mutex_unlock(&dev->phy_mutex);
 577                return;
 578        }
 579
 580        asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id,
 581                       (__u16)loc, 2, &res, 1);
 582        asix_set_hw_mii(dev, 1);
 583        mutex_unlock(&dev->phy_mutex);
 584}
 585
 586void asix_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
 587{
 588        struct usbnet *dev = netdev_priv(net);
 589        u8 opt;
 590
 591        if (asix_read_cmd(dev, AX_CMD_READ_MONITOR_MODE,
 592                          0, 0, 1, &opt, 0) < 0) {
 593                wolinfo->supported = 0;
 594                wolinfo->wolopts = 0;
 595                return;
 596        }
 597        wolinfo->supported = WAKE_PHY | WAKE_MAGIC;
 598        wolinfo->wolopts = 0;
 599        if (opt & AX_MONITOR_LINK)
 600                wolinfo->wolopts |= WAKE_PHY;
 601        if (opt & AX_MONITOR_MAGIC)
 602                wolinfo->wolopts |= WAKE_MAGIC;
 603}
 604
 605int asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
 606{
 607        struct usbnet *dev = netdev_priv(net);
 608        u8 opt = 0;
 609
 610        if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
 611                return -EINVAL;
 612
 613        if (wolinfo->wolopts & WAKE_PHY)
 614                opt |= AX_MONITOR_LINK;
 615        if (wolinfo->wolopts & WAKE_MAGIC)
 616                opt |= AX_MONITOR_MAGIC;
 617
 618        if (asix_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE,
 619                              opt, 0, 0, NULL, 0) < 0)
 620                return -EINVAL;
 621
 622        return 0;
 623}
 624
 625int asix_get_eeprom_len(struct net_device *net)
 626{
 627        return AX_EEPROM_LEN;
 628}
 629
 630int asix_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom,
 631                    u8 *data)
 632{
 633        struct usbnet *dev = netdev_priv(net);
 634        u16 *eeprom_buff;
 635        int first_word, last_word;
 636        int i;
 637
 638        if (eeprom->len == 0)
 639                return -EINVAL;
 640
 641        eeprom->magic = AX_EEPROM_MAGIC;
 642
 643        first_word = eeprom->offset >> 1;
 644        last_word = (eeprom->offset + eeprom->len - 1) >> 1;
 645
 646        eeprom_buff = kmalloc_array(last_word - first_word + 1, sizeof(u16),
 647                                    GFP_KERNEL);
 648        if (!eeprom_buff)
 649                return -ENOMEM;
 650
 651        /* ax8817x returns 2 bytes from eeprom on read */
 652        for (i = first_word; i <= last_word; i++) {
 653                if (asix_read_cmd(dev, AX_CMD_READ_EEPROM, i, 0, 2,
 654                                  &eeprom_buff[i - first_word], 0) < 0) {
 655                        kfree(eeprom_buff);
 656                        return -EIO;
 657                }
 658        }
 659
 660        memcpy(data, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len);
 661        kfree(eeprom_buff);
 662        return 0;
 663}
 664
 665int asix_set_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom,
 666                    u8 *data)
 667{
 668        struct usbnet *dev = netdev_priv(net);
 669        u16 *eeprom_buff;
 670        int first_word, last_word;
 671        int i;
 672        int ret;
 673
 674        netdev_dbg(net, "write EEPROM len %d, offset %d, magic 0x%x\n",
 675                   eeprom->len, eeprom->offset, eeprom->magic);
 676
 677        if (eeprom->len == 0)
 678                return -EINVAL;
 679
 680        if (eeprom->magic != AX_EEPROM_MAGIC)
 681                return -EINVAL;
 682
 683        first_word = eeprom->offset >> 1;
 684        last_word = (eeprom->offset + eeprom->len - 1) >> 1;
 685
 686        eeprom_buff = kmalloc_array(last_word - first_word + 1, sizeof(u16),
 687                                    GFP_KERNEL);
 688        if (!eeprom_buff)
 689                return -ENOMEM;
 690
 691        /* align data to 16 bit boundaries, read the missing data from
 692           the EEPROM */
 693        if (eeprom->offset & 1) {
 694                ret = asix_read_cmd(dev, AX_CMD_READ_EEPROM, first_word, 0, 2,
 695                                    &eeprom_buff[0], 0);
 696                if (ret < 0) {
 697                        netdev_err(net, "Failed to read EEPROM at offset 0x%02x.\n", first_word);
 698                        goto free;
 699                }
 700        }
 701
 702        if ((eeprom->offset + eeprom->len) & 1) {
 703                ret = asix_read_cmd(dev, AX_CMD_READ_EEPROM, last_word, 0, 2,
 704                                    &eeprom_buff[last_word - first_word], 0);
 705                if (ret < 0) {
 706                        netdev_err(net, "Failed to read EEPROM at offset 0x%02x.\n", last_word);
 707                        goto free;
 708                }
 709        }
 710
 711        memcpy((u8 *)eeprom_buff + (eeprom->offset & 1), data, eeprom->len);
 712
 713        /* write data to EEPROM */
 714        ret = asix_write_cmd(dev, AX_CMD_WRITE_ENABLE, 0x0000, 0, 0, NULL, 0);
 715        if (ret < 0) {
 716                netdev_err(net, "Failed to enable EEPROM write\n");
 717                goto free;
 718        }
 719        msleep(20);
 720
 721        for (i = first_word; i <= last_word; i++) {
 722                netdev_dbg(net, "write to EEPROM at offset 0x%02x, data 0x%04x\n",
 723                           i, eeprom_buff[i - first_word]);
 724                ret = asix_write_cmd(dev, AX_CMD_WRITE_EEPROM, i,
 725                                     eeprom_buff[i - first_word], 0, NULL, 0);
 726                if (ret < 0) {
 727                        netdev_err(net, "Failed to write EEPROM at offset 0x%02x.\n",
 728                                   i);
 729                        goto free;
 730                }
 731                msleep(20);
 732        }
 733
 734        ret = asix_write_cmd(dev, AX_CMD_WRITE_DISABLE, 0x0000, 0, 0, NULL, 0);
 735        if (ret < 0) {
 736                netdev_err(net, "Failed to disable EEPROM write\n");
 737                goto free;
 738        }
 739
 740        ret = 0;
 741free:
 742        kfree(eeprom_buff);
 743        return ret;
 744}
 745
 746void asix_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
 747{
 748        /* Inherit standard device info */
 749        usbnet_get_drvinfo(net, info);
 750        strlcpy(info->driver, DRIVER_NAME, sizeof(info->driver));
 751        strlcpy(info->version, DRIVER_VERSION, sizeof(info->version));
 752}
 753
 754int asix_set_mac_address(struct net_device *net, void *p)
 755{
 756        struct usbnet *dev = netdev_priv(net);
 757        struct asix_data *data = (struct asix_data *)&dev->data;
 758        struct sockaddr *addr = p;
 759
 760        if (netif_running(net))
 761                return -EBUSY;
 762        if (!is_valid_ether_addr(addr->sa_data))
 763                return -EADDRNOTAVAIL;
 764
 765        memcpy(net->dev_addr, addr->sa_data, ETH_ALEN);
 766
 767        /* We use the 20 byte dev->data
 768         * for our 6 byte mac buffer
 769         * to avoid allocating memory that
 770         * is tricky to free later */
 771        memcpy(data->mac_addr, addr->sa_data, ETH_ALEN);
 772        asix_write_cmd_async(dev, AX_CMD_WRITE_NODE_ID, 0, 0, ETH_ALEN,
 773                                                        data->mac_addr);
 774
 775        return 0;
 776}
 777