Linux Audio

Check our new training course

Linux kernel drivers training

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