linux/drivers/net/fjes/fjes_main.c
<<
>>
Prefs
   1/*
   2 *  FUJITSU Extended Socket Network Device driver
   3 *  Copyright (c) 2015 FUJITSU LIMITED
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, see <http://www.gnu.org/licenses/>.
  16 *
  17 * The full GNU General Public License is included in this distribution in
  18 * the file called "COPYING".
  19 *
  20 */
  21
  22#include <linux/module.h>
  23#include <linux/types.h>
  24#include <linux/nls.h>
  25#include <linux/platform_device.h>
  26#include <linux/netdevice.h>
  27#include <linux/interrupt.h>
  28
  29#include "fjes.h"
  30
  31#define MAJ 1
  32#define MIN 0
  33#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN)
  34#define DRV_NAME        "fjes"
  35char fjes_driver_name[] = DRV_NAME;
  36char fjes_driver_version[] = DRV_VERSION;
  37static const char fjes_driver_string[] =
  38                "FUJITSU Extended Socket Network Device Driver";
  39static const char fjes_copyright[] =
  40                "Copyright (c) 2015 FUJITSU LIMITED";
  41
  42MODULE_AUTHOR("Taku Izumi <izumi.taku@jp.fujitsu.com>");
  43MODULE_DESCRIPTION("FUJITSU Extended Socket Network Device Driver");
  44MODULE_LICENSE("GPL");
  45MODULE_VERSION(DRV_VERSION);
  46
  47static int fjes_request_irq(struct fjes_adapter *);
  48static void fjes_free_irq(struct fjes_adapter *);
  49
  50static int fjes_open(struct net_device *);
  51static int fjes_close(struct net_device *);
  52static int fjes_setup_resources(struct fjes_adapter *);
  53static void fjes_free_resources(struct fjes_adapter *);
  54static netdev_tx_t fjes_xmit_frame(struct sk_buff *, struct net_device *);
  55static void fjes_raise_intr_rxdata_task(struct work_struct *);
  56static void fjes_tx_stall_task(struct work_struct *);
  57static void fjes_force_close_task(struct work_struct *);
  58static irqreturn_t fjes_intr(int, void*);
  59static struct rtnl_link_stats64 *
  60fjes_get_stats64(struct net_device *, struct rtnl_link_stats64 *);
  61static int fjes_change_mtu(struct net_device *, int);
  62static int fjes_vlan_rx_add_vid(struct net_device *, __be16 proto, u16);
  63static int fjes_vlan_rx_kill_vid(struct net_device *, __be16 proto, u16);
  64static void fjes_tx_retry(struct net_device *);
  65
  66static int fjes_acpi_add(struct acpi_device *);
  67static int fjes_acpi_remove(struct acpi_device *);
  68static acpi_status fjes_get_acpi_resource(struct acpi_resource *, void*);
  69
  70static int fjes_probe(struct platform_device *);
  71static int fjes_remove(struct platform_device *);
  72
  73static int fjes_sw_init(struct fjes_adapter *);
  74static void fjes_netdev_setup(struct net_device *);
  75static void fjes_irq_watch_task(struct work_struct *);
  76static void fjes_watch_unshare_task(struct work_struct *);
  77static void fjes_rx_irq(struct fjes_adapter *, int);
  78static int fjes_poll(struct napi_struct *, int);
  79
  80static const struct acpi_device_id fjes_acpi_ids[] = {
  81        {"PNP0C02", 0},
  82        {"", 0},
  83};
  84MODULE_DEVICE_TABLE(acpi, fjes_acpi_ids);
  85
  86static struct acpi_driver fjes_acpi_driver = {
  87        .name = DRV_NAME,
  88        .class = DRV_NAME,
  89        .owner = THIS_MODULE,
  90        .ids = fjes_acpi_ids,
  91        .ops = {
  92                .add = fjes_acpi_add,
  93                .remove = fjes_acpi_remove,
  94        },
  95};
  96
  97static struct platform_driver fjes_driver = {
  98        .driver = {
  99                .name = DRV_NAME,
 100                .owner = THIS_MODULE,
 101        },
 102        .probe = fjes_probe,
 103        .remove = fjes_remove,
 104};
 105
 106static struct resource fjes_resource[] = {
 107        {
 108                .flags = IORESOURCE_MEM,
 109                .start = 0,
 110                .end = 0,
 111        },
 112        {
 113                .flags = IORESOURCE_IRQ,
 114                .start = 0,
 115                .end = 0,
 116        },
 117};
 118
 119static int fjes_acpi_add(struct acpi_device *device)
 120{
 121        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL};
 122        char str_buf[sizeof(FJES_ACPI_SYMBOL) + 1];
 123        struct platform_device *plat_dev;
 124        union acpi_object *str;
 125        acpi_status status;
 126        int result;
 127
 128        status = acpi_evaluate_object(device->handle, "_STR", NULL, &buffer);
 129        if (ACPI_FAILURE(status))
 130                return -ENODEV;
 131
 132        str = buffer.pointer;
 133        result = utf16s_to_utf8s((wchar_t *)str->string.pointer,
 134                                 str->string.length, UTF16_LITTLE_ENDIAN,
 135                                 str_buf, sizeof(str_buf) - 1);
 136        str_buf[result] = 0;
 137
 138        if (strncmp(FJES_ACPI_SYMBOL, str_buf, strlen(FJES_ACPI_SYMBOL)) != 0) {
 139                kfree(buffer.pointer);
 140                return -ENODEV;
 141        }
 142        kfree(buffer.pointer);
 143
 144        status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
 145                                     fjes_get_acpi_resource, fjes_resource);
 146        if (ACPI_FAILURE(status))
 147                return -ENODEV;
 148
 149        /* create platform_device */
 150        plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource,
 151                                                   ARRAY_SIZE(fjes_resource));
 152        device->driver_data = plat_dev;
 153
 154        return 0;
 155}
 156
 157static int fjes_acpi_remove(struct acpi_device *device)
 158{
 159        struct platform_device *plat_dev;
 160
 161        plat_dev = (struct platform_device *)acpi_driver_data(device);
 162        platform_device_unregister(plat_dev);
 163
 164        return 0;
 165}
 166
 167static acpi_status
 168fjes_get_acpi_resource(struct acpi_resource *acpi_res, void *data)
 169{
 170        struct acpi_resource_address32 *addr;
 171        struct acpi_resource_irq *irq;
 172        struct resource *res = data;
 173
 174        switch (acpi_res->type) {
 175        case ACPI_RESOURCE_TYPE_ADDRESS32:
 176                addr = &acpi_res->data.address32;
 177                res[0].start = addr->address.minimum;
 178                res[0].end = addr->address.minimum +
 179                        addr->address.address_length - 1;
 180                break;
 181
 182        case ACPI_RESOURCE_TYPE_IRQ:
 183                irq = &acpi_res->data.irq;
 184                if (irq->interrupt_count != 1)
 185                        return AE_ERROR;
 186                res[1].start = irq->interrupts[0];
 187                res[1].end = irq->interrupts[0];
 188                break;
 189
 190        default:
 191                break;
 192        }
 193
 194        return AE_OK;
 195}
 196
 197static int fjes_request_irq(struct fjes_adapter *adapter)
 198{
 199        struct net_device *netdev = adapter->netdev;
 200        int result = -1;
 201
 202        adapter->interrupt_watch_enable = true;
 203        if (!delayed_work_pending(&adapter->interrupt_watch_task)) {
 204                queue_delayed_work(adapter->control_wq,
 205                                   &adapter->interrupt_watch_task,
 206                                   FJES_IRQ_WATCH_DELAY);
 207        }
 208
 209        if (!adapter->irq_registered) {
 210                result = request_irq(adapter->hw.hw_res.irq, fjes_intr,
 211                                     IRQF_SHARED, netdev->name, adapter);
 212                if (result)
 213                        adapter->irq_registered = false;
 214                else
 215                        adapter->irq_registered = true;
 216        }
 217
 218        return result;
 219}
 220
 221static void fjes_free_irq(struct fjes_adapter *adapter)
 222{
 223        struct fjes_hw *hw = &adapter->hw;
 224
 225        adapter->interrupt_watch_enable = false;
 226        cancel_delayed_work_sync(&adapter->interrupt_watch_task);
 227
 228        fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true);
 229
 230        if (adapter->irq_registered) {
 231                free_irq(adapter->hw.hw_res.irq, adapter);
 232                adapter->irq_registered = false;
 233        }
 234}
 235
 236static const struct net_device_ops fjes_netdev_ops = {
 237        .ndo_open               = fjes_open,
 238        .ndo_stop               = fjes_close,
 239        .ndo_start_xmit         = fjes_xmit_frame,
 240        .ndo_get_stats64        = fjes_get_stats64,
 241        .ndo_change_mtu         = fjes_change_mtu,
 242        .ndo_tx_timeout         = fjes_tx_retry,
 243        .ndo_vlan_rx_add_vid    = fjes_vlan_rx_add_vid,
 244        .ndo_vlan_rx_kill_vid = fjes_vlan_rx_kill_vid,
 245};
 246
 247/* fjes_open - Called when a network interface is made active */
 248static int fjes_open(struct net_device *netdev)
 249{
 250        struct fjes_adapter *adapter = netdev_priv(netdev);
 251        struct fjes_hw *hw = &adapter->hw;
 252        int result;
 253
 254        if (adapter->open_guard)
 255                return -ENXIO;
 256
 257        result = fjes_setup_resources(adapter);
 258        if (result)
 259                goto err_setup_res;
 260
 261        hw->txrx_stop_req_bit = 0;
 262        hw->epstop_req_bit = 0;
 263
 264        napi_enable(&adapter->napi);
 265
 266        fjes_hw_capture_interrupt_status(hw);
 267
 268        result = fjes_request_irq(adapter);
 269        if (result)
 270                goto err_req_irq;
 271
 272        fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, false);
 273
 274        netif_tx_start_all_queues(netdev);
 275        netif_carrier_on(netdev);
 276
 277        return 0;
 278
 279err_req_irq:
 280        fjes_free_irq(adapter);
 281        napi_disable(&adapter->napi);
 282
 283err_setup_res:
 284        fjes_free_resources(adapter);
 285        return result;
 286}
 287
 288/* fjes_close - Disables a network interface */
 289static int fjes_close(struct net_device *netdev)
 290{
 291        struct fjes_adapter *adapter = netdev_priv(netdev);
 292        struct fjes_hw *hw = &adapter->hw;
 293        int epidx;
 294
 295        netif_tx_stop_all_queues(netdev);
 296        netif_carrier_off(netdev);
 297
 298        fjes_hw_raise_epstop(hw);
 299
 300        napi_disable(&adapter->napi);
 301
 302        for (epidx = 0; epidx < hw->max_epid; epidx++) {
 303                if (epidx == hw->my_epid)
 304                        continue;
 305
 306                adapter->hw.ep_shm_info[epidx].tx.info->v1i.rx_status &=
 307                        ~FJES_RX_POLL_WORK;
 308        }
 309
 310        fjes_free_irq(adapter);
 311
 312        cancel_delayed_work_sync(&adapter->interrupt_watch_task);
 313        cancel_work_sync(&adapter->unshare_watch_task);
 314        adapter->unshare_watch_bitmask = 0;
 315        cancel_work_sync(&adapter->raise_intr_rxdata_task);
 316        cancel_work_sync(&adapter->tx_stall_task);
 317
 318        cancel_work_sync(&hw->update_zone_task);
 319        cancel_work_sync(&hw->epstop_task);
 320
 321        fjes_hw_wait_epstop(hw);
 322
 323        fjes_free_resources(adapter);
 324
 325        return 0;
 326}
 327
 328static int fjes_setup_resources(struct fjes_adapter *adapter)
 329{
 330        struct net_device *netdev = adapter->netdev;
 331        struct ep_share_mem_info *buf_pair;
 332        struct fjes_hw *hw = &adapter->hw;
 333        int result;
 334        int epidx;
 335
 336        mutex_lock(&hw->hw_info.lock);
 337        result = fjes_hw_request_info(hw);
 338        switch (result) {
 339        case 0:
 340                for (epidx = 0; epidx < hw->max_epid; epidx++) {
 341                        hw->ep_shm_info[epidx].es_status =
 342                            hw->hw_info.res_buf->info.info[epidx].es_status;
 343                        hw->ep_shm_info[epidx].zone =
 344                            hw->hw_info.res_buf->info.info[epidx].zone;
 345                }
 346                break;
 347        default:
 348        case -ENOMSG:
 349        case -EBUSY:
 350                adapter->force_reset = true;
 351
 352                mutex_unlock(&hw->hw_info.lock);
 353                return result;
 354        }
 355        mutex_unlock(&hw->hw_info.lock);
 356
 357        for (epidx = 0; epidx < (hw->max_epid); epidx++) {
 358                if ((epidx != hw->my_epid) &&
 359                    (hw->ep_shm_info[epidx].es_status ==
 360                     FJES_ZONING_STATUS_ENABLE)) {
 361                        fjes_hw_raise_interrupt(hw, epidx,
 362                                                REG_ICTL_MASK_INFO_UPDATE);
 363                }
 364        }
 365
 366        msleep(FJES_OPEN_ZONE_UPDATE_WAIT * hw->max_epid);
 367
 368        for (epidx = 0; epidx < (hw->max_epid); epidx++) {
 369                if (epidx == hw->my_epid)
 370                        continue;
 371
 372                buf_pair = &hw->ep_shm_info[epidx];
 373
 374                fjes_hw_setup_epbuf(&buf_pair->tx, netdev->dev_addr,
 375                                    netdev->mtu);
 376
 377                if (fjes_hw_epid_is_same_zone(hw, epidx)) {
 378                        mutex_lock(&hw->hw_info.lock);
 379                        result =
 380                        fjes_hw_register_buff_addr(hw, epidx, buf_pair);
 381                        mutex_unlock(&hw->hw_info.lock);
 382
 383                        switch (result) {
 384                        case 0:
 385                                break;
 386                        case -ENOMSG:
 387                        case -EBUSY:
 388                        default:
 389                                adapter->force_reset = true;
 390                                return result;
 391                        }
 392                }
 393        }
 394
 395        return 0;
 396}
 397
 398static void fjes_free_resources(struct fjes_adapter *adapter)
 399{
 400        struct net_device *netdev = adapter->netdev;
 401        struct fjes_device_command_param param;
 402        struct ep_share_mem_info *buf_pair;
 403        struct fjes_hw *hw = &adapter->hw;
 404        bool reset_flag = false;
 405        int result;
 406        int epidx;
 407
 408        for (epidx = 0; epidx < hw->max_epid; epidx++) {
 409                if (epidx == hw->my_epid)
 410                        continue;
 411
 412                mutex_lock(&hw->hw_info.lock);
 413                result = fjes_hw_unregister_buff_addr(hw, epidx);
 414                mutex_unlock(&hw->hw_info.lock);
 415
 416                if (result)
 417                        reset_flag = true;
 418
 419                buf_pair = &hw->ep_shm_info[epidx];
 420
 421                fjes_hw_setup_epbuf(&buf_pair->tx,
 422                                    netdev->dev_addr, netdev->mtu);
 423
 424                clear_bit(epidx, &hw->txrx_stop_req_bit);
 425        }
 426
 427        if (reset_flag || adapter->force_reset) {
 428                result = fjes_hw_reset(hw);
 429
 430                adapter->force_reset = false;
 431
 432                if (result)
 433                        adapter->open_guard = true;
 434
 435                hw->hw_info.buffer_share_bit = 0;
 436
 437                memset((void *)&param, 0, sizeof(param));
 438
 439                param.req_len = hw->hw_info.req_buf_size;
 440                param.req_start = __pa(hw->hw_info.req_buf);
 441                param.res_len = hw->hw_info.res_buf_size;
 442                param.res_start = __pa(hw->hw_info.res_buf);
 443                param.share_start = __pa(hw->hw_info.share->ep_status);
 444
 445                fjes_hw_init_command_registers(hw, &param);
 446        }
 447}
 448
 449static void fjes_tx_stall_task(struct work_struct *work)
 450{
 451        struct fjes_adapter *adapter = container_of(work,
 452                        struct fjes_adapter, tx_stall_task);
 453        struct net_device *netdev = adapter->netdev;
 454        struct fjes_hw *hw = &adapter->hw;
 455        int all_queue_available, sendable;
 456        enum ep_partner_status pstatus;
 457        int max_epid, my_epid, epid;
 458        union ep_buffer_info *info;
 459        int i;
 460
 461        if (((long)jiffies -
 462                (long)(netdev->trans_start)) > FJES_TX_TX_STALL_TIMEOUT) {
 463                netif_wake_queue(netdev);
 464                return;
 465        }
 466
 467        my_epid = hw->my_epid;
 468        max_epid = hw->max_epid;
 469
 470        for (i = 0; i < 5; i++) {
 471                all_queue_available = 1;
 472
 473                for (epid = 0; epid < max_epid; epid++) {
 474                        if (my_epid == epid)
 475                                continue;
 476
 477                        pstatus = fjes_hw_get_partner_ep_status(hw, epid);
 478                        sendable = (pstatus == EP_PARTNER_SHARED);
 479                        if (!sendable)
 480                                continue;
 481
 482                        info = adapter->hw.ep_shm_info[epid].tx.info;
 483
 484                        if (EP_RING_FULL(info->v1i.head, info->v1i.tail,
 485                                         info->v1i.count_max)) {
 486                                all_queue_available = 0;
 487                                break;
 488                        }
 489                }
 490
 491                if (all_queue_available) {
 492                        netif_wake_queue(netdev);
 493                        return;
 494                }
 495        }
 496
 497        usleep_range(50, 100);
 498
 499        queue_work(adapter->txrx_wq, &adapter->tx_stall_task);
 500}
 501
 502static void fjes_force_close_task(struct work_struct *work)
 503{
 504        struct fjes_adapter *adapter = container_of(work,
 505                        struct fjes_adapter, force_close_task);
 506        struct net_device *netdev = adapter->netdev;
 507
 508        rtnl_lock();
 509        dev_close(netdev);
 510        rtnl_unlock();
 511}
 512
 513static void fjes_raise_intr_rxdata_task(struct work_struct *work)
 514{
 515        struct fjes_adapter *adapter = container_of(work,
 516                        struct fjes_adapter, raise_intr_rxdata_task);
 517        struct fjes_hw *hw = &adapter->hw;
 518        enum ep_partner_status pstatus;
 519        int max_epid, my_epid, epid;
 520
 521        my_epid = hw->my_epid;
 522        max_epid = hw->max_epid;
 523
 524        for (epid = 0; epid < max_epid; epid++)
 525                hw->ep_shm_info[epid].tx_status_work = 0;
 526
 527        for (epid = 0; epid < max_epid; epid++) {
 528                if (epid == my_epid)
 529                        continue;
 530
 531                pstatus = fjes_hw_get_partner_ep_status(hw, epid);
 532                if (pstatus == EP_PARTNER_SHARED) {
 533                        hw->ep_shm_info[epid].tx_status_work =
 534                                hw->ep_shm_info[epid].tx.info->v1i.tx_status;
 535
 536                        if (hw->ep_shm_info[epid].tx_status_work ==
 537                                FJES_TX_DELAY_SEND_PENDING) {
 538                                hw->ep_shm_info[epid].tx.info->v1i.tx_status =
 539                                        FJES_TX_DELAY_SEND_NONE;
 540                        }
 541                }
 542        }
 543
 544        for (epid = 0; epid < max_epid; epid++) {
 545                if (epid == my_epid)
 546                        continue;
 547
 548                pstatus = fjes_hw_get_partner_ep_status(hw, epid);
 549                if ((hw->ep_shm_info[epid].tx_status_work ==
 550                     FJES_TX_DELAY_SEND_PENDING) &&
 551                    (pstatus == EP_PARTNER_SHARED) &&
 552                    !(hw->ep_shm_info[epid].rx.info->v1i.rx_status)) {
 553                        fjes_hw_raise_interrupt(hw, epid,
 554                                                REG_ICTL_MASK_RX_DATA);
 555                }
 556        }
 557
 558        usleep_range(500, 1000);
 559}
 560
 561static int fjes_tx_send(struct fjes_adapter *adapter, int dest,
 562                        void *data, size_t len)
 563{
 564        int retval;
 565
 566        retval = fjes_hw_epbuf_tx_pkt_send(&adapter->hw.ep_shm_info[dest].tx,
 567                                           data, len);
 568        if (retval)
 569                return retval;
 570
 571        adapter->hw.ep_shm_info[dest].tx.info->v1i.tx_status =
 572                FJES_TX_DELAY_SEND_PENDING;
 573        if (!work_pending(&adapter->raise_intr_rxdata_task))
 574                queue_work(adapter->txrx_wq,
 575                           &adapter->raise_intr_rxdata_task);
 576
 577        retval = 0;
 578        return retval;
 579}
 580
 581static netdev_tx_t
 582fjes_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
 583{
 584        struct fjes_adapter *adapter = netdev_priv(netdev);
 585        struct fjes_hw *hw = &adapter->hw;
 586
 587        int max_epid, my_epid, dest_epid;
 588        enum ep_partner_status pstatus;
 589        struct netdev_queue *cur_queue;
 590        char shortpkt[VLAN_ETH_HLEN];
 591        bool is_multi, vlan;
 592        struct ethhdr *eth;
 593        u16 queue_no = 0;
 594        u16 vlan_id = 0;
 595        netdev_tx_t ret;
 596        char *data;
 597        int len;
 598
 599        ret = NETDEV_TX_OK;
 600        is_multi = false;
 601        cur_queue = netdev_get_tx_queue(netdev, queue_no);
 602
 603        eth = (struct ethhdr *)skb->data;
 604        my_epid = hw->my_epid;
 605
 606        vlan = (vlan_get_tag(skb, &vlan_id) == 0) ? true : false;
 607
 608        data = skb->data;
 609        len = skb->len;
 610
 611        if (is_multicast_ether_addr(eth->h_dest)) {
 612                dest_epid = 0;
 613                max_epid = hw->max_epid;
 614                is_multi = true;
 615        } else if (is_local_ether_addr(eth->h_dest)) {
 616                dest_epid = eth->h_dest[ETH_ALEN - 1];
 617                max_epid = dest_epid + 1;
 618
 619                if ((eth->h_dest[0] == 0x02) &&
 620                    (0x00 == (eth->h_dest[1] | eth->h_dest[2] |
 621                              eth->h_dest[3] | eth->h_dest[4])) &&
 622                    (dest_epid < hw->max_epid)) {
 623                        ;
 624                } else {
 625                        dest_epid = 0;
 626                        max_epid = 0;
 627                        ret = NETDEV_TX_OK;
 628
 629                        adapter->stats64.tx_packets += 1;
 630                        hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
 631                        adapter->stats64.tx_bytes += len;
 632                        hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
 633                }
 634        } else {
 635                dest_epid = 0;
 636                max_epid = 0;
 637                ret = NETDEV_TX_OK;
 638
 639                adapter->stats64.tx_packets += 1;
 640                hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
 641                adapter->stats64.tx_bytes += len;
 642                hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
 643        }
 644
 645        for (; dest_epid < max_epid; dest_epid++) {
 646                if (my_epid == dest_epid)
 647                        continue;
 648
 649                pstatus = fjes_hw_get_partner_ep_status(hw, dest_epid);
 650                if (pstatus != EP_PARTNER_SHARED) {
 651                        ret = NETDEV_TX_OK;
 652                } else if (!fjes_hw_check_epbuf_version(
 653                                &adapter->hw.ep_shm_info[dest_epid].rx, 0)) {
 654                        /* version is NOT 0 */
 655                        adapter->stats64.tx_carrier_errors += 1;
 656                        hw->ep_shm_info[my_epid].net_stats
 657                                                .tx_carrier_errors += 1;
 658
 659                        ret = NETDEV_TX_OK;
 660                } else if (!fjes_hw_check_mtu(
 661                                &adapter->hw.ep_shm_info[dest_epid].rx,
 662                                netdev->mtu)) {
 663                        adapter->stats64.tx_dropped += 1;
 664                        hw->ep_shm_info[my_epid].net_stats.tx_dropped += 1;
 665                        adapter->stats64.tx_errors += 1;
 666                        hw->ep_shm_info[my_epid].net_stats.tx_errors += 1;
 667
 668                        ret = NETDEV_TX_OK;
 669                } else if (vlan &&
 670                           !fjes_hw_check_vlan_id(
 671                                &adapter->hw.ep_shm_info[dest_epid].rx,
 672                                vlan_id)) {
 673                        ret = NETDEV_TX_OK;
 674                } else {
 675                        if (len < VLAN_ETH_HLEN) {
 676                                memset(shortpkt, 0, VLAN_ETH_HLEN);
 677                                memcpy(shortpkt, skb->data, skb->len);
 678                                len = VLAN_ETH_HLEN;
 679                                data = shortpkt;
 680                        }
 681
 682                        if (adapter->tx_retry_count == 0) {
 683                                adapter->tx_start_jiffies = jiffies;
 684                                adapter->tx_retry_count = 1;
 685                        } else {
 686                                adapter->tx_retry_count++;
 687                        }
 688
 689                        if (fjes_tx_send(adapter, dest_epid, data, len)) {
 690                                if (is_multi) {
 691                                        ret = NETDEV_TX_OK;
 692                                } else if (
 693                                           ((long)jiffies -
 694                                            (long)adapter->tx_start_jiffies) >=
 695                                            FJES_TX_RETRY_TIMEOUT) {
 696                                        adapter->stats64.tx_fifo_errors += 1;
 697                                        hw->ep_shm_info[my_epid].net_stats
 698                                                                .tx_fifo_errors += 1;
 699                                        adapter->stats64.tx_errors += 1;
 700                                        hw->ep_shm_info[my_epid].net_stats
 701                                                                .tx_errors += 1;
 702
 703                                        ret = NETDEV_TX_OK;
 704                                } else {
 705                                        netdev->trans_start = jiffies;
 706                                        netif_tx_stop_queue(cur_queue);
 707
 708                                        if (!work_pending(&adapter->tx_stall_task))
 709                                                queue_work(adapter->txrx_wq,
 710                                                           &adapter->tx_stall_task);
 711
 712                                        ret = NETDEV_TX_BUSY;
 713                                }
 714                        } else {
 715                                if (!is_multi) {
 716                                        adapter->stats64.tx_packets += 1;
 717                                        hw->ep_shm_info[my_epid].net_stats
 718                                                                .tx_packets += 1;
 719                                        adapter->stats64.tx_bytes += len;
 720                                        hw->ep_shm_info[my_epid].net_stats
 721                                                                .tx_bytes += len;
 722                                }
 723
 724                                adapter->tx_retry_count = 0;
 725                                ret = NETDEV_TX_OK;
 726                        }
 727                }
 728        }
 729
 730        if (ret == NETDEV_TX_OK) {
 731                dev_kfree_skb(skb);
 732                if (is_multi) {
 733                        adapter->stats64.tx_packets += 1;
 734                        hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
 735                        adapter->stats64.tx_bytes += 1;
 736                        hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
 737                }
 738        }
 739
 740        return ret;
 741}
 742
 743static void fjes_tx_retry(struct net_device *netdev)
 744{
 745        struct netdev_queue *queue = netdev_get_tx_queue(netdev, 0);
 746
 747        netif_tx_wake_queue(queue);
 748}
 749
 750static struct rtnl_link_stats64 *
 751fjes_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
 752{
 753        struct fjes_adapter *adapter = netdev_priv(netdev);
 754
 755        memcpy(stats, &adapter->stats64, sizeof(struct rtnl_link_stats64));
 756
 757        return stats;
 758}
 759
 760static int fjes_change_mtu(struct net_device *netdev, int new_mtu)
 761{
 762        bool running = netif_running(netdev);
 763        int ret = 0;
 764        int idx;
 765
 766        for (idx = 0; fjes_support_mtu[idx] != 0; idx++) {
 767                if (new_mtu <= fjes_support_mtu[idx]) {
 768                        new_mtu = fjes_support_mtu[idx];
 769                        if (new_mtu == netdev->mtu)
 770                                return 0;
 771
 772                        if (running)
 773                                fjes_close(netdev);
 774
 775                        netdev->mtu = new_mtu;
 776
 777                        if (running)
 778                                ret = fjes_open(netdev);
 779
 780                        return ret;
 781                }
 782        }
 783
 784        return -EINVAL;
 785}
 786
 787static int fjes_vlan_rx_add_vid(struct net_device *netdev,
 788                                __be16 proto, u16 vid)
 789{
 790        struct fjes_adapter *adapter = netdev_priv(netdev);
 791        bool ret = true;
 792        int epid;
 793
 794        for (epid = 0; epid < adapter->hw.max_epid; epid++) {
 795                if (epid == adapter->hw.my_epid)
 796                        continue;
 797
 798                if (!fjes_hw_check_vlan_id(
 799                        &adapter->hw.ep_shm_info[epid].tx, vid))
 800                        ret = fjes_hw_set_vlan_id(
 801                                &adapter->hw.ep_shm_info[epid].tx, vid);
 802        }
 803
 804        return ret ? 0 : -ENOSPC;
 805}
 806
 807static int fjes_vlan_rx_kill_vid(struct net_device *netdev,
 808                                 __be16 proto, u16 vid)
 809{
 810        struct fjes_adapter *adapter = netdev_priv(netdev);
 811        int epid;
 812
 813        for (epid = 0; epid < adapter->hw.max_epid; epid++) {
 814                if (epid == adapter->hw.my_epid)
 815                        continue;
 816
 817                fjes_hw_del_vlan_id(&adapter->hw.ep_shm_info[epid].tx, vid);
 818        }
 819
 820        return 0;
 821}
 822
 823static void fjes_txrx_stop_req_irq(struct fjes_adapter *adapter,
 824                                   int src_epid)
 825{
 826        struct fjes_hw *hw = &adapter->hw;
 827        enum ep_partner_status status;
 828
 829        status = fjes_hw_get_partner_ep_status(hw, src_epid);
 830        switch (status) {
 831        case EP_PARTNER_UNSHARE:
 832        case EP_PARTNER_COMPLETE:
 833        default:
 834                break;
 835        case EP_PARTNER_WAITING:
 836                if (src_epid < hw->my_epid) {
 837                        hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
 838                                FJES_RX_STOP_REQ_DONE;
 839
 840                        clear_bit(src_epid, &hw->txrx_stop_req_bit);
 841                        set_bit(src_epid, &adapter->unshare_watch_bitmask);
 842
 843                        if (!work_pending(&adapter->unshare_watch_task))
 844                                queue_work(adapter->control_wq,
 845                                           &adapter->unshare_watch_task);
 846                }
 847                break;
 848        case EP_PARTNER_SHARED:
 849                if (hw->ep_shm_info[src_epid].rx.info->v1i.rx_status &
 850                    FJES_RX_STOP_REQ_REQUEST) {
 851                        set_bit(src_epid, &hw->epstop_req_bit);
 852                        if (!work_pending(&hw->epstop_task))
 853                                queue_work(adapter->control_wq,
 854                                           &hw->epstop_task);
 855                }
 856                break;
 857        }
 858}
 859
 860static void fjes_stop_req_irq(struct fjes_adapter *adapter, int src_epid)
 861{
 862        struct fjes_hw *hw = &adapter->hw;
 863        enum ep_partner_status status;
 864
 865        set_bit(src_epid, &hw->hw_info.buffer_unshare_reserve_bit);
 866
 867        status = fjes_hw_get_partner_ep_status(hw, src_epid);
 868        switch (status) {
 869        case EP_PARTNER_WAITING:
 870                hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
 871                                FJES_RX_STOP_REQ_DONE;
 872                clear_bit(src_epid, &hw->txrx_stop_req_bit);
 873                /* fall through */
 874        case EP_PARTNER_UNSHARE:
 875        case EP_PARTNER_COMPLETE:
 876        default:
 877                set_bit(src_epid, &adapter->unshare_watch_bitmask);
 878                if (!work_pending(&adapter->unshare_watch_task))
 879                        queue_work(adapter->control_wq,
 880                                   &adapter->unshare_watch_task);
 881                break;
 882        case EP_PARTNER_SHARED:
 883                set_bit(src_epid, &hw->epstop_req_bit);
 884
 885                if (!work_pending(&hw->epstop_task))
 886                        queue_work(adapter->control_wq, &hw->epstop_task);
 887                break;
 888        }
 889}
 890
 891static void fjes_update_zone_irq(struct fjes_adapter *adapter,
 892                                 int src_epid)
 893{
 894        struct fjes_hw *hw = &adapter->hw;
 895
 896        if (!work_pending(&hw->update_zone_task))
 897                queue_work(adapter->control_wq, &hw->update_zone_task);
 898}
 899
 900static irqreturn_t fjes_intr(int irq, void *data)
 901{
 902        struct fjes_adapter *adapter = data;
 903        struct fjes_hw *hw = &adapter->hw;
 904        irqreturn_t ret;
 905        u32 icr;
 906
 907        icr = fjes_hw_capture_interrupt_status(hw);
 908
 909        if (icr & REG_IS_MASK_IS_ASSERT) {
 910                if (icr & REG_ICTL_MASK_RX_DATA)
 911                        fjes_rx_irq(adapter, icr & REG_IS_MASK_EPID);
 912
 913                if (icr & REG_ICTL_MASK_DEV_STOP_REQ)
 914                        fjes_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
 915
 916                if (icr & REG_ICTL_MASK_TXRX_STOP_REQ)
 917                        fjes_txrx_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
 918
 919                if (icr & REG_ICTL_MASK_TXRX_STOP_DONE)
 920                        fjes_hw_set_irqmask(hw,
 921                                            REG_ICTL_MASK_TXRX_STOP_DONE, true);
 922
 923                if (icr & REG_ICTL_MASK_INFO_UPDATE)
 924                        fjes_update_zone_irq(adapter, icr & REG_IS_MASK_EPID);
 925
 926                ret = IRQ_HANDLED;
 927        } else {
 928                ret = IRQ_NONE;
 929        }
 930
 931        return ret;
 932}
 933
 934static int fjes_rxframe_search_exist(struct fjes_adapter *adapter,
 935                                     int start_epid)
 936{
 937        struct fjes_hw *hw = &adapter->hw;
 938        enum ep_partner_status pstatus;
 939        int max_epid, cur_epid;
 940        int i;
 941
 942        max_epid = hw->max_epid;
 943        start_epid = (start_epid + 1 + max_epid) % max_epid;
 944
 945        for (i = 0; i < max_epid; i++) {
 946                cur_epid = (start_epid + i) % max_epid;
 947                if (cur_epid == hw->my_epid)
 948                        continue;
 949
 950                pstatus = fjes_hw_get_partner_ep_status(hw, cur_epid);
 951                if (pstatus == EP_PARTNER_SHARED) {
 952                        if (!fjes_hw_epbuf_rx_is_empty(
 953                                &hw->ep_shm_info[cur_epid].rx))
 954                                return cur_epid;
 955                }
 956        }
 957        return -1;
 958}
 959
 960static void *fjes_rxframe_get(struct fjes_adapter *adapter, size_t *psize,
 961                              int *cur_epid)
 962{
 963        void *frame;
 964
 965        *cur_epid = fjes_rxframe_search_exist(adapter, *cur_epid);
 966        if (*cur_epid < 0)
 967                return NULL;
 968
 969        frame =
 970        fjes_hw_epbuf_rx_curpkt_get_addr(
 971                &adapter->hw.ep_shm_info[*cur_epid].rx, psize);
 972
 973        return frame;
 974}
 975
 976static void fjes_rxframe_release(struct fjes_adapter *adapter, int cur_epid)
 977{
 978        fjes_hw_epbuf_rx_curpkt_drop(&adapter->hw.ep_shm_info[cur_epid].rx);
 979}
 980
 981static void fjes_rx_irq(struct fjes_adapter *adapter, int src_epid)
 982{
 983        struct fjes_hw *hw = &adapter->hw;
 984
 985        fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, true);
 986
 987        adapter->unset_rx_last = true;
 988        napi_schedule(&adapter->napi);
 989}
 990
 991static int fjes_poll(struct napi_struct *napi, int budget)
 992{
 993        struct fjes_adapter *adapter =
 994                        container_of(napi, struct fjes_adapter, napi);
 995        struct net_device *netdev = napi->dev;
 996        struct fjes_hw *hw = &adapter->hw;
 997        struct sk_buff *skb;
 998        int work_done = 0;
 999        int cur_epid = 0;
1000        int epidx;
1001        size_t frame_len;
1002        void *frame;
1003
1004        for (epidx = 0; epidx < hw->max_epid; epidx++) {
1005                if (epidx == hw->my_epid)
1006                        continue;
1007
1008                adapter->hw.ep_shm_info[epidx].tx.info->v1i.rx_status |=
1009                        FJES_RX_POLL_WORK;
1010        }
1011
1012        while (work_done < budget) {
1013                prefetch(&adapter->hw);
1014                frame = fjes_rxframe_get(adapter, &frame_len, &cur_epid);
1015
1016                if (frame) {
1017                        skb = napi_alloc_skb(napi, frame_len);
1018                        if (!skb) {
1019                                adapter->stats64.rx_dropped += 1;
1020                                hw->ep_shm_info[cur_epid].net_stats
1021                                                         .rx_dropped += 1;
1022                                adapter->stats64.rx_errors += 1;
1023                                hw->ep_shm_info[cur_epid].net_stats
1024                                                         .rx_errors += 1;
1025                        } else {
1026                                memcpy(skb_put(skb, frame_len),
1027                                       frame, frame_len);
1028                                skb->protocol = eth_type_trans(skb, netdev);
1029                                skb->ip_summed = CHECKSUM_UNNECESSARY;
1030
1031                                netif_receive_skb(skb);
1032
1033                                work_done++;
1034
1035                                adapter->stats64.rx_packets += 1;
1036                                hw->ep_shm_info[cur_epid].net_stats
1037                                                         .rx_packets += 1;
1038                                adapter->stats64.rx_bytes += frame_len;
1039                                hw->ep_shm_info[cur_epid].net_stats
1040                                                         .rx_bytes += frame_len;
1041
1042                                if (is_multicast_ether_addr(
1043                                        ((struct ethhdr *)frame)->h_dest)) {
1044                                        adapter->stats64.multicast += 1;
1045                                        hw->ep_shm_info[cur_epid].net_stats
1046                                                                 .multicast += 1;
1047                                }
1048                        }
1049
1050                        fjes_rxframe_release(adapter, cur_epid);
1051                        adapter->unset_rx_last = true;
1052                } else {
1053                        break;
1054                }
1055        }
1056
1057        if (work_done < budget) {
1058                napi_complete(napi);
1059
1060                if (adapter->unset_rx_last) {
1061                        adapter->rx_last_jiffies = jiffies;
1062                        adapter->unset_rx_last = false;
1063                }
1064
1065                if (((long)jiffies - (long)adapter->rx_last_jiffies) < 3) {
1066                        napi_reschedule(napi);
1067                } else {
1068                        for (epidx = 0; epidx < hw->max_epid; epidx++) {
1069                                if (epidx == hw->my_epid)
1070                                        continue;
1071                                adapter->hw.ep_shm_info[epidx]
1072                                           .tx.info->v1i.rx_status &=
1073                                                ~FJES_RX_POLL_WORK;
1074                        }
1075
1076                        fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, false);
1077                }
1078        }
1079
1080        return work_done;
1081}
1082
1083/* fjes_probe - Device Initialization Routine */
1084static int fjes_probe(struct platform_device *plat_dev)
1085{
1086        struct fjes_adapter *adapter;
1087        struct net_device *netdev;
1088        struct resource *res;
1089        struct fjes_hw *hw;
1090        int err;
1091
1092        err = -ENOMEM;
1093        netdev = alloc_netdev_mq(sizeof(struct fjes_adapter), "es%d",
1094                                 NET_NAME_UNKNOWN, fjes_netdev_setup,
1095                                 FJES_MAX_QUEUES);
1096
1097        if (!netdev)
1098                goto err_out;
1099
1100        SET_NETDEV_DEV(netdev, &plat_dev->dev);
1101
1102        dev_set_drvdata(&plat_dev->dev, netdev);
1103        adapter = netdev_priv(netdev);
1104        adapter->netdev = netdev;
1105        adapter->plat_dev = plat_dev;
1106        hw = &adapter->hw;
1107        hw->back = adapter;
1108
1109        /* setup the private structure */
1110        err = fjes_sw_init(adapter);
1111        if (err)
1112                goto err_free_netdev;
1113
1114        INIT_WORK(&adapter->force_close_task, fjes_force_close_task);
1115        adapter->force_reset = false;
1116        adapter->open_guard = false;
1117
1118        adapter->txrx_wq = create_workqueue(DRV_NAME "/txrx");
1119        adapter->control_wq = create_workqueue(DRV_NAME "/control");
1120
1121        INIT_WORK(&adapter->tx_stall_task, fjes_tx_stall_task);
1122        INIT_WORK(&adapter->raise_intr_rxdata_task,
1123                  fjes_raise_intr_rxdata_task);
1124        INIT_WORK(&adapter->unshare_watch_task, fjes_watch_unshare_task);
1125        adapter->unshare_watch_bitmask = 0;
1126
1127        INIT_DELAYED_WORK(&adapter->interrupt_watch_task, fjes_irq_watch_task);
1128        adapter->interrupt_watch_enable = false;
1129
1130        res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
1131        hw->hw_res.start = res->start;
1132        hw->hw_res.size = res->end - res->start + 1;
1133        hw->hw_res.irq = platform_get_irq(plat_dev, 0);
1134        err = fjes_hw_init(&adapter->hw);
1135        if (err)
1136                goto err_free_netdev;
1137
1138        /* setup MAC address (02:00:00:00:00:[epid])*/
1139        netdev->dev_addr[0] = 2;
1140        netdev->dev_addr[1] = 0;
1141        netdev->dev_addr[2] = 0;
1142        netdev->dev_addr[3] = 0;
1143        netdev->dev_addr[4] = 0;
1144        netdev->dev_addr[5] = hw->my_epid; /* EPID */
1145
1146        err = register_netdev(netdev);
1147        if (err)
1148                goto err_hw_exit;
1149
1150        netif_carrier_off(netdev);
1151
1152        return 0;
1153
1154err_hw_exit:
1155        fjes_hw_exit(&adapter->hw);
1156err_free_netdev:
1157        free_netdev(netdev);
1158err_out:
1159        return err;
1160}
1161
1162/* fjes_remove - Device Removal Routine */
1163static int fjes_remove(struct platform_device *plat_dev)
1164{
1165        struct net_device *netdev = dev_get_drvdata(&plat_dev->dev);
1166        struct fjes_adapter *adapter = netdev_priv(netdev);
1167        struct fjes_hw *hw = &adapter->hw;
1168
1169        cancel_delayed_work_sync(&adapter->interrupt_watch_task);
1170        cancel_work_sync(&adapter->unshare_watch_task);
1171        cancel_work_sync(&adapter->raise_intr_rxdata_task);
1172        cancel_work_sync(&adapter->tx_stall_task);
1173        if (adapter->control_wq)
1174                destroy_workqueue(adapter->control_wq);
1175        if (adapter->txrx_wq)
1176                destroy_workqueue(adapter->txrx_wq);
1177
1178        unregister_netdev(netdev);
1179
1180        fjes_hw_exit(hw);
1181
1182        netif_napi_del(&adapter->napi);
1183
1184        free_netdev(netdev);
1185
1186        return 0;
1187}
1188
1189static int fjes_sw_init(struct fjes_adapter *adapter)
1190{
1191        struct net_device *netdev = adapter->netdev;
1192
1193        netif_napi_add(netdev, &adapter->napi, fjes_poll, 64);
1194
1195        return 0;
1196}
1197
1198/* fjes_netdev_setup - netdevice initialization routine */
1199static void fjes_netdev_setup(struct net_device *netdev)
1200{
1201        ether_setup(netdev);
1202
1203        netdev->watchdog_timeo = FJES_TX_RETRY_INTERVAL;
1204        netdev->netdev_ops = &fjes_netdev_ops;
1205        fjes_set_ethtool_ops(netdev);
1206        netdev->mtu = fjes_support_mtu[0];
1207        netdev->flags |= IFF_BROADCAST;
1208        netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER;
1209}
1210
1211static void fjes_irq_watch_task(struct work_struct *work)
1212{
1213        struct fjes_adapter *adapter = container_of(to_delayed_work(work),
1214                        struct fjes_adapter, interrupt_watch_task);
1215
1216        local_irq_disable();
1217        fjes_intr(adapter->hw.hw_res.irq, adapter);
1218        local_irq_enable();
1219
1220        if (fjes_rxframe_search_exist(adapter, 0) >= 0)
1221                napi_schedule(&adapter->napi);
1222
1223        if (adapter->interrupt_watch_enable) {
1224                if (!delayed_work_pending(&adapter->interrupt_watch_task))
1225                        queue_delayed_work(adapter->control_wq,
1226                                           &adapter->interrupt_watch_task,
1227                                           FJES_IRQ_WATCH_DELAY);
1228        }
1229}
1230
1231static void fjes_watch_unshare_task(struct work_struct *work)
1232{
1233        struct fjes_adapter *adapter =
1234        container_of(work, struct fjes_adapter, unshare_watch_task);
1235
1236        struct net_device *netdev = adapter->netdev;
1237        struct fjes_hw *hw = &adapter->hw;
1238
1239        int unshare_watch, unshare_reserve;
1240        int max_epid, my_epid, epidx;
1241        int stop_req, stop_req_done;
1242        ulong unshare_watch_bitmask;
1243        int wait_time = 0;
1244        int is_shared;
1245        int ret;
1246
1247        my_epid = hw->my_epid;
1248        max_epid = hw->max_epid;
1249
1250        unshare_watch_bitmask = adapter->unshare_watch_bitmask;
1251        adapter->unshare_watch_bitmask = 0;
1252
1253        while ((unshare_watch_bitmask || hw->txrx_stop_req_bit) &&
1254               (wait_time < 3000)) {
1255                for (epidx = 0; epidx < hw->max_epid; epidx++) {
1256                        if (epidx == hw->my_epid)
1257                                continue;
1258
1259                        is_shared = fjes_hw_epid_is_shared(hw->hw_info.share,
1260                                                           epidx);
1261
1262                        stop_req = test_bit(epidx, &hw->txrx_stop_req_bit);
1263
1264                        stop_req_done = hw->ep_shm_info[epidx].rx.info->v1i.rx_status &
1265                                        FJES_RX_STOP_REQ_DONE;
1266
1267                        unshare_watch = test_bit(epidx, &unshare_watch_bitmask);
1268
1269                        unshare_reserve = test_bit(epidx,
1270                                                   &hw->hw_info.buffer_unshare_reserve_bit);
1271
1272                        if ((!stop_req ||
1273                             (is_shared && (!is_shared || !stop_req_done))) &&
1274                            (is_shared || !unshare_watch || !unshare_reserve))
1275                                continue;
1276
1277                        mutex_lock(&hw->hw_info.lock);
1278                        ret = fjes_hw_unregister_buff_addr(hw, epidx);
1279                        switch (ret) {
1280                        case 0:
1281                                break;
1282                        case -ENOMSG:
1283                        case -EBUSY:
1284                        default:
1285                                if (!work_pending(
1286                                        &adapter->force_close_task)) {
1287                                        adapter->force_reset = true;
1288                                        schedule_work(
1289                                                &adapter->force_close_task);
1290                                }
1291                                break;
1292                        }
1293                        mutex_unlock(&hw->hw_info.lock);
1294
1295                        fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
1296                                            netdev->dev_addr, netdev->mtu);
1297
1298                        clear_bit(epidx, &hw->txrx_stop_req_bit);
1299                        clear_bit(epidx, &unshare_watch_bitmask);
1300                        clear_bit(epidx,
1301                                  &hw->hw_info.buffer_unshare_reserve_bit);
1302                }
1303
1304                msleep(100);
1305                wait_time += 100;
1306        }
1307
1308        if (hw->hw_info.buffer_unshare_reserve_bit) {
1309                for (epidx = 0; epidx < hw->max_epid; epidx++) {
1310                        if (epidx == hw->my_epid)
1311                                continue;
1312
1313                        if (test_bit(epidx,
1314                                     &hw->hw_info.buffer_unshare_reserve_bit)) {
1315                                mutex_lock(&hw->hw_info.lock);
1316
1317                                ret = fjes_hw_unregister_buff_addr(hw, epidx);
1318                                switch (ret) {
1319                                case 0:
1320                                        break;
1321                                case -ENOMSG:
1322                                case -EBUSY:
1323                                default:
1324                                        if (!work_pending(
1325                                                &adapter->force_close_task)) {
1326                                                adapter->force_reset = true;
1327                                                schedule_work(
1328                                                        &adapter->force_close_task);
1329                                        }
1330                                        break;
1331                                }
1332                                mutex_unlock(&hw->hw_info.lock);
1333
1334                                fjes_hw_setup_epbuf(
1335                                        &hw->ep_shm_info[epidx].tx,
1336                                        netdev->dev_addr, netdev->mtu);
1337
1338                                clear_bit(epidx, &hw->txrx_stop_req_bit);
1339                                clear_bit(epidx, &unshare_watch_bitmask);
1340                                clear_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit);
1341                        }
1342
1343                        if (test_bit(epidx, &unshare_watch_bitmask)) {
1344                                hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
1345                                                ~FJES_RX_STOP_REQ_DONE;
1346                        }
1347                }
1348        }
1349}
1350
1351/* fjes_init_module - Driver Registration Routine */
1352static int __init fjes_init_module(void)
1353{
1354        int result;
1355
1356        pr_info("%s - version %s - %s\n",
1357                fjes_driver_string, fjes_driver_version, fjes_copyright);
1358
1359        result = platform_driver_register(&fjes_driver);
1360        if (result < 0)
1361                return result;
1362
1363        result = acpi_bus_register_driver(&fjes_acpi_driver);
1364        if (result < 0)
1365                goto fail_acpi_driver;
1366
1367        return 0;
1368
1369fail_acpi_driver:
1370        platform_driver_unregister(&fjes_driver);
1371        return result;
1372}
1373
1374module_init(fjes_init_module);
1375
1376/* fjes_exit_module - Driver Exit Cleanup Routine */
1377static void __exit fjes_exit_module(void)
1378{
1379        acpi_bus_unregister_driver(&fjes_acpi_driver);
1380        platform_driver_unregister(&fjes_driver);
1381}
1382
1383module_exit(fjes_exit_module);
1384