2 * Copyright Gavin Shan, IBM Corporation 2016.
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.
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 #include <linux/netlink.h>
18 #include <net/net_namespace.h>
20 #include <net/addrconf.h>
22 #include <net/if_inet6.h>
27 LIST_HEAD(ncsi_dev_list
);
28 DEFINE_SPINLOCK(ncsi_dev_lock
);
30 static inline int ncsi_filter_size(int table
)
32 int sizes
[] = { 2, 6, 6, 6 };
34 BUILD_BUG_ON(ARRAY_SIZE(sizes
) != NCSI_FILTER_MAX
);
35 if (table
< NCSI_FILTER_BASE
|| table
>= NCSI_FILTER_MAX
)
41 int ncsi_find_filter(struct ncsi_channel
*nc
, int table
, void *data
)
43 struct ncsi_channel_filter
*ncf
;
48 ncf
= nc
->filters
[table
];
52 size
= ncsi_filter_size(table
);
56 spin_lock_irqsave(&nc
->lock
, flags
);
57 bitmap
= (void *)&ncf
->bitmap
;
59 while ((index
= find_next_bit(bitmap
, ncf
->total
, index
+ 1))
61 if (!memcmp(ncf
->data
+ size
* index
, data
, size
)) {
62 spin_unlock_irqrestore(&nc
->lock
, flags
);
66 spin_unlock_irqrestore(&nc
->lock
, flags
);
71 int ncsi_add_filter(struct ncsi_channel
*nc
, int table
, void *data
)
73 struct ncsi_channel_filter
*ncf
;
78 size
= ncsi_filter_size(table
);
82 index
= ncsi_find_filter(nc
, table
, data
);
86 ncf
= nc
->filters
[table
];
90 spin_lock_irqsave(&nc
->lock
, flags
);
91 bitmap
= (void *)&ncf
->bitmap
;
93 index
= find_next_zero_bit(bitmap
, ncf
->total
, 0);
94 if (index
>= ncf
->total
) {
95 spin_unlock_irqrestore(&nc
->lock
, flags
);
98 } while (test_and_set_bit(index
, bitmap
));
100 memcpy(ncf
->data
+ size
* index
, data
, size
);
101 spin_unlock_irqrestore(&nc
->lock
, flags
);
106 int ncsi_remove_filter(struct ncsi_channel
*nc
, int table
, int index
)
108 struct ncsi_channel_filter
*ncf
;
113 size
= ncsi_filter_size(table
);
117 ncf
= nc
->filters
[table
];
118 if (!ncf
|| index
>= ncf
->total
)
121 spin_lock_irqsave(&nc
->lock
, flags
);
122 bitmap
= (void *)&ncf
->bitmap
;
123 if (test_and_clear_bit(index
, bitmap
))
124 memset(ncf
->data
+ size
* index
, 0, size
);
125 spin_unlock_irqrestore(&nc
->lock
, flags
);
130 static void ncsi_report_link(struct ncsi_dev_priv
*ndp
, bool force_down
)
132 struct ncsi_dev
*nd
= &ndp
->ndev
;
133 struct ncsi_package
*np
;
134 struct ncsi_channel
*nc
;
137 nd
->state
= ncsi_dev_state_functional
;
144 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
145 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
146 spin_lock_irqsave(&nc
->lock
, flags
);
148 if (!list_empty(&nc
->link
) ||
149 nc
->state
!= NCSI_CHANNEL_ACTIVE
) {
150 spin_unlock_irqrestore(&nc
->lock
, flags
);
154 if (nc
->modes
[NCSI_MODE_LINK
].data
[2] & 0x1) {
155 spin_unlock_irqrestore(&nc
->lock
, flags
);
160 spin_unlock_irqrestore(&nc
->lock
, flags
);
168 static void ncsi_channel_monitor(unsigned long data
)
170 struct ncsi_channel
*nc
= (struct ncsi_channel
*)data
;
171 struct ncsi_package
*np
= nc
->package
;
172 struct ncsi_dev_priv
*ndp
= np
->ndp
;
173 struct ncsi_cmd_arg nca
;
174 bool enabled
, chained
;
175 unsigned int monitor_state
;
179 spin_lock_irqsave(&nc
->lock
, flags
);
181 chained
= !list_empty(&nc
->link
);
182 enabled
= nc
->monitor
.enabled
;
183 monitor_state
= nc
->monitor
.state
;
184 spin_unlock_irqrestore(&nc
->lock
, flags
);
186 if (!enabled
|| chained
)
188 if (state
!= NCSI_CHANNEL_INACTIVE
&&
189 state
!= NCSI_CHANNEL_ACTIVE
)
192 switch (monitor_state
) {
193 case NCSI_CHANNEL_MONITOR_START
:
194 case NCSI_CHANNEL_MONITOR_RETRY
:
196 nca
.package
= np
->id
;
197 nca
.channel
= nc
->id
;
198 nca
.type
= NCSI_PKT_CMD_GLS
;
200 ret
= ncsi_xmit_cmd(&nca
);
202 netdev_err(ndp
->ndev
.dev
, "Error %d sending GLS\n",
208 case NCSI_CHANNEL_MONITOR_WAIT
... NCSI_CHANNEL_MONITOR_WAIT_MAX
:
211 if (!(ndp
->flags
& NCSI_DEV_HWA
) &&
212 state
== NCSI_CHANNEL_ACTIVE
) {
213 ncsi_report_link(ndp
, true);
214 ndp
->flags
|= NCSI_DEV_RESHUFFLE
;
217 spin_lock_irqsave(&nc
->lock
, flags
);
218 nc
->state
= NCSI_CHANNEL_INVISIBLE
;
219 spin_unlock_irqrestore(&nc
->lock
, flags
);
221 spin_lock_irqsave(&ndp
->lock
, flags
);
222 nc
->state
= NCSI_CHANNEL_INACTIVE
;
223 list_add_tail_rcu(&nc
->link
, &ndp
->channel_queue
);
224 spin_unlock_irqrestore(&ndp
->lock
, flags
);
225 ncsi_process_next_channel(ndp
);
229 spin_lock_irqsave(&nc
->lock
, flags
);
231 spin_unlock_irqrestore(&nc
->lock
, flags
);
232 mod_timer(&nc
->monitor
.timer
, jiffies
+ HZ
);
235 void ncsi_start_channel_monitor(struct ncsi_channel
*nc
)
239 spin_lock_irqsave(&nc
->lock
, flags
);
240 WARN_ON_ONCE(nc
->monitor
.enabled
);
241 nc
->monitor
.enabled
= true;
242 nc
->monitor
.state
= NCSI_CHANNEL_MONITOR_START
;
243 spin_unlock_irqrestore(&nc
->lock
, flags
);
245 mod_timer(&nc
->monitor
.timer
, jiffies
+ HZ
);
248 void ncsi_stop_channel_monitor(struct ncsi_channel
*nc
)
252 spin_lock_irqsave(&nc
->lock
, flags
);
253 if (!nc
->monitor
.enabled
) {
254 spin_unlock_irqrestore(&nc
->lock
, flags
);
257 nc
->monitor
.enabled
= false;
258 spin_unlock_irqrestore(&nc
->lock
, flags
);
260 del_timer_sync(&nc
->monitor
.timer
);
263 struct ncsi_channel
*ncsi_find_channel(struct ncsi_package
*np
,
266 struct ncsi_channel
*nc
;
268 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
276 struct ncsi_channel
*ncsi_add_channel(struct ncsi_package
*np
, unsigned char id
)
278 struct ncsi_channel
*nc
, *tmp
;
282 nc
= kzalloc(sizeof(*nc
), GFP_ATOMIC
);
288 nc
->state
= NCSI_CHANNEL_INACTIVE
;
289 nc
->monitor
.enabled
= false;
290 setup_timer(&nc
->monitor
.timer
,
291 ncsi_channel_monitor
, (unsigned long)nc
);
292 spin_lock_init(&nc
->lock
);
293 INIT_LIST_HEAD(&nc
->link
);
294 for (index
= 0; index
< NCSI_CAP_MAX
; index
++)
295 nc
->caps
[index
].index
= index
;
296 for (index
= 0; index
< NCSI_MODE_MAX
; index
++)
297 nc
->modes
[index
].index
= index
;
299 spin_lock_irqsave(&np
->lock
, flags
);
300 tmp
= ncsi_find_channel(np
, id
);
302 spin_unlock_irqrestore(&np
->lock
, flags
);
307 list_add_tail_rcu(&nc
->node
, &np
->channels
);
309 spin_unlock_irqrestore(&np
->lock
, flags
);
314 static void ncsi_remove_channel(struct ncsi_channel
*nc
)
316 struct ncsi_package
*np
= nc
->package
;
317 struct ncsi_channel_filter
*ncf
;
321 /* Release filters */
322 spin_lock_irqsave(&nc
->lock
, flags
);
323 for (i
= 0; i
< NCSI_FILTER_MAX
; i
++) {
324 ncf
= nc
->filters
[i
];
328 nc
->filters
[i
] = NULL
;
332 nc
->state
= NCSI_CHANNEL_INACTIVE
;
333 spin_unlock_irqrestore(&nc
->lock
, flags
);
334 ncsi_stop_channel_monitor(nc
);
336 /* Remove and free channel */
337 spin_lock_irqsave(&np
->lock
, flags
);
338 list_del_rcu(&nc
->node
);
340 spin_unlock_irqrestore(&np
->lock
, flags
);
345 struct ncsi_package
*ncsi_find_package(struct ncsi_dev_priv
*ndp
,
348 struct ncsi_package
*np
;
350 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
358 struct ncsi_package
*ncsi_add_package(struct ncsi_dev_priv
*ndp
,
361 struct ncsi_package
*np
, *tmp
;
364 np
= kzalloc(sizeof(*np
), GFP_ATOMIC
);
370 spin_lock_init(&np
->lock
);
371 INIT_LIST_HEAD(&np
->channels
);
373 spin_lock_irqsave(&ndp
->lock
, flags
);
374 tmp
= ncsi_find_package(ndp
, id
);
376 spin_unlock_irqrestore(&ndp
->lock
, flags
);
381 list_add_tail_rcu(&np
->node
, &ndp
->packages
);
383 spin_unlock_irqrestore(&ndp
->lock
, flags
);
388 void ncsi_remove_package(struct ncsi_package
*np
)
390 struct ncsi_dev_priv
*ndp
= np
->ndp
;
391 struct ncsi_channel
*nc
, *tmp
;
394 /* Release all child channels */
395 list_for_each_entry_safe(nc
, tmp
, &np
->channels
, node
)
396 ncsi_remove_channel(nc
);
398 /* Remove and free package */
399 spin_lock_irqsave(&ndp
->lock
, flags
);
400 list_del_rcu(&np
->node
);
402 spin_unlock_irqrestore(&ndp
->lock
, flags
);
407 void ncsi_find_package_and_channel(struct ncsi_dev_priv
*ndp
,
409 struct ncsi_package
**np
,
410 struct ncsi_channel
**nc
)
412 struct ncsi_package
*p
;
413 struct ncsi_channel
*c
;
415 p
= ncsi_find_package(ndp
, NCSI_PACKAGE_INDEX(id
));
416 c
= p
? ncsi_find_channel(p
, NCSI_CHANNEL_INDEX(id
)) : NULL
;
424 /* For two consecutive NCSI commands, the packet IDs shouldn't
425 * be same. Otherwise, the bogus response might be replied. So
426 * the available IDs are allocated in round-robin fashion.
428 struct ncsi_request
*ncsi_alloc_request(struct ncsi_dev_priv
*ndp
,
429 unsigned int req_flags
)
431 struct ncsi_request
*nr
= NULL
;
432 int i
, limit
= ARRAY_SIZE(ndp
->requests
);
435 /* Check if there is one available request until the ceiling */
436 spin_lock_irqsave(&ndp
->lock
, flags
);
437 for (i
= ndp
->request_id
; i
< limit
; i
++) {
438 if (ndp
->requests
[i
].used
)
441 nr
= &ndp
->requests
[i
];
443 nr
->flags
= req_flags
;
444 ndp
->request_id
= i
+ 1;
448 /* Fail back to check from the starting cursor */
449 for (i
= NCSI_REQ_START_IDX
; i
< ndp
->request_id
; i
++) {
450 if (ndp
->requests
[i
].used
)
453 nr
= &ndp
->requests
[i
];
455 nr
->flags
= req_flags
;
456 ndp
->request_id
= i
+ 1;
461 spin_unlock_irqrestore(&ndp
->lock
, flags
);
465 void ncsi_free_request(struct ncsi_request
*nr
)
467 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
468 struct sk_buff
*cmd
, *rsp
;
474 del_timer_sync(&nr
->timer
);
477 spin_lock_irqsave(&ndp
->lock
, flags
);
483 driven
= !!(nr
->flags
& NCSI_REQ_FLAG_EVENT_DRIVEN
);
484 spin_unlock_irqrestore(&ndp
->lock
, flags
);
486 if (driven
&& cmd
&& --ndp
->pending_req_num
== 0)
487 schedule_work(&ndp
->work
);
489 /* Release command and response */
494 struct ncsi_dev
*ncsi_find_dev(struct net_device
*dev
)
496 struct ncsi_dev_priv
*ndp
;
498 NCSI_FOR_EACH_DEV(ndp
) {
499 if (ndp
->ndev
.dev
== dev
)
506 static void ncsi_request_timeout(unsigned long data
)
508 struct ncsi_request
*nr
= (struct ncsi_request
*)data
;
509 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
512 /* If the request already had associated response,
513 * let the response handler to release it.
515 spin_lock_irqsave(&ndp
->lock
, flags
);
517 if (nr
->rsp
|| !nr
->cmd
) {
518 spin_unlock_irqrestore(&ndp
->lock
, flags
);
521 spin_unlock_irqrestore(&ndp
->lock
, flags
);
523 /* Release the request */
524 ncsi_free_request(nr
);
527 static void ncsi_suspend_channel(struct ncsi_dev_priv
*ndp
)
529 struct ncsi_dev
*nd
= &ndp
->ndev
;
530 struct ncsi_package
*np
= ndp
->active_package
;
531 struct ncsi_channel
*nc
= ndp
->active_channel
;
532 struct ncsi_cmd_arg nca
;
537 nca
.req_flags
= NCSI_REQ_FLAG_EVENT_DRIVEN
;
539 case ncsi_dev_state_suspend
:
540 nd
->state
= ncsi_dev_state_suspend_select
;
542 case ncsi_dev_state_suspend_select
:
543 ndp
->pending_req_num
= 1;
545 nca
.type
= NCSI_PKT_CMD_SP
;
546 nca
.package
= np
->id
;
547 nca
.channel
= NCSI_RESERVED_CHANNEL
;
548 if (ndp
->flags
& NCSI_DEV_HWA
)
553 /* To retrieve the last link states of channels in current
554 * package when current active channel needs fail over to
555 * another one. It means we will possibly select another
556 * channel as next active one. The link states of channels
557 * are most important factor of the selection. So we need
558 * accurate link states. Unfortunately, the link states on
559 * inactive channels can't be updated with LSC AEN in time.
561 if (ndp
->flags
& NCSI_DEV_RESHUFFLE
)
562 nd
->state
= ncsi_dev_state_suspend_gls
;
564 nd
->state
= ncsi_dev_state_suspend_dcnt
;
565 ret
= ncsi_xmit_cmd(&nca
);
570 case ncsi_dev_state_suspend_gls
:
571 ndp
->pending_req_num
= np
->channel_num
;
573 nca
.type
= NCSI_PKT_CMD_GLS
;
574 nca
.package
= np
->id
;
576 nd
->state
= ncsi_dev_state_suspend_dcnt
;
577 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
578 nca
.channel
= nc
->id
;
579 ret
= ncsi_xmit_cmd(&nca
);
585 case ncsi_dev_state_suspend_dcnt
:
586 ndp
->pending_req_num
= 1;
588 nca
.type
= NCSI_PKT_CMD_DCNT
;
589 nca
.package
= np
->id
;
590 nca
.channel
= nc
->id
;
592 nd
->state
= ncsi_dev_state_suspend_dc
;
593 ret
= ncsi_xmit_cmd(&nca
);
598 case ncsi_dev_state_suspend_dc
:
599 ndp
->pending_req_num
= 1;
601 nca
.type
= NCSI_PKT_CMD_DC
;
602 nca
.package
= np
->id
;
603 nca
.channel
= nc
->id
;
606 nd
->state
= ncsi_dev_state_suspend_deselect
;
607 ret
= ncsi_xmit_cmd(&nca
);
612 case ncsi_dev_state_suspend_deselect
:
613 ndp
->pending_req_num
= 1;
615 nca
.type
= NCSI_PKT_CMD_DP
;
616 nca
.package
= np
->id
;
617 nca
.channel
= NCSI_RESERVED_CHANNEL
;
619 nd
->state
= ncsi_dev_state_suspend_done
;
620 ret
= ncsi_xmit_cmd(&nca
);
625 case ncsi_dev_state_suspend_done
:
626 spin_lock_irqsave(&nc
->lock
, flags
);
627 nc
->state
= NCSI_CHANNEL_INACTIVE
;
628 spin_unlock_irqrestore(&nc
->lock
, flags
);
629 ncsi_process_next_channel(ndp
);
633 netdev_warn(nd
->dev
, "Wrong NCSI state 0x%x in suspend\n",
639 nd
->state
= ncsi_dev_state_functional
;
642 static void ncsi_configure_channel(struct ncsi_dev_priv
*ndp
)
644 struct ncsi_dev
*nd
= &ndp
->ndev
;
645 struct net_device
*dev
= nd
->dev
;
646 struct ncsi_package
*np
= ndp
->active_package
;
647 struct ncsi_channel
*nc
= ndp
->active_channel
;
648 struct ncsi_channel
*hot_nc
= NULL
;
649 struct ncsi_cmd_arg nca
;
655 nca
.req_flags
= NCSI_REQ_FLAG_EVENT_DRIVEN
;
657 case ncsi_dev_state_config
:
658 case ncsi_dev_state_config_sp
:
659 ndp
->pending_req_num
= 1;
661 /* Select the specific package */
662 nca
.type
= NCSI_PKT_CMD_SP
;
663 if (ndp
->flags
& NCSI_DEV_HWA
)
667 nca
.package
= np
->id
;
668 nca
.channel
= NCSI_RESERVED_CHANNEL
;
669 ret
= ncsi_xmit_cmd(&nca
);
673 nd
->state
= ncsi_dev_state_config_cis
;
675 case ncsi_dev_state_config_cis
:
676 ndp
->pending_req_num
= 1;
678 /* Clear initial state */
679 nca
.type
= NCSI_PKT_CMD_CIS
;
680 nca
.package
= np
->id
;
681 nca
.channel
= nc
->id
;
682 ret
= ncsi_xmit_cmd(&nca
);
686 nd
->state
= ncsi_dev_state_config_sma
;
688 case ncsi_dev_state_config_sma
:
689 case ncsi_dev_state_config_ebf
:
690 #if IS_ENABLED(CONFIG_IPV6)
691 case ncsi_dev_state_config_egmf
:
693 case ncsi_dev_state_config_ecnt
:
694 case ncsi_dev_state_config_ec
:
695 case ncsi_dev_state_config_ae
:
696 case ncsi_dev_state_config_gls
:
697 ndp
->pending_req_num
= 1;
699 nca
.package
= np
->id
;
700 nca
.channel
= nc
->id
;
702 /* Use first entry in unicast filter table. Note that
703 * the MAC filter table starts from entry 1 instead of
706 if (nd
->state
== ncsi_dev_state_config_sma
) {
707 nca
.type
= NCSI_PKT_CMD_SMA
;
708 for (index
= 0; index
< 6; index
++)
709 nca
.bytes
[index
] = dev
->dev_addr
[index
];
712 nd
->state
= ncsi_dev_state_config_ebf
;
713 } else if (nd
->state
== ncsi_dev_state_config_ebf
) {
714 nca
.type
= NCSI_PKT_CMD_EBF
;
715 nca
.dwords
[0] = nc
->caps
[NCSI_CAP_BC
].cap
;
716 nd
->state
= ncsi_dev_state_config_ecnt
;
717 #if IS_ENABLED(CONFIG_IPV6)
718 if (ndp
->inet6_addr_num
> 0 &&
719 (nc
->caps
[NCSI_CAP_GENERIC
].cap
&
720 NCSI_CAP_GENERIC_MC
))
721 nd
->state
= ncsi_dev_state_config_egmf
;
723 nd
->state
= ncsi_dev_state_config_ecnt
;
724 } else if (nd
->state
== ncsi_dev_state_config_egmf
) {
725 nca
.type
= NCSI_PKT_CMD_EGMF
;
726 nca
.dwords
[0] = nc
->caps
[NCSI_CAP_MC
].cap
;
727 nd
->state
= ncsi_dev_state_config_ecnt
;
728 #endif /* CONFIG_IPV6 */
729 } else if (nd
->state
== ncsi_dev_state_config_ecnt
) {
730 nca
.type
= NCSI_PKT_CMD_ECNT
;
731 nd
->state
= ncsi_dev_state_config_ec
;
732 } else if (nd
->state
== ncsi_dev_state_config_ec
) {
733 /* Enable AEN if it's supported */
734 nca
.type
= NCSI_PKT_CMD_EC
;
735 nd
->state
= ncsi_dev_state_config_ae
;
736 if (!(nc
->caps
[NCSI_CAP_AEN
].cap
& NCSI_CAP_AEN_MASK
))
737 nd
->state
= ncsi_dev_state_config_gls
;
738 } else if (nd
->state
== ncsi_dev_state_config_ae
) {
739 nca
.type
= NCSI_PKT_CMD_AE
;
741 nca
.dwords
[1] = nc
->caps
[NCSI_CAP_AEN
].cap
;
742 nd
->state
= ncsi_dev_state_config_gls
;
743 } else if (nd
->state
== ncsi_dev_state_config_gls
) {
744 nca
.type
= NCSI_PKT_CMD_GLS
;
745 nd
->state
= ncsi_dev_state_config_done
;
748 ret
= ncsi_xmit_cmd(&nca
);
752 case ncsi_dev_state_config_done
:
753 spin_lock_irqsave(&nc
->lock
, flags
);
754 if (nc
->modes
[NCSI_MODE_LINK
].data
[2] & 0x1) {
756 nc
->state
= NCSI_CHANNEL_ACTIVE
;
759 nc
->state
= NCSI_CHANNEL_INACTIVE
;
761 spin_unlock_irqrestore(&nc
->lock
, flags
);
763 /* Update the hot channel */
764 spin_lock_irqsave(&ndp
->lock
, flags
);
765 ndp
->hot_channel
= hot_nc
;
766 spin_unlock_irqrestore(&ndp
->lock
, flags
);
768 ncsi_start_channel_monitor(nc
);
769 ncsi_process_next_channel(ndp
);
772 netdev_warn(dev
, "Wrong NCSI state 0x%x in config\n",
779 ncsi_report_link(ndp
, true);
782 static int ncsi_choose_active_channel(struct ncsi_dev_priv
*ndp
)
784 struct ncsi_package
*np
;
785 struct ncsi_channel
*nc
, *found
, *hot_nc
;
786 struct ncsi_channel_mode
*ncm
;
789 spin_lock_irqsave(&ndp
->lock
, flags
);
790 hot_nc
= ndp
->hot_channel
;
791 spin_unlock_irqrestore(&ndp
->lock
, flags
);
793 /* The search is done once an inactive channel with up
797 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
798 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
799 spin_lock_irqsave(&nc
->lock
, flags
);
801 if (!list_empty(&nc
->link
) ||
802 nc
->state
!= NCSI_CHANNEL_INACTIVE
) {
803 spin_unlock_irqrestore(&nc
->lock
, flags
);
813 ncm
= &nc
->modes
[NCSI_MODE_LINK
];
814 if (ncm
->data
[2] & 0x1) {
815 spin_unlock_irqrestore(&nc
->lock
, flags
);
820 spin_unlock_irqrestore(&nc
->lock
, flags
);
825 ncsi_report_link(ndp
, true);
830 spin_lock_irqsave(&ndp
->lock
, flags
);
831 list_add_tail_rcu(&found
->link
, &ndp
->channel_queue
);
832 spin_unlock_irqrestore(&ndp
->lock
, flags
);
834 return ncsi_process_next_channel(ndp
);
837 static bool ncsi_check_hwa(struct ncsi_dev_priv
*ndp
)
839 struct ncsi_package
*np
;
840 struct ncsi_channel
*nc
;
843 /* The hardware arbitration is disabled if any one channel
844 * doesn't support explicitly.
846 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
847 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
848 cap
= nc
->caps
[NCSI_CAP_GENERIC
].cap
;
849 if (!(cap
& NCSI_CAP_GENERIC_HWA
) ||
850 (cap
& NCSI_CAP_GENERIC_HWA_MASK
) !=
851 NCSI_CAP_GENERIC_HWA_SUPPORT
) {
852 ndp
->flags
&= ~NCSI_DEV_HWA
;
858 ndp
->flags
|= NCSI_DEV_HWA
;
862 static int ncsi_enable_hwa(struct ncsi_dev_priv
*ndp
)
864 struct ncsi_package
*np
;
865 struct ncsi_channel
*nc
;
868 /* Move all available channels to processing queue */
869 spin_lock_irqsave(&ndp
->lock
, flags
);
870 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
871 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
872 WARN_ON_ONCE(nc
->state
!= NCSI_CHANNEL_INACTIVE
||
873 !list_empty(&nc
->link
));
874 ncsi_stop_channel_monitor(nc
);
875 list_add_tail_rcu(&nc
->link
, &ndp
->channel_queue
);
878 spin_unlock_irqrestore(&ndp
->lock
, flags
);
880 /* We can have no channels in extremely case */
881 if (list_empty(&ndp
->channel_queue
)) {
882 ncsi_report_link(ndp
, false);
886 return ncsi_process_next_channel(ndp
);
889 static void ncsi_probe_channel(struct ncsi_dev_priv
*ndp
)
891 struct ncsi_dev
*nd
= &ndp
->ndev
;
892 struct ncsi_package
*np
;
893 struct ncsi_channel
*nc
;
894 struct ncsi_cmd_arg nca
;
899 nca
.req_flags
= NCSI_REQ_FLAG_EVENT_DRIVEN
;
901 case ncsi_dev_state_probe
:
902 nd
->state
= ncsi_dev_state_probe_deselect
;
904 case ncsi_dev_state_probe_deselect
:
905 ndp
->pending_req_num
= 8;
907 /* Deselect all possible packages */
908 nca
.type
= NCSI_PKT_CMD_DP
;
909 nca
.channel
= NCSI_RESERVED_CHANNEL
;
910 for (index
= 0; index
< 8; index
++) {
912 ret
= ncsi_xmit_cmd(&nca
);
917 nd
->state
= ncsi_dev_state_probe_package
;
919 case ncsi_dev_state_probe_package
:
920 ndp
->pending_req_num
= 16;
922 /* Select all possible packages */
923 nca
.type
= NCSI_PKT_CMD_SP
;
925 nca
.channel
= NCSI_RESERVED_CHANNEL
;
926 for (index
= 0; index
< 8; index
++) {
928 ret
= ncsi_xmit_cmd(&nca
);
933 /* Disable all possible packages */
934 nca
.type
= NCSI_PKT_CMD_DP
;
935 for (index
= 0; index
< 8; index
++) {
937 ret
= ncsi_xmit_cmd(&nca
);
942 nd
->state
= ncsi_dev_state_probe_channel
;
944 case ncsi_dev_state_probe_channel
:
945 if (!ndp
->active_package
)
946 ndp
->active_package
= list_first_or_null_rcu(
947 &ndp
->packages
, struct ncsi_package
, node
);
948 else if (list_is_last(&ndp
->active_package
->node
,
950 ndp
->active_package
= NULL
;
952 ndp
->active_package
= list_next_entry(
953 ndp
->active_package
, node
);
955 /* All available packages and channels are enumerated. The
956 * enumeration happens for once when the NCSI interface is
957 * started. So we need continue to start the interface after
960 * We have to choose an active channel before configuring it.
961 * Note that we possibly don't have active channel in extreme
964 if (!ndp
->active_package
) {
965 ndp
->flags
|= NCSI_DEV_PROBED
;
966 if (ncsi_check_hwa(ndp
))
967 ncsi_enable_hwa(ndp
);
969 ncsi_choose_active_channel(ndp
);
973 /* Select the active package */
974 ndp
->pending_req_num
= 1;
975 nca
.type
= NCSI_PKT_CMD_SP
;
977 nca
.package
= ndp
->active_package
->id
;
978 nca
.channel
= NCSI_RESERVED_CHANNEL
;
979 ret
= ncsi_xmit_cmd(&nca
);
983 nd
->state
= ncsi_dev_state_probe_cis
;
985 case ncsi_dev_state_probe_cis
:
986 ndp
->pending_req_num
= NCSI_RESERVED_CHANNEL
;
988 /* Clear initial state */
989 nca
.type
= NCSI_PKT_CMD_CIS
;
990 nca
.package
= ndp
->active_package
->id
;
991 for (index
= 0; index
< NCSI_RESERVED_CHANNEL
; index
++) {
993 ret
= ncsi_xmit_cmd(&nca
);
998 nd
->state
= ncsi_dev_state_probe_gvi
;
1000 case ncsi_dev_state_probe_gvi
:
1001 case ncsi_dev_state_probe_gc
:
1002 case ncsi_dev_state_probe_gls
:
1003 np
= ndp
->active_package
;
1004 ndp
->pending_req_num
= np
->channel_num
;
1006 /* Retrieve version, capability or link status */
1007 if (nd
->state
== ncsi_dev_state_probe_gvi
)
1008 nca
.type
= NCSI_PKT_CMD_GVI
;
1009 else if (nd
->state
== ncsi_dev_state_probe_gc
)
1010 nca
.type
= NCSI_PKT_CMD_GC
;
1012 nca
.type
= NCSI_PKT_CMD_GLS
;
1014 nca
.package
= np
->id
;
1015 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
1016 nca
.channel
= nc
->id
;
1017 ret
= ncsi_xmit_cmd(&nca
);
1022 if (nd
->state
== ncsi_dev_state_probe_gvi
)
1023 nd
->state
= ncsi_dev_state_probe_gc
;
1024 else if (nd
->state
== ncsi_dev_state_probe_gc
)
1025 nd
->state
= ncsi_dev_state_probe_gls
;
1027 nd
->state
= ncsi_dev_state_probe_dp
;
1029 case ncsi_dev_state_probe_dp
:
1030 ndp
->pending_req_num
= 1;
1032 /* Deselect the active package */
1033 nca
.type
= NCSI_PKT_CMD_DP
;
1034 nca
.package
= ndp
->active_package
->id
;
1035 nca
.channel
= NCSI_RESERVED_CHANNEL
;
1036 ret
= ncsi_xmit_cmd(&nca
);
1040 /* Scan channels in next package */
1041 nd
->state
= ncsi_dev_state_probe_channel
;
1044 netdev_warn(nd
->dev
, "Wrong NCSI state 0x%0x in enumeration\n",
1050 ncsi_report_link(ndp
, true);
1053 static void ncsi_dev_work(struct work_struct
*work
)
1055 struct ncsi_dev_priv
*ndp
= container_of(work
,
1056 struct ncsi_dev_priv
, work
);
1057 struct ncsi_dev
*nd
= &ndp
->ndev
;
1059 switch (nd
->state
& ncsi_dev_state_major
) {
1060 case ncsi_dev_state_probe
:
1061 ncsi_probe_channel(ndp
);
1063 case ncsi_dev_state_suspend
:
1064 ncsi_suspend_channel(ndp
);
1066 case ncsi_dev_state_config
:
1067 ncsi_configure_channel(ndp
);
1070 netdev_warn(nd
->dev
, "Wrong NCSI state 0x%x in workqueue\n",
1075 int ncsi_process_next_channel(struct ncsi_dev_priv
*ndp
)
1077 struct ncsi_channel
*nc
;
1079 unsigned long flags
;
1081 spin_lock_irqsave(&ndp
->lock
, flags
);
1082 nc
= list_first_or_null_rcu(&ndp
->channel_queue
,
1083 struct ncsi_channel
, link
);
1085 spin_unlock_irqrestore(&ndp
->lock
, flags
);
1089 list_del_init(&nc
->link
);
1090 spin_unlock_irqrestore(&ndp
->lock
, flags
);
1092 spin_lock_irqsave(&nc
->lock
, flags
);
1093 old_state
= nc
->state
;
1094 nc
->state
= NCSI_CHANNEL_INVISIBLE
;
1095 spin_unlock_irqrestore(&nc
->lock
, flags
);
1097 ndp
->active_channel
= nc
;
1098 ndp
->active_package
= nc
->package
;
1100 switch (old_state
) {
1101 case NCSI_CHANNEL_INACTIVE
:
1102 ndp
->ndev
.state
= ncsi_dev_state_config
;
1103 ncsi_configure_channel(ndp
);
1105 case NCSI_CHANNEL_ACTIVE
:
1106 ndp
->ndev
.state
= ncsi_dev_state_suspend
;
1107 ncsi_suspend_channel(ndp
);
1110 netdev_err(ndp
->ndev
.dev
, "Invalid state 0x%x on %d:%d\n",
1111 old_state
, nc
->package
->id
, nc
->id
);
1112 ncsi_report_link(ndp
, false);
1119 ndp
->active_channel
= NULL
;
1120 ndp
->active_package
= NULL
;
1121 if (ndp
->flags
& NCSI_DEV_RESHUFFLE
) {
1122 ndp
->flags
&= ~NCSI_DEV_RESHUFFLE
;
1123 return ncsi_choose_active_channel(ndp
);
1126 ncsi_report_link(ndp
, false);
1130 #if IS_ENABLED(CONFIG_IPV6)
1131 static int ncsi_inet6addr_event(struct notifier_block
*this,
1132 unsigned long event
, void *data
)
1134 struct inet6_ifaddr
*ifa
= data
;
1135 struct net_device
*dev
= ifa
->idev
->dev
;
1136 struct ncsi_dev
*nd
= ncsi_find_dev(dev
);
1137 struct ncsi_dev_priv
*ndp
= nd
? TO_NCSI_DEV_PRIV(nd
) : NULL
;
1138 struct ncsi_package
*np
;
1139 struct ncsi_channel
*nc
;
1140 struct ncsi_cmd_arg nca
;
1144 if (!ndp
|| (ipv6_addr_type(&ifa
->addr
) &
1145 (IPV6_ADDR_LINKLOCAL
| IPV6_ADDR_LOOPBACK
)))
1150 action
= (++ndp
->inet6_addr_num
) == 1;
1151 nca
.type
= NCSI_PKT_CMD_EGMF
;
1154 action
= (--ndp
->inet6_addr_num
== 0);
1155 nca
.type
= NCSI_PKT_CMD_DGMF
;
1161 /* We might not have active channel or packages. The IPv6
1162 * required multicast will be enabled when active channel
1163 * or packages are chosen.
1165 np
= ndp
->active_package
;
1166 nc
= ndp
->active_channel
;
1167 if (!action
|| !np
|| !nc
)
1170 /* We needn't enable or disable it if the function isn't supported */
1171 if (!(nc
->caps
[NCSI_CAP_GENERIC
].cap
& NCSI_CAP_GENERIC_MC
))
1176 nca
.package
= np
->id
;
1177 nca
.channel
= nc
->id
;
1178 nca
.dwords
[0] = nc
->caps
[NCSI_CAP_MC
].cap
;
1179 ret
= ncsi_xmit_cmd(&nca
);
1181 netdev_warn(dev
, "Fail to %s global multicast filter (%d)\n",
1182 (event
== NETDEV_UP
) ? "enable" : "disable", ret
);
1189 static struct notifier_block ncsi_inet6addr_notifier
= {
1190 .notifier_call
= ncsi_inet6addr_event
,
1192 #endif /* CONFIG_IPV6 */
1194 struct ncsi_dev
*ncsi_register_dev(struct net_device
*dev
,
1195 void (*handler
)(struct ncsi_dev
*ndev
))
1197 struct ncsi_dev_priv
*ndp
;
1198 struct ncsi_dev
*nd
;
1199 unsigned long flags
;
1202 /* Check if the device has been registered or not */
1203 nd
= ncsi_find_dev(dev
);
1207 /* Create NCSI device */
1208 ndp
= kzalloc(sizeof(*ndp
), GFP_ATOMIC
);
1213 nd
->state
= ncsi_dev_state_registered
;
1215 nd
->handler
= handler
;
1216 ndp
->pending_req_num
= 0;
1217 INIT_LIST_HEAD(&ndp
->channel_queue
);
1218 INIT_WORK(&ndp
->work
, ncsi_dev_work
);
1220 /* Initialize private NCSI device */
1221 spin_lock_init(&ndp
->lock
);
1222 INIT_LIST_HEAD(&ndp
->packages
);
1223 ndp
->request_id
= NCSI_REQ_START_IDX
;
1224 for (i
= 0; i
< ARRAY_SIZE(ndp
->requests
); i
++) {
1225 ndp
->requests
[i
].id
= i
;
1226 ndp
->requests
[i
].ndp
= ndp
;
1227 setup_timer(&ndp
->requests
[i
].timer
,
1228 ncsi_request_timeout
,
1229 (unsigned long)&ndp
->requests
[i
]);
1232 spin_lock_irqsave(&ncsi_dev_lock
, flags
);
1233 #if IS_ENABLED(CONFIG_IPV6)
1234 ndp
->inet6_addr_num
= 0;
1235 if (list_empty(&ncsi_dev_list
))
1236 register_inet6addr_notifier(&ncsi_inet6addr_notifier
);
1238 list_add_tail_rcu(&ndp
->node
, &ncsi_dev_list
);
1239 spin_unlock_irqrestore(&ncsi_dev_lock
, flags
);
1241 /* Register NCSI packet Rx handler */
1242 ndp
->ptype
.type
= cpu_to_be16(ETH_P_NCSI
);
1243 ndp
->ptype
.func
= ncsi_rcv_rsp
;
1244 ndp
->ptype
.dev
= dev
;
1245 dev_add_pack(&ndp
->ptype
);
1249 EXPORT_SYMBOL_GPL(ncsi_register_dev
);
1251 int ncsi_start_dev(struct ncsi_dev
*nd
)
1253 struct ncsi_dev_priv
*ndp
= TO_NCSI_DEV_PRIV(nd
);
1256 if (nd
->state
!= ncsi_dev_state_registered
&&
1257 nd
->state
!= ncsi_dev_state_functional
)
1260 if (!(ndp
->flags
& NCSI_DEV_PROBED
)) {
1261 nd
->state
= ncsi_dev_state_probe
;
1262 schedule_work(&ndp
->work
);
1266 if (ndp
->flags
& NCSI_DEV_HWA
)
1267 ret
= ncsi_enable_hwa(ndp
);
1269 ret
= ncsi_choose_active_channel(ndp
);
1273 EXPORT_SYMBOL_GPL(ncsi_start_dev
);
1275 void ncsi_stop_dev(struct ncsi_dev
*nd
)
1277 struct ncsi_dev_priv
*ndp
= TO_NCSI_DEV_PRIV(nd
);
1278 struct ncsi_package
*np
;
1279 struct ncsi_channel
*nc
;
1282 unsigned long flags
;
1284 /* Stop the channel monitor and reset channel's state */
1285 NCSI_FOR_EACH_PACKAGE(ndp
, np
) {
1286 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
1287 ncsi_stop_channel_monitor(nc
);
1289 spin_lock_irqsave(&nc
->lock
, flags
);
1290 chained
= !list_empty(&nc
->link
);
1291 old_state
= nc
->state
;
1292 nc
->state
= NCSI_CHANNEL_INACTIVE
;
1293 spin_unlock_irqrestore(&nc
->lock
, flags
);
1295 WARN_ON_ONCE(chained
||
1296 old_state
== NCSI_CHANNEL_INVISIBLE
);
1300 ncsi_report_link(ndp
, true);
1302 EXPORT_SYMBOL_GPL(ncsi_stop_dev
);
1304 void ncsi_unregister_dev(struct ncsi_dev
*nd
)
1306 struct ncsi_dev_priv
*ndp
= TO_NCSI_DEV_PRIV(nd
);
1307 struct ncsi_package
*np
, *tmp
;
1308 unsigned long flags
;
1310 dev_remove_pack(&ndp
->ptype
);
1312 list_for_each_entry_safe(np
, tmp
, &ndp
->packages
, node
)
1313 ncsi_remove_package(np
);
1315 spin_lock_irqsave(&ncsi_dev_lock
, flags
);
1316 list_del_rcu(&ndp
->node
);
1317 #if IS_ENABLED(CONFIG_IPV6)
1318 if (list_empty(&ncsi_dev_list
))
1319 unregister_inet6addr_notifier(&ncsi_inet6addr_notifier
);
1321 spin_unlock_irqrestore(&ncsi_dev_lock
, flags
);
1325 EXPORT_SYMBOL_GPL(ncsi_unregister_dev
);