xref: /openbmc/linux/net/ncsi/ncsi-manage.c (revision 53809828)
1 /*
2  * Copyright Gavin Shan, IBM Corporation 2016.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 
10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/netdevice.h>
14 #include <linux/skbuff.h>
15 
16 #include <net/ncsi.h>
17 #include <net/net_namespace.h>
18 #include <net/sock.h>
19 #include <net/addrconf.h>
20 #include <net/ipv6.h>
21 #include <net/if_inet6.h>
22 #include <net/genetlink.h>
23 
24 #include "internal.h"
25 #include "ncsi-pkt.h"
26 #include "ncsi-netlink.h"
27 
28 LIST_HEAD(ncsi_dev_list);
29 DEFINE_SPINLOCK(ncsi_dev_lock);
30 
31 static void ncsi_report_link(struct ncsi_dev_priv *ndp, bool force_down)
32 {
33 	struct ncsi_dev *nd = &ndp->ndev;
34 	struct ncsi_package *np;
35 	struct ncsi_channel *nc;
36 	unsigned long flags;
37 
38 	nd->state = ncsi_dev_state_functional;
39 	if (force_down) {
40 		nd->link_up = 0;
41 		goto report;
42 	}
43 
44 	nd->link_up = 0;
45 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
46 		NCSI_FOR_EACH_CHANNEL(np, nc) {
47 			spin_lock_irqsave(&nc->lock, flags);
48 
49 			if (!list_empty(&nc->link) ||
50 			    nc->state != NCSI_CHANNEL_ACTIVE) {
51 				spin_unlock_irqrestore(&nc->lock, flags);
52 				continue;
53 			}
54 
55 			if (nc->modes[NCSI_MODE_LINK].data[2] & 0x1) {
56 				spin_unlock_irqrestore(&nc->lock, flags);
57 				nd->link_up = 1;
58 				goto report;
59 			}
60 
61 			spin_unlock_irqrestore(&nc->lock, flags);
62 		}
63 	}
64 
65 report:
66 	nd->handler(nd);
67 }
68 
69 static void ncsi_channel_monitor(struct timer_list *t)
70 {
71 	struct ncsi_channel *nc = from_timer(nc, t, monitor.timer);
72 	struct ncsi_package *np = nc->package;
73 	struct ncsi_dev_priv *ndp = np->ndp;
74 	struct ncsi_channel_mode *ncm;
75 	struct ncsi_cmd_arg nca;
76 	bool enabled, chained;
77 	unsigned int monitor_state;
78 	unsigned long flags;
79 	int state, ret;
80 
81 	spin_lock_irqsave(&nc->lock, flags);
82 	state = nc->state;
83 	chained = !list_empty(&nc->link);
84 	enabled = nc->monitor.enabled;
85 	monitor_state = nc->monitor.state;
86 	spin_unlock_irqrestore(&nc->lock, flags);
87 
88 	if (!enabled || chained) {
89 		ncsi_stop_channel_monitor(nc);
90 		return;
91 	}
92 	if (state != NCSI_CHANNEL_INACTIVE &&
93 	    state != NCSI_CHANNEL_ACTIVE) {
94 		ncsi_stop_channel_monitor(nc);
95 		return;
96 	}
97 
98 	switch (monitor_state) {
99 	case NCSI_CHANNEL_MONITOR_START:
100 	case NCSI_CHANNEL_MONITOR_RETRY:
101 		nca.ndp = ndp;
102 		nca.package = np->id;
103 		nca.channel = nc->id;
104 		nca.type = NCSI_PKT_CMD_GLS;
105 		nca.req_flags = 0;
106 		ret = ncsi_xmit_cmd(&nca);
107 		if (ret)
108 			netdev_err(ndp->ndev.dev, "Error %d sending GLS\n",
109 				   ret);
110 		break;
111 	case NCSI_CHANNEL_MONITOR_WAIT ... NCSI_CHANNEL_MONITOR_WAIT_MAX:
112 		break;
113 	default:
114 		netdev_err(ndp->ndev.dev, "NCSI Channel %d timed out!\n",
115 			   nc->id);
116 		if (!(ndp->flags & NCSI_DEV_HWA)) {
117 			ncsi_report_link(ndp, true);
118 			ndp->flags |= NCSI_DEV_RESHUFFLE;
119 		}
120 
121 		ncsi_stop_channel_monitor(nc);
122 
123 		ncm = &nc->modes[NCSI_MODE_LINK];
124 		spin_lock_irqsave(&nc->lock, flags);
125 		nc->state = NCSI_CHANNEL_INVISIBLE;
126 		ncm->data[2] &= ~0x1;
127 		spin_unlock_irqrestore(&nc->lock, flags);
128 
129 		spin_lock_irqsave(&ndp->lock, flags);
130 		nc->state = NCSI_CHANNEL_ACTIVE;
131 		list_add_tail_rcu(&nc->link, &ndp->channel_queue);
132 		spin_unlock_irqrestore(&ndp->lock, flags);
133 		ncsi_process_next_channel(ndp);
134 		return;
135 	}
136 
137 	spin_lock_irqsave(&nc->lock, flags);
138 	nc->monitor.state++;
139 	spin_unlock_irqrestore(&nc->lock, flags);
140 	mod_timer(&nc->monitor.timer, jiffies + HZ);
141 }
142 
143 void ncsi_start_channel_monitor(struct ncsi_channel *nc)
144 {
145 	unsigned long flags;
146 
147 	spin_lock_irqsave(&nc->lock, flags);
148 	WARN_ON_ONCE(nc->monitor.enabled);
149 	nc->monitor.enabled = true;
150 	nc->monitor.state = NCSI_CHANNEL_MONITOR_START;
151 	spin_unlock_irqrestore(&nc->lock, flags);
152 
153 	mod_timer(&nc->monitor.timer, jiffies + HZ);
154 }
155 
156 void ncsi_stop_channel_monitor(struct ncsi_channel *nc)
157 {
158 	unsigned long flags;
159 
160 	spin_lock_irqsave(&nc->lock, flags);
161 	if (!nc->monitor.enabled) {
162 		spin_unlock_irqrestore(&nc->lock, flags);
163 		return;
164 	}
165 	nc->monitor.enabled = false;
166 	spin_unlock_irqrestore(&nc->lock, flags);
167 
168 	del_timer_sync(&nc->monitor.timer);
169 }
170 
171 struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np,
172 				       unsigned char id)
173 {
174 	struct ncsi_channel *nc;
175 
176 	NCSI_FOR_EACH_CHANNEL(np, nc) {
177 		if (nc->id == id)
178 			return nc;
179 	}
180 
181 	return NULL;
182 }
183 
184 struct ncsi_channel *ncsi_add_channel(struct ncsi_package *np, unsigned char id)
185 {
186 	struct ncsi_channel *nc, *tmp;
187 	int index;
188 	unsigned long flags;
189 
190 	nc = kzalloc(sizeof(*nc), GFP_ATOMIC);
191 	if (!nc)
192 		return NULL;
193 
194 	nc->id = id;
195 	nc->package = np;
196 	nc->state = NCSI_CHANNEL_INACTIVE;
197 	nc->monitor.enabled = false;
198 	timer_setup(&nc->monitor.timer, ncsi_channel_monitor, 0);
199 	spin_lock_init(&nc->lock);
200 	INIT_LIST_HEAD(&nc->link);
201 	for (index = 0; index < NCSI_CAP_MAX; index++)
202 		nc->caps[index].index = index;
203 	for (index = 0; index < NCSI_MODE_MAX; index++)
204 		nc->modes[index].index = index;
205 
206 	spin_lock_irqsave(&np->lock, flags);
207 	tmp = ncsi_find_channel(np, id);
208 	if (tmp) {
209 		spin_unlock_irqrestore(&np->lock, flags);
210 		kfree(nc);
211 		return tmp;
212 	}
213 
214 	list_add_tail_rcu(&nc->node, &np->channels);
215 	np->channel_num++;
216 	spin_unlock_irqrestore(&np->lock, flags);
217 
218 	return nc;
219 }
220 
221 static void ncsi_remove_channel(struct ncsi_channel *nc)
222 {
223 	struct ncsi_package *np = nc->package;
224 	unsigned long flags;
225 
226 	spin_lock_irqsave(&nc->lock, flags);
227 
228 	/* Release filters */
229 	kfree(nc->mac_filter.addrs);
230 	kfree(nc->vlan_filter.vids);
231 
232 	nc->state = NCSI_CHANNEL_INACTIVE;
233 	spin_unlock_irqrestore(&nc->lock, flags);
234 	ncsi_stop_channel_monitor(nc);
235 
236 	/* Remove and free channel */
237 	spin_lock_irqsave(&np->lock, flags);
238 	list_del_rcu(&nc->node);
239 	np->channel_num--;
240 	spin_unlock_irqrestore(&np->lock, flags);
241 
242 	kfree(nc);
243 }
244 
245 struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp,
246 				       unsigned char id)
247 {
248 	struct ncsi_package *np;
249 
250 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
251 		if (np->id == id)
252 			return np;
253 	}
254 
255 	return NULL;
256 }
257 
258 struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp,
259 				      unsigned char id)
260 {
261 	struct ncsi_package *np, *tmp;
262 	unsigned long flags;
263 
264 	np = kzalloc(sizeof(*np), GFP_ATOMIC);
265 	if (!np)
266 		return NULL;
267 
268 	np->id = id;
269 	np->ndp = ndp;
270 	spin_lock_init(&np->lock);
271 	INIT_LIST_HEAD(&np->channels);
272 
273 	spin_lock_irqsave(&ndp->lock, flags);
274 	tmp = ncsi_find_package(ndp, id);
275 	if (tmp) {
276 		spin_unlock_irqrestore(&ndp->lock, flags);
277 		kfree(np);
278 		return tmp;
279 	}
280 
281 	list_add_tail_rcu(&np->node, &ndp->packages);
282 	ndp->package_num++;
283 	spin_unlock_irqrestore(&ndp->lock, flags);
284 
285 	return np;
286 }
287 
288 void ncsi_remove_package(struct ncsi_package *np)
289 {
290 	struct ncsi_dev_priv *ndp = np->ndp;
291 	struct ncsi_channel *nc, *tmp;
292 	unsigned long flags;
293 
294 	/* Release all child channels */
295 	list_for_each_entry_safe(nc, tmp, &np->channels, node)
296 		ncsi_remove_channel(nc);
297 
298 	/* Remove and free package */
299 	spin_lock_irqsave(&ndp->lock, flags);
300 	list_del_rcu(&np->node);
301 	ndp->package_num--;
302 	spin_unlock_irqrestore(&ndp->lock, flags);
303 
304 	kfree(np);
305 }
306 
307 void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp,
308 				   unsigned char id,
309 				   struct ncsi_package **np,
310 				   struct ncsi_channel **nc)
311 {
312 	struct ncsi_package *p;
313 	struct ncsi_channel *c;
314 
315 	p = ncsi_find_package(ndp, NCSI_PACKAGE_INDEX(id));
316 	c = p ? ncsi_find_channel(p, NCSI_CHANNEL_INDEX(id)) : NULL;
317 
318 	if (np)
319 		*np = p;
320 	if (nc)
321 		*nc = c;
322 }
323 
324 /* For two consecutive NCSI commands, the packet IDs shouldn't
325  * be same. Otherwise, the bogus response might be replied. So
326  * the available IDs are allocated in round-robin fashion.
327  */
328 struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp,
329 					unsigned int req_flags)
330 {
331 	struct ncsi_request *nr = NULL;
332 	int i, limit = ARRAY_SIZE(ndp->requests);
333 	unsigned long flags;
334 
335 	/* Check if there is one available request until the ceiling */
336 	spin_lock_irqsave(&ndp->lock, flags);
337 	for (i = ndp->request_id; i < limit; i++) {
338 		if (ndp->requests[i].used)
339 			continue;
340 
341 		nr = &ndp->requests[i];
342 		nr->used = true;
343 		nr->flags = req_flags;
344 		ndp->request_id = i + 1;
345 		goto found;
346 	}
347 
348 	/* Fail back to check from the starting cursor */
349 	for (i = NCSI_REQ_START_IDX; i < ndp->request_id; i++) {
350 		if (ndp->requests[i].used)
351 			continue;
352 
353 		nr = &ndp->requests[i];
354 		nr->used = true;
355 		nr->flags = req_flags;
356 		ndp->request_id = i + 1;
357 		goto found;
358 	}
359 
360 found:
361 	spin_unlock_irqrestore(&ndp->lock, flags);
362 	return nr;
363 }
364 
365 void ncsi_free_request(struct ncsi_request *nr)
366 {
367 	struct ncsi_dev_priv *ndp = nr->ndp;
368 	struct sk_buff *cmd, *rsp;
369 	unsigned long flags;
370 	bool driven;
371 
372 	if (nr->enabled) {
373 		nr->enabled = false;
374 		del_timer_sync(&nr->timer);
375 	}
376 
377 	spin_lock_irqsave(&ndp->lock, flags);
378 	cmd = nr->cmd;
379 	rsp = nr->rsp;
380 	nr->cmd = NULL;
381 	nr->rsp = NULL;
382 	nr->used = false;
383 	driven = !!(nr->flags & NCSI_REQ_FLAG_EVENT_DRIVEN);
384 	spin_unlock_irqrestore(&ndp->lock, flags);
385 
386 	if (driven && cmd && --ndp->pending_req_num == 0)
387 		schedule_work(&ndp->work);
388 
389 	/* Release command and response */
390 	consume_skb(cmd);
391 	consume_skb(rsp);
392 }
393 
394 struct ncsi_dev *ncsi_find_dev(struct net_device *dev)
395 {
396 	struct ncsi_dev_priv *ndp;
397 
398 	NCSI_FOR_EACH_DEV(ndp) {
399 		if (ndp->ndev.dev == dev)
400 			return &ndp->ndev;
401 	}
402 
403 	return NULL;
404 }
405 
406 static void ncsi_request_timeout(struct timer_list *t)
407 {
408 	struct ncsi_request *nr = from_timer(nr, t, timer);
409 	struct ncsi_dev_priv *ndp = nr->ndp;
410 	struct ncsi_cmd_pkt *cmd;
411 	struct ncsi_package *np;
412 	struct ncsi_channel *nc;
413 	unsigned long flags;
414 
415 	/* If the request already had associated response,
416 	 * let the response handler to release it.
417 	 */
418 	spin_lock_irqsave(&ndp->lock, flags);
419 	nr->enabled = false;
420 	if (nr->rsp || !nr->cmd) {
421 		spin_unlock_irqrestore(&ndp->lock, flags);
422 		return;
423 	}
424 	spin_unlock_irqrestore(&ndp->lock, flags);
425 
426 	if (nr->flags == NCSI_REQ_FLAG_NETLINK_DRIVEN) {
427 		if (nr->cmd) {
428 			/* Find the package */
429 			cmd = (struct ncsi_cmd_pkt *)
430 			      skb_network_header(nr->cmd);
431 			ncsi_find_package_and_channel(ndp,
432 						      cmd->cmd.common.channel,
433 						      &np, &nc);
434 			ncsi_send_netlink_timeout(nr, np, nc);
435 		}
436 	}
437 
438 	/* Release the request */
439 	ncsi_free_request(nr);
440 }
441 
442 static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp)
443 {
444 	struct ncsi_dev *nd = &ndp->ndev;
445 	struct ncsi_package *np = ndp->active_package;
446 	struct ncsi_channel *nc = ndp->active_channel;
447 	struct ncsi_cmd_arg nca;
448 	unsigned long flags;
449 	int ret;
450 
451 	nca.ndp = ndp;
452 	nca.req_flags = NCSI_REQ_FLAG_EVENT_DRIVEN;
453 	switch (nd->state) {
454 	case ncsi_dev_state_suspend:
455 		nd->state = ncsi_dev_state_suspend_select;
456 		/* Fall through */
457 	case ncsi_dev_state_suspend_select:
458 		ndp->pending_req_num = 1;
459 
460 		nca.type = NCSI_PKT_CMD_SP;
461 		nca.package = np->id;
462 		nca.channel = NCSI_RESERVED_CHANNEL;
463 		if (ndp->flags & NCSI_DEV_HWA)
464 			nca.bytes[0] = 0;
465 		else
466 			nca.bytes[0] = 1;
467 
468 		/* To retrieve the last link states of channels in current
469 		 * package when current active channel needs fail over to
470 		 * another one. It means we will possibly select another
471 		 * channel as next active one. The link states of channels
472 		 * are most important factor of the selection. So we need
473 		 * accurate link states. Unfortunately, the link states on
474 		 * inactive channels can't be updated with LSC AEN in time.
475 		 */
476 		if (ndp->flags & NCSI_DEV_RESHUFFLE)
477 			nd->state = ncsi_dev_state_suspend_gls;
478 		else
479 			nd->state = ncsi_dev_state_suspend_dcnt;
480 		ret = ncsi_xmit_cmd(&nca);
481 		if (ret)
482 			goto error;
483 
484 		break;
485 	case ncsi_dev_state_suspend_gls:
486 		ndp->pending_req_num = np->channel_num;
487 
488 		nca.type = NCSI_PKT_CMD_GLS;
489 		nca.package = np->id;
490 
491 		nd->state = ncsi_dev_state_suspend_dcnt;
492 		NCSI_FOR_EACH_CHANNEL(np, nc) {
493 			nca.channel = nc->id;
494 			ret = ncsi_xmit_cmd(&nca);
495 			if (ret)
496 				goto error;
497 		}
498 
499 		break;
500 	case ncsi_dev_state_suspend_dcnt:
501 		ndp->pending_req_num = 1;
502 
503 		nca.type = NCSI_PKT_CMD_DCNT;
504 		nca.package = np->id;
505 		nca.channel = nc->id;
506 
507 		nd->state = ncsi_dev_state_suspend_dc;
508 		ret = ncsi_xmit_cmd(&nca);
509 		if (ret)
510 			goto error;
511 
512 		break;
513 	case ncsi_dev_state_suspend_dc:
514 		ndp->pending_req_num = 1;
515 
516 		nca.type = NCSI_PKT_CMD_DC;
517 		nca.package = np->id;
518 		nca.channel = nc->id;
519 		nca.bytes[0] = 1;
520 
521 		nd->state = ncsi_dev_state_suspend_deselect;
522 		ret = ncsi_xmit_cmd(&nca);
523 		if (ret)
524 			goto error;
525 
526 		break;
527 	case ncsi_dev_state_suspend_deselect:
528 		ndp->pending_req_num = 1;
529 
530 		nca.type = NCSI_PKT_CMD_DP;
531 		nca.package = np->id;
532 		nca.channel = NCSI_RESERVED_CHANNEL;
533 
534 		nd->state = ncsi_dev_state_suspend_done;
535 		ret = ncsi_xmit_cmd(&nca);
536 		if (ret)
537 			goto error;
538 
539 		break;
540 	case ncsi_dev_state_suspend_done:
541 		spin_lock_irqsave(&nc->lock, flags);
542 		nc->state = NCSI_CHANNEL_INACTIVE;
543 		spin_unlock_irqrestore(&nc->lock, flags);
544 		ncsi_process_next_channel(ndp);
545 
546 		break;
547 	default:
548 		netdev_warn(nd->dev, "Wrong NCSI state 0x%x in suspend\n",
549 			    nd->state);
550 	}
551 
552 	return;
553 error:
554 	nd->state = ncsi_dev_state_functional;
555 }
556 
557 /* Check the VLAN filter bitmap for a set filter, and construct a
558  * "Set VLAN Filter - Disable" packet if found.
559  */
560 static int clear_one_vid(struct ncsi_dev_priv *ndp, struct ncsi_channel *nc,
561 			 struct ncsi_cmd_arg *nca)
562 {
563 	struct ncsi_channel_vlan_filter *ncf;
564 	unsigned long flags;
565 	void *bitmap;
566 	int index;
567 	u16 vid;
568 
569 	ncf = &nc->vlan_filter;
570 	bitmap = &ncf->bitmap;
571 
572 	spin_lock_irqsave(&nc->lock, flags);
573 	index = find_next_bit(bitmap, ncf->n_vids, 0);
574 	if (index >= ncf->n_vids) {
575 		spin_unlock_irqrestore(&nc->lock, flags);
576 		return -1;
577 	}
578 	vid = ncf->vids[index];
579 
580 	clear_bit(index, bitmap);
581 	ncf->vids[index] = 0;
582 	spin_unlock_irqrestore(&nc->lock, flags);
583 
584 	nca->type = NCSI_PKT_CMD_SVF;
585 	nca->words[1] = vid;
586 	/* HW filter index starts at 1 */
587 	nca->bytes[6] = index + 1;
588 	nca->bytes[7] = 0x00;
589 	return 0;
590 }
591 
592 /* Find an outstanding VLAN tag and constuct a "Set VLAN Filter - Enable"
593  * packet.
594  */
595 static int set_one_vid(struct ncsi_dev_priv *ndp, struct ncsi_channel *nc,
596 		       struct ncsi_cmd_arg *nca)
597 {
598 	struct ncsi_channel_vlan_filter *ncf;
599 	struct vlan_vid *vlan = NULL;
600 	unsigned long flags;
601 	int i, index;
602 	void *bitmap;
603 	u16 vid;
604 
605 	if (list_empty(&ndp->vlan_vids))
606 		return -1;
607 
608 	ncf = &nc->vlan_filter;
609 	bitmap = &ncf->bitmap;
610 
611 	spin_lock_irqsave(&nc->lock, flags);
612 
613 	rcu_read_lock();
614 	list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) {
615 		vid = vlan->vid;
616 		for (i = 0; i < ncf->n_vids; i++)
617 			if (ncf->vids[i] == vid) {
618 				vid = 0;
619 				break;
620 			}
621 		if (vid)
622 			break;
623 	}
624 	rcu_read_unlock();
625 
626 	if (!vid) {
627 		/* No VLAN ID is not set */
628 		spin_unlock_irqrestore(&nc->lock, flags);
629 		return -1;
630 	}
631 
632 	index = find_next_zero_bit(bitmap, ncf->n_vids, 0);
633 	if (index < 0 || index >= ncf->n_vids) {
634 		netdev_err(ndp->ndev.dev,
635 			   "Channel %u already has all VLAN filters set\n",
636 			   nc->id);
637 		spin_unlock_irqrestore(&nc->lock, flags);
638 		return -1;
639 	}
640 
641 	ncf->vids[index] = vid;
642 	set_bit(index, bitmap);
643 	spin_unlock_irqrestore(&nc->lock, flags);
644 
645 	nca->type = NCSI_PKT_CMD_SVF;
646 	nca->words[1] = vid;
647 	/* HW filter index starts at 1 */
648 	nca->bytes[6] = index + 1;
649 	nca->bytes[7] = 0x01;
650 
651 	return 0;
652 }
653 
654 #if IS_ENABLED(CONFIG_NCSI_OEM_CMD_GET_MAC)
655 
656 /* NCSI OEM Command APIs */
657 static int ncsi_oem_gma_handler_bcm(struct ncsi_cmd_arg *nca)
658 {
659 	unsigned char data[NCSI_OEM_BCM_CMD_GMA_LEN];
660 	int ret = 0;
661 
662 	nca->payload = NCSI_OEM_BCM_CMD_GMA_LEN;
663 
664 	memset(data, 0, NCSI_OEM_BCM_CMD_GMA_LEN);
665 	*(unsigned int *)data = ntohl(NCSI_OEM_MFR_BCM_ID);
666 	data[5] = NCSI_OEM_BCM_CMD_GMA;
667 
668 	nca->data = data;
669 
670 	ret = ncsi_xmit_cmd(nca);
671 	if (ret)
672 		netdev_err(nca->ndp->ndev.dev,
673 			   "NCSI: Failed to transmit cmd 0x%x during configure\n",
674 			   nca->type);
675 	return ret;
676 }
677 
678 /* OEM Command handlers initialization */
679 static struct ncsi_oem_gma_handler {
680 	unsigned int	mfr_id;
681 	int		(*handler)(struct ncsi_cmd_arg *nca);
682 } ncsi_oem_gma_handlers[] = {
683 	{ NCSI_OEM_MFR_BCM_ID, ncsi_oem_gma_handler_bcm }
684 };
685 
686 static int ncsi_gma_handler(struct ncsi_cmd_arg *nca, unsigned int mf_id)
687 {
688 	struct ncsi_oem_gma_handler *nch = NULL;
689 	int i;
690 
691 	/* This function should only be called once, return if flag set */
692 	if (nca->ndp->gma_flag == 1)
693 		return -1;
694 
695 	/* Find gma handler for given manufacturer id */
696 	for (i = 0; i < ARRAY_SIZE(ncsi_oem_gma_handlers); i++) {
697 		if (ncsi_oem_gma_handlers[i].mfr_id == mf_id) {
698 			if (ncsi_oem_gma_handlers[i].handler)
699 				nch = &ncsi_oem_gma_handlers[i];
700 			break;
701 			}
702 	}
703 
704 	if (!nch) {
705 		netdev_err(nca->ndp->ndev.dev,
706 			   "NCSI: No GMA handler available for MFR-ID (0x%x)\n",
707 			   mf_id);
708 		return -1;
709 	}
710 
711 	/* Set the flag for GMA command which should only be called once */
712 	nca->ndp->gma_flag = 1;
713 
714 	/* Get Mac address from NCSI device */
715 	return nch->handler(nca);
716 }
717 
718 #endif /* CONFIG_NCSI_OEM_CMD_GET_MAC */
719 
720 static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
721 {
722 	struct ncsi_dev *nd = &ndp->ndev;
723 	struct net_device *dev = nd->dev;
724 	struct ncsi_package *np = ndp->active_package;
725 	struct ncsi_channel *nc = ndp->active_channel;
726 	struct ncsi_channel *hot_nc = NULL;
727 	struct ncsi_cmd_arg nca;
728 	unsigned char index;
729 	unsigned long flags;
730 	int ret;
731 
732 	nca.ndp = ndp;
733 	nca.req_flags = NCSI_REQ_FLAG_EVENT_DRIVEN;
734 	switch (nd->state) {
735 	case ncsi_dev_state_config:
736 	case ncsi_dev_state_config_sp:
737 		ndp->pending_req_num = 1;
738 
739 		/* Select the specific package */
740 		nca.type = NCSI_PKT_CMD_SP;
741 		if (ndp->flags & NCSI_DEV_HWA)
742 			nca.bytes[0] = 0;
743 		else
744 			nca.bytes[0] = 1;
745 		nca.package = np->id;
746 		nca.channel = NCSI_RESERVED_CHANNEL;
747 		ret = ncsi_xmit_cmd(&nca);
748 		if (ret) {
749 			netdev_err(ndp->ndev.dev,
750 				   "NCSI: Failed to transmit CMD_SP\n");
751 			goto error;
752 		}
753 
754 		nd->state = ncsi_dev_state_config_cis;
755 		break;
756 	case ncsi_dev_state_config_cis:
757 		ndp->pending_req_num = 1;
758 
759 		/* Clear initial state */
760 		nca.type = NCSI_PKT_CMD_CIS;
761 		nca.package = np->id;
762 		nca.channel = nc->id;
763 		ret = ncsi_xmit_cmd(&nca);
764 		if (ret) {
765 			netdev_err(ndp->ndev.dev,
766 				   "NCSI: Failed to transmit CMD_CIS\n");
767 			goto error;
768 		}
769 
770 		nd->state = ncsi_dev_state_config_oem_gma;
771 		break;
772 	case ncsi_dev_state_config_oem_gma:
773 		nd->state = ncsi_dev_state_config_clear_vids;
774 		ret = -1;
775 
776 #if IS_ENABLED(CONFIG_NCSI_OEM_CMD_GET_MAC)
777 		nca.type = NCSI_PKT_CMD_OEM;
778 		nca.package = np->id;
779 		nca.channel = nc->id;
780 		ndp->pending_req_num = 1;
781 		ret = ncsi_gma_handler(&nca, nc->version.mf_id);
782 #endif /* CONFIG_NCSI_OEM_CMD_GET_MAC */
783 
784 		if (ret < 0)
785 			schedule_work(&ndp->work);
786 
787 		break;
788 	case ncsi_dev_state_config_clear_vids:
789 	case ncsi_dev_state_config_svf:
790 	case ncsi_dev_state_config_ev:
791 	case ncsi_dev_state_config_sma:
792 	case ncsi_dev_state_config_ebf:
793 #if IS_ENABLED(CONFIG_IPV6)
794 	case ncsi_dev_state_config_egmf:
795 #endif
796 	case ncsi_dev_state_config_ecnt:
797 	case ncsi_dev_state_config_ec:
798 	case ncsi_dev_state_config_ae:
799 	case ncsi_dev_state_config_gls:
800 		ndp->pending_req_num = 1;
801 
802 		nca.package = np->id;
803 		nca.channel = nc->id;
804 
805 		/* Clear any active filters on the channel before setting */
806 		if (nd->state == ncsi_dev_state_config_clear_vids) {
807 			ret = clear_one_vid(ndp, nc, &nca);
808 			if (ret) {
809 				nd->state = ncsi_dev_state_config_svf;
810 				schedule_work(&ndp->work);
811 				break;
812 			}
813 			/* Repeat */
814 			nd->state = ncsi_dev_state_config_clear_vids;
815 		/* Add known VLAN tags to the filter */
816 		} else if (nd->state == ncsi_dev_state_config_svf) {
817 			ret = set_one_vid(ndp, nc, &nca);
818 			if (ret) {
819 				nd->state = ncsi_dev_state_config_ev;
820 				schedule_work(&ndp->work);
821 				break;
822 			}
823 			/* Repeat */
824 			nd->state = ncsi_dev_state_config_svf;
825 		/* Enable/Disable the VLAN filter */
826 		} else if (nd->state == ncsi_dev_state_config_ev) {
827 			if (list_empty(&ndp->vlan_vids)) {
828 				nca.type = NCSI_PKT_CMD_DV;
829 			} else {
830 				nca.type = NCSI_PKT_CMD_EV;
831 				nca.bytes[3] = NCSI_CAP_VLAN_NO;
832 			}
833 			nd->state = ncsi_dev_state_config_sma;
834 		} else if (nd->state == ncsi_dev_state_config_sma) {
835 		/* Use first entry in unicast filter table. Note that
836 		 * the MAC filter table starts from entry 1 instead of
837 		 * 0.
838 		 */
839 			nca.type = NCSI_PKT_CMD_SMA;
840 			for (index = 0; index < 6; index++)
841 				nca.bytes[index] = dev->dev_addr[index];
842 			nca.bytes[6] = 0x1;
843 			nca.bytes[7] = 0x1;
844 			nd->state = ncsi_dev_state_config_ebf;
845 		} else if (nd->state == ncsi_dev_state_config_ebf) {
846 			nca.type = NCSI_PKT_CMD_EBF;
847 			nca.dwords[0] = nc->caps[NCSI_CAP_BC].cap;
848 			nd->state = ncsi_dev_state_config_ecnt;
849 #if IS_ENABLED(CONFIG_IPV6)
850 			if (ndp->inet6_addr_num > 0 &&
851 			    (nc->caps[NCSI_CAP_GENERIC].cap &
852 			     NCSI_CAP_GENERIC_MC))
853 				nd->state = ncsi_dev_state_config_egmf;
854 			else
855 				nd->state = ncsi_dev_state_config_ecnt;
856 		} else if (nd->state == ncsi_dev_state_config_egmf) {
857 			nca.type = NCSI_PKT_CMD_EGMF;
858 			nca.dwords[0] = nc->caps[NCSI_CAP_MC].cap;
859 			nd->state = ncsi_dev_state_config_ecnt;
860 #endif /* CONFIG_IPV6 */
861 		} else if (nd->state == ncsi_dev_state_config_ecnt) {
862 			nca.type = NCSI_PKT_CMD_ECNT;
863 			nd->state = ncsi_dev_state_config_ec;
864 		} else if (nd->state == ncsi_dev_state_config_ec) {
865 			/* Enable AEN if it's supported */
866 			nca.type = NCSI_PKT_CMD_EC;
867 			nd->state = ncsi_dev_state_config_ae;
868 			if (!(nc->caps[NCSI_CAP_AEN].cap & NCSI_CAP_AEN_MASK))
869 				nd->state = ncsi_dev_state_config_gls;
870 		} else if (nd->state == ncsi_dev_state_config_ae) {
871 			nca.type = NCSI_PKT_CMD_AE;
872 			nca.bytes[0] = 0;
873 			nca.dwords[1] = nc->caps[NCSI_CAP_AEN].cap;
874 			nd->state = ncsi_dev_state_config_gls;
875 		} else if (nd->state == ncsi_dev_state_config_gls) {
876 			nca.type = NCSI_PKT_CMD_GLS;
877 			nd->state = ncsi_dev_state_config_done;
878 		}
879 
880 		ret = ncsi_xmit_cmd(&nca);
881 		if (ret) {
882 			netdev_err(ndp->ndev.dev,
883 				   "NCSI: Failed to transmit CMD %x\n",
884 				   nca.type);
885 			goto error;
886 		}
887 		break;
888 	case ncsi_dev_state_config_done:
889 		netdev_dbg(ndp->ndev.dev, "NCSI: channel %u config done\n",
890 			   nc->id);
891 		spin_lock_irqsave(&nc->lock, flags);
892 		if (nc->reconfigure_needed) {
893 			/* This channel's configuration has been updated
894 			 * part-way during the config state - start the
895 			 * channel configuration over
896 			 */
897 			nc->reconfigure_needed = false;
898 			nc->state = NCSI_CHANNEL_INACTIVE;
899 			spin_unlock_irqrestore(&nc->lock, flags);
900 
901 			spin_lock_irqsave(&ndp->lock, flags);
902 			list_add_tail_rcu(&nc->link, &ndp->channel_queue);
903 			spin_unlock_irqrestore(&ndp->lock, flags);
904 
905 			netdev_dbg(dev, "Dirty NCSI channel state reset\n");
906 			ncsi_process_next_channel(ndp);
907 			break;
908 		}
909 
910 		if (nc->modes[NCSI_MODE_LINK].data[2] & 0x1) {
911 			hot_nc = nc;
912 			nc->state = NCSI_CHANNEL_ACTIVE;
913 		} else {
914 			hot_nc = NULL;
915 			nc->state = NCSI_CHANNEL_INACTIVE;
916 			netdev_dbg(ndp->ndev.dev,
917 				   "NCSI: channel %u link down after config\n",
918 				   nc->id);
919 		}
920 		spin_unlock_irqrestore(&nc->lock, flags);
921 
922 		/* Update the hot channel */
923 		spin_lock_irqsave(&ndp->lock, flags);
924 		ndp->hot_channel = hot_nc;
925 		spin_unlock_irqrestore(&ndp->lock, flags);
926 
927 		ncsi_start_channel_monitor(nc);
928 		ncsi_process_next_channel(ndp);
929 		break;
930 	default:
931 		netdev_alert(dev, "Wrong NCSI state 0x%x in config\n",
932 			     nd->state);
933 	}
934 
935 	return;
936 
937 error:
938 	ncsi_report_link(ndp, true);
939 }
940 
941 static int ncsi_choose_active_channel(struct ncsi_dev_priv *ndp)
942 {
943 	struct ncsi_package *np, *force_package;
944 	struct ncsi_channel *nc, *found, *hot_nc, *force_channel;
945 	struct ncsi_channel_mode *ncm;
946 	unsigned long flags;
947 
948 	spin_lock_irqsave(&ndp->lock, flags);
949 	hot_nc = ndp->hot_channel;
950 	force_channel = ndp->force_channel;
951 	force_package = ndp->force_package;
952 	spin_unlock_irqrestore(&ndp->lock, flags);
953 
954 	/* Force a specific channel whether or not it has link if we have been
955 	 * configured to do so
956 	 */
957 	if (force_package && force_channel) {
958 		found = force_channel;
959 		ncm = &found->modes[NCSI_MODE_LINK];
960 		if (!(ncm->data[2] & 0x1))
961 			netdev_info(ndp->ndev.dev,
962 				    "NCSI: Channel %u forced, but it is link down\n",
963 				    found->id);
964 		goto out;
965 	}
966 
967 	/* The search is done once an inactive channel with up
968 	 * link is found.
969 	 */
970 	found = NULL;
971 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
972 		if (ndp->force_package && np != ndp->force_package)
973 			continue;
974 		NCSI_FOR_EACH_CHANNEL(np, nc) {
975 			spin_lock_irqsave(&nc->lock, flags);
976 
977 			if (!list_empty(&nc->link) ||
978 			    nc->state != NCSI_CHANNEL_INACTIVE) {
979 				spin_unlock_irqrestore(&nc->lock, flags);
980 				continue;
981 			}
982 
983 			if (!found)
984 				found = nc;
985 
986 			if (nc == hot_nc)
987 				found = nc;
988 
989 			ncm = &nc->modes[NCSI_MODE_LINK];
990 			if (ncm->data[2] & 0x1) {
991 				spin_unlock_irqrestore(&nc->lock, flags);
992 				found = nc;
993 				goto out;
994 			}
995 
996 			spin_unlock_irqrestore(&nc->lock, flags);
997 		}
998 	}
999 
1000 	if (!found) {
1001 		netdev_warn(ndp->ndev.dev,
1002 			    "NCSI: No channel found with link\n");
1003 		ncsi_report_link(ndp, true);
1004 		return -ENODEV;
1005 	}
1006 
1007 	ncm = &found->modes[NCSI_MODE_LINK];
1008 	netdev_dbg(ndp->ndev.dev,
1009 		   "NCSI: Channel %u added to queue (link %s)\n",
1010 		   found->id, ncm->data[2] & 0x1 ? "up" : "down");
1011 
1012 out:
1013 	spin_lock_irqsave(&ndp->lock, flags);
1014 	list_add_tail_rcu(&found->link, &ndp->channel_queue);
1015 	spin_unlock_irqrestore(&ndp->lock, flags);
1016 
1017 	return ncsi_process_next_channel(ndp);
1018 }
1019 
1020 static bool ncsi_check_hwa(struct ncsi_dev_priv *ndp)
1021 {
1022 	struct ncsi_package *np;
1023 	struct ncsi_channel *nc;
1024 	unsigned int cap;
1025 	bool has_channel = false;
1026 
1027 	/* The hardware arbitration is disabled if any one channel
1028 	 * doesn't support explicitly.
1029 	 */
1030 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
1031 		NCSI_FOR_EACH_CHANNEL(np, nc) {
1032 			has_channel = true;
1033 
1034 			cap = nc->caps[NCSI_CAP_GENERIC].cap;
1035 			if (!(cap & NCSI_CAP_GENERIC_HWA) ||
1036 			    (cap & NCSI_CAP_GENERIC_HWA_MASK) !=
1037 			    NCSI_CAP_GENERIC_HWA_SUPPORT) {
1038 				ndp->flags &= ~NCSI_DEV_HWA;
1039 				return false;
1040 			}
1041 		}
1042 	}
1043 
1044 	if (has_channel) {
1045 		ndp->flags |= NCSI_DEV_HWA;
1046 		return true;
1047 	}
1048 
1049 	ndp->flags &= ~NCSI_DEV_HWA;
1050 	return false;
1051 }
1052 
1053 static int ncsi_enable_hwa(struct ncsi_dev_priv *ndp)
1054 {
1055 	struct ncsi_package *np;
1056 	struct ncsi_channel *nc;
1057 	unsigned long flags;
1058 
1059 	/* Move all available channels to processing queue */
1060 	spin_lock_irqsave(&ndp->lock, flags);
1061 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
1062 		NCSI_FOR_EACH_CHANNEL(np, nc) {
1063 			WARN_ON_ONCE(nc->state != NCSI_CHANNEL_INACTIVE ||
1064 				     !list_empty(&nc->link));
1065 			ncsi_stop_channel_monitor(nc);
1066 			list_add_tail_rcu(&nc->link, &ndp->channel_queue);
1067 		}
1068 	}
1069 	spin_unlock_irqrestore(&ndp->lock, flags);
1070 
1071 	/* We can have no channels in extremely case */
1072 	if (list_empty(&ndp->channel_queue)) {
1073 		netdev_err(ndp->ndev.dev,
1074 			   "NCSI: No available channels for HWA\n");
1075 		ncsi_report_link(ndp, false);
1076 		return -ENOENT;
1077 	}
1078 
1079 	return ncsi_process_next_channel(ndp);
1080 }
1081 
1082 static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
1083 {
1084 	struct ncsi_dev *nd = &ndp->ndev;
1085 	struct ncsi_package *np;
1086 	struct ncsi_channel *nc;
1087 	struct ncsi_cmd_arg nca;
1088 	unsigned char index;
1089 	int ret;
1090 
1091 	nca.ndp = ndp;
1092 	nca.req_flags = NCSI_REQ_FLAG_EVENT_DRIVEN;
1093 	switch (nd->state) {
1094 	case ncsi_dev_state_probe:
1095 		nd->state = ncsi_dev_state_probe_deselect;
1096 		/* Fall through */
1097 	case ncsi_dev_state_probe_deselect:
1098 		ndp->pending_req_num = 8;
1099 
1100 		/* Deselect all possible packages */
1101 		nca.type = NCSI_PKT_CMD_DP;
1102 		nca.channel = NCSI_RESERVED_CHANNEL;
1103 		for (index = 0; index < 8; index++) {
1104 			nca.package = index;
1105 			ret = ncsi_xmit_cmd(&nca);
1106 			if (ret)
1107 				goto error;
1108 		}
1109 
1110 		nd->state = ncsi_dev_state_probe_package;
1111 		break;
1112 	case ncsi_dev_state_probe_package:
1113 		ndp->pending_req_num = 16;
1114 
1115 		/* Select all possible packages */
1116 		nca.type = NCSI_PKT_CMD_SP;
1117 		nca.bytes[0] = 1;
1118 		nca.channel = NCSI_RESERVED_CHANNEL;
1119 		for (index = 0; index < 8; index++) {
1120 			nca.package = index;
1121 			ret = ncsi_xmit_cmd(&nca);
1122 			if (ret)
1123 				goto error;
1124 		}
1125 
1126 		/* Disable all possible packages */
1127 		nca.type = NCSI_PKT_CMD_DP;
1128 		for (index = 0; index < 8; index++) {
1129 			nca.package = index;
1130 			ret = ncsi_xmit_cmd(&nca);
1131 			if (ret)
1132 				goto error;
1133 		}
1134 
1135 		nd->state = ncsi_dev_state_probe_channel;
1136 		break;
1137 	case ncsi_dev_state_probe_channel:
1138 		if (!ndp->active_package)
1139 			ndp->active_package = list_first_or_null_rcu(
1140 				&ndp->packages, struct ncsi_package, node);
1141 		else if (list_is_last(&ndp->active_package->node,
1142 				      &ndp->packages))
1143 			ndp->active_package = NULL;
1144 		else
1145 			ndp->active_package = list_next_entry(
1146 				ndp->active_package, node);
1147 
1148 		/* All available packages and channels are enumerated. The
1149 		 * enumeration happens for once when the NCSI interface is
1150 		 * started. So we need continue to start the interface after
1151 		 * the enumeration.
1152 		 *
1153 		 * We have to choose an active channel before configuring it.
1154 		 * Note that we possibly don't have active channel in extreme
1155 		 * situation.
1156 		 */
1157 		if (!ndp->active_package) {
1158 			ndp->flags |= NCSI_DEV_PROBED;
1159 			if (ncsi_check_hwa(ndp))
1160 				ncsi_enable_hwa(ndp);
1161 			else
1162 				ncsi_choose_active_channel(ndp);
1163 			return;
1164 		}
1165 
1166 		/* Select the active package */
1167 		ndp->pending_req_num = 1;
1168 		nca.type = NCSI_PKT_CMD_SP;
1169 		nca.bytes[0] = 1;
1170 		nca.package = ndp->active_package->id;
1171 		nca.channel = NCSI_RESERVED_CHANNEL;
1172 		ret = ncsi_xmit_cmd(&nca);
1173 		if (ret)
1174 			goto error;
1175 
1176 		nd->state = ncsi_dev_state_probe_cis;
1177 		break;
1178 	case ncsi_dev_state_probe_cis:
1179 		ndp->pending_req_num = NCSI_RESERVED_CHANNEL;
1180 
1181 		/* Clear initial state */
1182 		nca.type = NCSI_PKT_CMD_CIS;
1183 		nca.package = ndp->active_package->id;
1184 		for (index = 0; index < NCSI_RESERVED_CHANNEL; index++) {
1185 			nca.channel = index;
1186 			ret = ncsi_xmit_cmd(&nca);
1187 			if (ret)
1188 				goto error;
1189 		}
1190 
1191 		nd->state = ncsi_dev_state_probe_gvi;
1192 		break;
1193 	case ncsi_dev_state_probe_gvi:
1194 	case ncsi_dev_state_probe_gc:
1195 	case ncsi_dev_state_probe_gls:
1196 		np = ndp->active_package;
1197 		ndp->pending_req_num = np->channel_num;
1198 
1199 		/* Retrieve version, capability or link status */
1200 		if (nd->state == ncsi_dev_state_probe_gvi)
1201 			nca.type = NCSI_PKT_CMD_GVI;
1202 		else if (nd->state == ncsi_dev_state_probe_gc)
1203 			nca.type = NCSI_PKT_CMD_GC;
1204 		else
1205 			nca.type = NCSI_PKT_CMD_GLS;
1206 
1207 		nca.package = np->id;
1208 		NCSI_FOR_EACH_CHANNEL(np, nc) {
1209 			nca.channel = nc->id;
1210 			ret = ncsi_xmit_cmd(&nca);
1211 			if (ret)
1212 				goto error;
1213 		}
1214 
1215 		if (nd->state == ncsi_dev_state_probe_gvi)
1216 			nd->state = ncsi_dev_state_probe_gc;
1217 		else if (nd->state == ncsi_dev_state_probe_gc)
1218 			nd->state = ncsi_dev_state_probe_gls;
1219 		else
1220 			nd->state = ncsi_dev_state_probe_dp;
1221 		break;
1222 	case ncsi_dev_state_probe_dp:
1223 		ndp->pending_req_num = 1;
1224 
1225 		/* Deselect the active package */
1226 		nca.type = NCSI_PKT_CMD_DP;
1227 		nca.package = ndp->active_package->id;
1228 		nca.channel = NCSI_RESERVED_CHANNEL;
1229 		ret = ncsi_xmit_cmd(&nca);
1230 		if (ret)
1231 			goto error;
1232 
1233 		/* Scan channels in next package */
1234 		nd->state = ncsi_dev_state_probe_channel;
1235 		break;
1236 	default:
1237 		netdev_warn(nd->dev, "Wrong NCSI state 0x%0x in enumeration\n",
1238 			    nd->state);
1239 	}
1240 
1241 	return;
1242 error:
1243 	netdev_err(ndp->ndev.dev,
1244 		   "NCSI: Failed to transmit cmd 0x%x during probe\n",
1245 		   nca.type);
1246 	ncsi_report_link(ndp, true);
1247 }
1248 
1249 static void ncsi_dev_work(struct work_struct *work)
1250 {
1251 	struct ncsi_dev_priv *ndp = container_of(work,
1252 			struct ncsi_dev_priv, work);
1253 	struct ncsi_dev *nd = &ndp->ndev;
1254 
1255 	switch (nd->state & ncsi_dev_state_major) {
1256 	case ncsi_dev_state_probe:
1257 		ncsi_probe_channel(ndp);
1258 		break;
1259 	case ncsi_dev_state_suspend:
1260 		ncsi_suspend_channel(ndp);
1261 		break;
1262 	case ncsi_dev_state_config:
1263 		ncsi_configure_channel(ndp);
1264 		break;
1265 	default:
1266 		netdev_warn(nd->dev, "Wrong NCSI state 0x%x in workqueue\n",
1267 			    nd->state);
1268 	}
1269 }
1270 
1271 int ncsi_process_next_channel(struct ncsi_dev_priv *ndp)
1272 {
1273 	struct ncsi_channel *nc;
1274 	int old_state;
1275 	unsigned long flags;
1276 
1277 	spin_lock_irqsave(&ndp->lock, flags);
1278 	nc = list_first_or_null_rcu(&ndp->channel_queue,
1279 				    struct ncsi_channel, link);
1280 	if (!nc) {
1281 		spin_unlock_irqrestore(&ndp->lock, flags);
1282 		goto out;
1283 	}
1284 
1285 	list_del_init(&nc->link);
1286 	spin_unlock_irqrestore(&ndp->lock, flags);
1287 
1288 	spin_lock_irqsave(&nc->lock, flags);
1289 	old_state = nc->state;
1290 	nc->state = NCSI_CHANNEL_INVISIBLE;
1291 	spin_unlock_irqrestore(&nc->lock, flags);
1292 
1293 	ndp->active_channel = nc;
1294 	ndp->active_package = nc->package;
1295 
1296 	switch (old_state) {
1297 	case NCSI_CHANNEL_INACTIVE:
1298 		ndp->ndev.state = ncsi_dev_state_config;
1299 		netdev_dbg(ndp->ndev.dev, "NCSI: configuring channel %u\n",
1300 	                   nc->id);
1301 		ncsi_configure_channel(ndp);
1302 		break;
1303 	case NCSI_CHANNEL_ACTIVE:
1304 		ndp->ndev.state = ncsi_dev_state_suspend;
1305 		netdev_dbg(ndp->ndev.dev, "NCSI: suspending channel %u\n",
1306 			   nc->id);
1307 		ncsi_suspend_channel(ndp);
1308 		break;
1309 	default:
1310 		netdev_err(ndp->ndev.dev, "Invalid state 0x%x on %d:%d\n",
1311 			   old_state, nc->package->id, nc->id);
1312 		ncsi_report_link(ndp, false);
1313 		return -EINVAL;
1314 	}
1315 
1316 	return 0;
1317 
1318 out:
1319 	ndp->active_channel = NULL;
1320 	ndp->active_package = NULL;
1321 	if (ndp->flags & NCSI_DEV_RESHUFFLE) {
1322 		ndp->flags &= ~NCSI_DEV_RESHUFFLE;
1323 		return ncsi_choose_active_channel(ndp);
1324 	}
1325 
1326 	ncsi_report_link(ndp, false);
1327 	return -ENODEV;
1328 }
1329 
1330 #if IS_ENABLED(CONFIG_IPV6)
1331 static int ncsi_inet6addr_event(struct notifier_block *this,
1332 				unsigned long event, void *data)
1333 {
1334 	struct inet6_ifaddr *ifa = data;
1335 	struct net_device *dev = ifa->idev->dev;
1336 	struct ncsi_dev *nd = ncsi_find_dev(dev);
1337 	struct ncsi_dev_priv *ndp = nd ? TO_NCSI_DEV_PRIV(nd) : NULL;
1338 	struct ncsi_package *np;
1339 	struct ncsi_channel *nc;
1340 	struct ncsi_cmd_arg nca;
1341 	bool action;
1342 	int ret;
1343 
1344 	if (!ndp || (ipv6_addr_type(&ifa->addr) &
1345 	    (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK)))
1346 		return NOTIFY_OK;
1347 
1348 	switch (event) {
1349 	case NETDEV_UP:
1350 		action = (++ndp->inet6_addr_num) == 1;
1351 		nca.type = NCSI_PKT_CMD_EGMF;
1352 		break;
1353 	case NETDEV_DOWN:
1354 		action = (--ndp->inet6_addr_num == 0);
1355 		nca.type = NCSI_PKT_CMD_DGMF;
1356 		break;
1357 	default:
1358 		return NOTIFY_OK;
1359 	}
1360 
1361 	/* We might not have active channel or packages. The IPv6
1362 	 * required multicast will be enabled when active channel
1363 	 * or packages are chosen.
1364 	 */
1365 	np = ndp->active_package;
1366 	nc = ndp->active_channel;
1367 	if (!action || !np || !nc)
1368 		return NOTIFY_OK;
1369 
1370 	/* We needn't enable or disable it if the function isn't supported */
1371 	if (!(nc->caps[NCSI_CAP_GENERIC].cap & NCSI_CAP_GENERIC_MC))
1372 		return NOTIFY_OK;
1373 
1374 	nca.ndp = ndp;
1375 	nca.req_flags = 0;
1376 	nca.package = np->id;
1377 	nca.channel = nc->id;
1378 	nca.dwords[0] = nc->caps[NCSI_CAP_MC].cap;
1379 	ret = ncsi_xmit_cmd(&nca);
1380 	if (ret) {
1381 		netdev_warn(dev, "Fail to %s global multicast filter (%d)\n",
1382 			    (event == NETDEV_UP) ? "enable" : "disable", ret);
1383 		return NOTIFY_DONE;
1384 	}
1385 
1386 	return NOTIFY_OK;
1387 }
1388 
1389 static struct notifier_block ncsi_inet6addr_notifier = {
1390 	.notifier_call = ncsi_inet6addr_event,
1391 };
1392 #endif /* CONFIG_IPV6 */
1393 
1394 static int ncsi_kick_channels(struct ncsi_dev_priv *ndp)
1395 {
1396 	struct ncsi_dev *nd = &ndp->ndev;
1397 	struct ncsi_channel *nc;
1398 	struct ncsi_package *np;
1399 	unsigned long flags;
1400 	unsigned int n = 0;
1401 
1402 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
1403 		NCSI_FOR_EACH_CHANNEL(np, nc) {
1404 			spin_lock_irqsave(&nc->lock, flags);
1405 
1406 			/* Channels may be busy, mark dirty instead of
1407 			 * kicking if;
1408 			 * a) not ACTIVE (configured)
1409 			 * b) in the channel_queue (to be configured)
1410 			 * c) it's ndev is in the config state
1411 			 */
1412 			if (nc->state != NCSI_CHANNEL_ACTIVE) {
1413 				if ((ndp->ndev.state & 0xff00) ==
1414 						ncsi_dev_state_config ||
1415 						!list_empty(&nc->link)) {
1416 					netdev_dbg(nd->dev,
1417 						   "NCSI: channel %p marked dirty\n",
1418 						   nc);
1419 					nc->reconfigure_needed = true;
1420 				}
1421 				spin_unlock_irqrestore(&nc->lock, flags);
1422 				continue;
1423 			}
1424 
1425 			spin_unlock_irqrestore(&nc->lock, flags);
1426 
1427 			ncsi_stop_channel_monitor(nc);
1428 			spin_lock_irqsave(&nc->lock, flags);
1429 			nc->state = NCSI_CHANNEL_INACTIVE;
1430 			spin_unlock_irqrestore(&nc->lock, flags);
1431 
1432 			spin_lock_irqsave(&ndp->lock, flags);
1433 			list_add_tail_rcu(&nc->link, &ndp->channel_queue);
1434 			spin_unlock_irqrestore(&ndp->lock, flags);
1435 
1436 			netdev_dbg(nd->dev, "NCSI: kicked channel %p\n", nc);
1437 			n++;
1438 		}
1439 	}
1440 
1441 	return n;
1442 }
1443 
1444 int ncsi_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
1445 {
1446 	struct ncsi_dev_priv *ndp;
1447 	unsigned int n_vids = 0;
1448 	struct vlan_vid *vlan;
1449 	struct ncsi_dev *nd;
1450 	bool found = false;
1451 
1452 	if (vid == 0)
1453 		return 0;
1454 
1455 	nd = ncsi_find_dev(dev);
1456 	if (!nd) {
1457 		netdev_warn(dev, "NCSI: No net_device?\n");
1458 		return 0;
1459 	}
1460 
1461 	ndp = TO_NCSI_DEV_PRIV(nd);
1462 
1463 	/* Add the VLAN id to our internal list */
1464 	list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) {
1465 		n_vids++;
1466 		if (vlan->vid == vid) {
1467 			netdev_dbg(dev, "NCSI: vid %u already registered\n",
1468 				   vid);
1469 			return 0;
1470 		}
1471 	}
1472 	if (n_vids >= NCSI_MAX_VLAN_VIDS) {
1473 		netdev_warn(dev,
1474 			    "tried to add vlan id %u but NCSI max already registered (%u)\n",
1475 			    vid, NCSI_MAX_VLAN_VIDS);
1476 		return -ENOSPC;
1477 	}
1478 
1479 	vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
1480 	if (!vlan)
1481 		return -ENOMEM;
1482 
1483 	vlan->proto = proto;
1484 	vlan->vid = vid;
1485 	list_add_rcu(&vlan->list, &ndp->vlan_vids);
1486 
1487 	netdev_dbg(dev, "NCSI: Added new vid %u\n", vid);
1488 
1489 	found = ncsi_kick_channels(ndp) != 0;
1490 
1491 	return found ? ncsi_process_next_channel(ndp) : 0;
1492 }
1493 EXPORT_SYMBOL_GPL(ncsi_vlan_rx_add_vid);
1494 
1495 int ncsi_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
1496 {
1497 	struct vlan_vid *vlan, *tmp;
1498 	struct ncsi_dev_priv *ndp;
1499 	struct ncsi_dev *nd;
1500 	bool found = false;
1501 
1502 	if (vid == 0)
1503 		return 0;
1504 
1505 	nd = ncsi_find_dev(dev);
1506 	if (!nd) {
1507 		netdev_warn(dev, "NCSI: no net_device?\n");
1508 		return 0;
1509 	}
1510 
1511 	ndp = TO_NCSI_DEV_PRIV(nd);
1512 
1513 	/* Remove the VLAN id from our internal list */
1514 	list_for_each_entry_safe(vlan, tmp, &ndp->vlan_vids, list)
1515 		if (vlan->vid == vid) {
1516 			netdev_dbg(dev, "NCSI: vid %u found, removing\n", vid);
1517 			list_del_rcu(&vlan->list);
1518 			found = true;
1519 			kfree(vlan);
1520 		}
1521 
1522 	if (!found) {
1523 		netdev_err(dev, "NCSI: vid %u wasn't registered!\n", vid);
1524 		return -EINVAL;
1525 	}
1526 
1527 	found = ncsi_kick_channels(ndp) != 0;
1528 
1529 	return found ? ncsi_process_next_channel(ndp) : 0;
1530 }
1531 EXPORT_SYMBOL_GPL(ncsi_vlan_rx_kill_vid);
1532 
1533 struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
1534 				   void (*handler)(struct ncsi_dev *ndev))
1535 {
1536 	struct ncsi_dev_priv *ndp;
1537 	struct ncsi_dev *nd;
1538 	unsigned long flags;
1539 	int i;
1540 
1541 	/* Check if the device has been registered or not */
1542 	nd = ncsi_find_dev(dev);
1543 	if (nd)
1544 		return nd;
1545 
1546 	/* Create NCSI device */
1547 	ndp = kzalloc(sizeof(*ndp), GFP_ATOMIC);
1548 	if (!ndp)
1549 		return NULL;
1550 
1551 	nd = &ndp->ndev;
1552 	nd->state = ncsi_dev_state_registered;
1553 	nd->dev = dev;
1554 	nd->handler = handler;
1555 	ndp->pending_req_num = 0;
1556 	INIT_LIST_HEAD(&ndp->channel_queue);
1557 	INIT_LIST_HEAD(&ndp->vlan_vids);
1558 	INIT_WORK(&ndp->work, ncsi_dev_work);
1559 
1560 	/* Initialize private NCSI device */
1561 	spin_lock_init(&ndp->lock);
1562 	INIT_LIST_HEAD(&ndp->packages);
1563 	ndp->request_id = NCSI_REQ_START_IDX;
1564 	for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) {
1565 		ndp->requests[i].id = i;
1566 		ndp->requests[i].ndp = ndp;
1567 		timer_setup(&ndp->requests[i].timer, ncsi_request_timeout, 0);
1568 	}
1569 
1570 	spin_lock_irqsave(&ncsi_dev_lock, flags);
1571 #if IS_ENABLED(CONFIG_IPV6)
1572 	ndp->inet6_addr_num = 0;
1573 	if (list_empty(&ncsi_dev_list))
1574 		register_inet6addr_notifier(&ncsi_inet6addr_notifier);
1575 #endif
1576 	list_add_tail_rcu(&ndp->node, &ncsi_dev_list);
1577 	spin_unlock_irqrestore(&ncsi_dev_lock, flags);
1578 
1579 	/* Register NCSI packet Rx handler */
1580 	ndp->ptype.type = cpu_to_be16(ETH_P_NCSI);
1581 	ndp->ptype.func = ncsi_rcv_rsp;
1582 	ndp->ptype.dev = dev;
1583 	dev_add_pack(&ndp->ptype);
1584 
1585 	/* Set up generic netlink interface */
1586 	ncsi_init_netlink(dev);
1587 
1588 	return nd;
1589 }
1590 EXPORT_SYMBOL_GPL(ncsi_register_dev);
1591 
1592 int ncsi_start_dev(struct ncsi_dev *nd)
1593 {
1594 	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
1595 	int ret;
1596 
1597 	if (nd->state != ncsi_dev_state_registered &&
1598 	    nd->state != ncsi_dev_state_functional)
1599 		return -ENOTTY;
1600 
1601 	if (!(ndp->flags & NCSI_DEV_PROBED)) {
1602 		nd->state = ncsi_dev_state_probe;
1603 		schedule_work(&ndp->work);
1604 		return 0;
1605 	}
1606 
1607 	if (ndp->flags & NCSI_DEV_HWA) {
1608 		netdev_info(ndp->ndev.dev, "NCSI: Enabling HWA mode\n");
1609 		ret = ncsi_enable_hwa(ndp);
1610 	} else {
1611 		ret = ncsi_choose_active_channel(ndp);
1612 	}
1613 
1614 	return ret;
1615 }
1616 EXPORT_SYMBOL_GPL(ncsi_start_dev);
1617 
1618 void ncsi_stop_dev(struct ncsi_dev *nd)
1619 {
1620 	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
1621 	struct ncsi_package *np;
1622 	struct ncsi_channel *nc;
1623 	bool chained;
1624 	int old_state;
1625 	unsigned long flags;
1626 
1627 	/* Stop the channel monitor and reset channel's state */
1628 	NCSI_FOR_EACH_PACKAGE(ndp, np) {
1629 		NCSI_FOR_EACH_CHANNEL(np, nc) {
1630 			ncsi_stop_channel_monitor(nc);
1631 
1632 			spin_lock_irqsave(&nc->lock, flags);
1633 			chained = !list_empty(&nc->link);
1634 			old_state = nc->state;
1635 			nc->state = NCSI_CHANNEL_INACTIVE;
1636 			spin_unlock_irqrestore(&nc->lock, flags);
1637 
1638 			WARN_ON_ONCE(chained ||
1639 				     old_state == NCSI_CHANNEL_INVISIBLE);
1640 		}
1641 	}
1642 
1643 	netdev_dbg(ndp->ndev.dev, "NCSI: Stopping device\n");
1644 	ncsi_report_link(ndp, true);
1645 }
1646 EXPORT_SYMBOL_GPL(ncsi_stop_dev);
1647 
1648 void ncsi_unregister_dev(struct ncsi_dev *nd)
1649 {
1650 	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
1651 	struct ncsi_package *np, *tmp;
1652 	unsigned long flags;
1653 
1654 	dev_remove_pack(&ndp->ptype);
1655 
1656 	list_for_each_entry_safe(np, tmp, &ndp->packages, node)
1657 		ncsi_remove_package(np);
1658 
1659 	spin_lock_irqsave(&ncsi_dev_lock, flags);
1660 	list_del_rcu(&ndp->node);
1661 #if IS_ENABLED(CONFIG_IPV6)
1662 	if (list_empty(&ncsi_dev_list))
1663 		unregister_inet6addr_notifier(&ncsi_inet6addr_notifier);
1664 #endif
1665 	spin_unlock_irqrestore(&ncsi_dev_lock, flags);
1666 
1667 	ncsi_unregister_netlink(nd->dev);
1668 
1669 	kfree(ndp);
1670 }
1671 EXPORT_SYMBOL_GPL(ncsi_unregister_dev);
1672