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