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);
1546