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