Lines Matching refs:ndp
130 static void ncsi_report_link(struct ncsi_dev_priv *ndp, bool force_down) in ncsi_report_link() argument
132 struct ncsi_dev *nd = &ndp->ndev; in ncsi_report_link()
144 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_report_link()
172 struct ncsi_dev_priv *ndp = np->ndp; in ncsi_channel_monitor() local
195 nca.ndp = ndp; in ncsi_channel_monitor()
202 netdev_err(ndp->ndev.dev, "Error %d sending GLS\n", in ncsi_channel_monitor()
211 if (!(ndp->flags & NCSI_DEV_HWA) && in ncsi_channel_monitor()
213 ncsi_report_link(ndp, true); in ncsi_channel_monitor()
214 ndp->flags |= NCSI_DEV_RESHUFFLE; in ncsi_channel_monitor()
221 spin_lock_irqsave(&ndp->lock, flags); in ncsi_channel_monitor()
223 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_channel_monitor()
224 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_channel_monitor()
225 ncsi_process_next_channel(ndp); in ncsi_channel_monitor()
345 struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp, in ncsi_find_package() argument
350 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_find_package()
358 struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp, in ncsi_add_package() argument
369 np->ndp = ndp; in ncsi_add_package()
373 spin_lock_irqsave(&ndp->lock, flags); in ncsi_add_package()
374 tmp = ncsi_find_package(ndp, id); in ncsi_add_package()
376 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_add_package()
381 list_add_tail_rcu(&np->node, &ndp->packages); in ncsi_add_package()
382 ndp->package_num++; in ncsi_add_package()
383 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_add_package()
390 struct ncsi_dev_priv *ndp = np->ndp; in ncsi_remove_package() local
399 spin_lock_irqsave(&ndp->lock, flags); in ncsi_remove_package()
401 ndp->package_num--; in ncsi_remove_package()
402 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_remove_package()
407 void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp, in ncsi_find_package_and_channel() argument
415 p = ncsi_find_package(ndp, NCSI_PACKAGE_INDEX(id)); in ncsi_find_package_and_channel()
428 struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp, in ncsi_alloc_request() argument
432 int i, limit = ARRAY_SIZE(ndp->requests); in ncsi_alloc_request()
436 spin_lock_irqsave(&ndp->lock, flags); in ncsi_alloc_request()
437 for (i = ndp->request_id; i < limit; i++) { in ncsi_alloc_request()
438 if (ndp->requests[i].used) in ncsi_alloc_request()
441 nr = &ndp->requests[i]; in ncsi_alloc_request()
444 ndp->request_id = i + 1; in ncsi_alloc_request()
449 for (i = NCSI_REQ_START_IDX; i < ndp->request_id; i++) { in ncsi_alloc_request()
450 if (ndp->requests[i].used) in ncsi_alloc_request()
453 nr = &ndp->requests[i]; in ncsi_alloc_request()
456 ndp->request_id = i + 1; in ncsi_alloc_request()
461 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_alloc_request()
467 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_free_request() local
477 spin_lock_irqsave(&ndp->lock, flags); in ncsi_free_request()
484 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_free_request()
486 if (driven && cmd && --ndp->pending_req_num == 0) in ncsi_free_request()
487 schedule_work(&ndp->work); in ncsi_free_request()
496 struct ncsi_dev_priv *ndp; in ncsi_find_dev() local
498 NCSI_FOR_EACH_DEV(ndp) { in ncsi_find_dev()
499 if (ndp->ndev.dev == dev) in ncsi_find_dev()
500 return &ndp->ndev; in ncsi_find_dev()
509 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_request_timeout() local
515 spin_lock_irqsave(&ndp->lock, flags); in ncsi_request_timeout()
518 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_request_timeout()
521 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_request_timeout()
527 static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp) in ncsi_suspend_channel() argument
529 struct ncsi_dev *nd = &ndp->ndev; in ncsi_suspend_channel()
530 struct ncsi_package *np = ndp->active_package; in ncsi_suspend_channel()
531 struct ncsi_channel *nc = ndp->active_channel; in ncsi_suspend_channel()
536 nca.ndp = ndp; in ncsi_suspend_channel()
543 ndp->pending_req_num = 1; in ncsi_suspend_channel()
548 if (ndp->flags & NCSI_DEV_HWA) in ncsi_suspend_channel()
561 if (ndp->flags & NCSI_DEV_RESHUFFLE) in ncsi_suspend_channel()
571 ndp->pending_req_num = np->channel_num; in ncsi_suspend_channel()
586 ndp->pending_req_num = 1; in ncsi_suspend_channel()
599 ndp->pending_req_num = 1; in ncsi_suspend_channel()
613 ndp->pending_req_num = 1; in ncsi_suspend_channel()
629 ncsi_process_next_channel(ndp); in ncsi_suspend_channel()
642 static void ncsi_configure_channel(struct ncsi_dev_priv *ndp) in ncsi_configure_channel() argument
644 struct ncsi_dev *nd = &ndp->ndev; in ncsi_configure_channel()
646 struct ncsi_package *np = ndp->active_package; in ncsi_configure_channel()
647 struct ncsi_channel *nc = ndp->active_channel; in ncsi_configure_channel()
654 nca.ndp = ndp; in ncsi_configure_channel()
659 ndp->pending_req_num = 1; in ncsi_configure_channel()
663 if (ndp->flags & NCSI_DEV_HWA) in ncsi_configure_channel()
676 ndp->pending_req_num = 1; in ncsi_configure_channel()
697 ndp->pending_req_num = 1; in ncsi_configure_channel()
718 if (ndp->inet6_addr_num > 0 && in ncsi_configure_channel()
764 spin_lock_irqsave(&ndp->lock, flags); in ncsi_configure_channel()
765 ndp->hot_channel = hot_nc; in ncsi_configure_channel()
766 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_configure_channel()
769 ncsi_process_next_channel(ndp); in ncsi_configure_channel()
779 ncsi_report_link(ndp, true); in ncsi_configure_channel()
782 static int ncsi_choose_active_channel(struct ncsi_dev_priv *ndp) in ncsi_choose_active_channel() argument
789 spin_lock_irqsave(&ndp->lock, flags); in ncsi_choose_active_channel()
790 hot_nc = ndp->hot_channel; in ncsi_choose_active_channel()
791 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_choose_active_channel()
797 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_choose_active_channel()
825 ncsi_report_link(ndp, true); in ncsi_choose_active_channel()
830 spin_lock_irqsave(&ndp->lock, flags); in ncsi_choose_active_channel()
831 list_add_tail_rcu(&found->link, &ndp->channel_queue); in ncsi_choose_active_channel()
832 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_choose_active_channel()
834 return ncsi_process_next_channel(ndp); in ncsi_choose_active_channel()
837 static bool ncsi_check_hwa(struct ncsi_dev_priv *ndp) in ncsi_check_hwa() argument
846 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_check_hwa()
852 ndp->flags &= ~NCSI_DEV_HWA; in ncsi_check_hwa()
858 ndp->flags |= NCSI_DEV_HWA; in ncsi_check_hwa()
862 static int ncsi_enable_hwa(struct ncsi_dev_priv *ndp) in ncsi_enable_hwa() argument
869 spin_lock_irqsave(&ndp->lock, flags); in ncsi_enable_hwa()
870 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_enable_hwa()
875 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_enable_hwa()
878 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_enable_hwa()
881 if (list_empty(&ndp->channel_queue)) { in ncsi_enable_hwa()
882 ncsi_report_link(ndp, false); in ncsi_enable_hwa()
886 return ncsi_process_next_channel(ndp); in ncsi_enable_hwa()
889 static void ncsi_probe_channel(struct ncsi_dev_priv *ndp) in ncsi_probe_channel() argument
891 struct ncsi_dev *nd = &ndp->ndev; in ncsi_probe_channel()
898 nca.ndp = ndp; in ncsi_probe_channel()
905 ndp->pending_req_num = 8; in ncsi_probe_channel()
920 ndp->pending_req_num = 16; in ncsi_probe_channel()
945 if (!ndp->active_package) in ncsi_probe_channel()
946 ndp->active_package = list_first_or_null_rcu( in ncsi_probe_channel()
947 &ndp->packages, struct ncsi_package, node); in ncsi_probe_channel()
948 else if (list_is_last(&ndp->active_package->node, in ncsi_probe_channel()
949 &ndp->packages)) in ncsi_probe_channel()
950 ndp->active_package = NULL; in ncsi_probe_channel()
952 ndp->active_package = list_next_entry( in ncsi_probe_channel()
953 ndp->active_package, node); in ncsi_probe_channel()
964 if (!ndp->active_package) { in ncsi_probe_channel()
965 ndp->flags |= NCSI_DEV_PROBED; in ncsi_probe_channel()
966 if (ncsi_check_hwa(ndp)) in ncsi_probe_channel()
967 ncsi_enable_hwa(ndp); in ncsi_probe_channel()
969 ncsi_choose_active_channel(ndp); in ncsi_probe_channel()
974 ndp->pending_req_num = 1; in ncsi_probe_channel()
977 nca.package = ndp->active_package->id; in ncsi_probe_channel()
986 ndp->pending_req_num = NCSI_RESERVED_CHANNEL; in ncsi_probe_channel()
990 nca.package = ndp->active_package->id; in ncsi_probe_channel()
1003 np = ndp->active_package; in ncsi_probe_channel()
1004 ndp->pending_req_num = np->channel_num; in ncsi_probe_channel()
1030 ndp->pending_req_num = 1; in ncsi_probe_channel()
1034 nca.package = ndp->active_package->id; in ncsi_probe_channel()
1050 ncsi_report_link(ndp, true); in ncsi_probe_channel()
1055 struct ncsi_dev_priv *ndp = container_of(work, in ncsi_dev_work() local
1057 struct ncsi_dev *nd = &ndp->ndev; in ncsi_dev_work()
1061 ncsi_probe_channel(ndp); in ncsi_dev_work()
1064 ncsi_suspend_channel(ndp); in ncsi_dev_work()
1067 ncsi_configure_channel(ndp); in ncsi_dev_work()
1075 int ncsi_process_next_channel(struct ncsi_dev_priv *ndp) in ncsi_process_next_channel() argument
1081 spin_lock_irqsave(&ndp->lock, flags); in ncsi_process_next_channel()
1082 nc = list_first_or_null_rcu(&ndp->channel_queue, in ncsi_process_next_channel()
1085 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_process_next_channel()
1090 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_process_next_channel()
1097 ndp->active_channel = nc; in ncsi_process_next_channel()
1098 ndp->active_package = nc->package; in ncsi_process_next_channel()
1102 ndp->ndev.state = ncsi_dev_state_config; in ncsi_process_next_channel()
1103 ncsi_configure_channel(ndp); in ncsi_process_next_channel()
1106 ndp->ndev.state = ncsi_dev_state_suspend; in ncsi_process_next_channel()
1107 ncsi_suspend_channel(ndp); in ncsi_process_next_channel()
1110 netdev_err(ndp->ndev.dev, "Invalid state 0x%x on %d:%d\n", in ncsi_process_next_channel()
1112 ncsi_report_link(ndp, false); in ncsi_process_next_channel()
1119 ndp->active_channel = NULL; in ncsi_process_next_channel()
1120 ndp->active_package = NULL; in ncsi_process_next_channel()
1121 if (ndp->flags & NCSI_DEV_RESHUFFLE) { in ncsi_process_next_channel()
1122 ndp->flags &= ~NCSI_DEV_RESHUFFLE; in ncsi_process_next_channel()
1123 return ncsi_choose_active_channel(ndp); in ncsi_process_next_channel()
1126 ncsi_report_link(ndp, false); in ncsi_process_next_channel()
1137 struct ncsi_dev_priv *ndp = nd ? TO_NCSI_DEV_PRIV(nd) : NULL; in ncsi_inet6addr_event() local
1144 if (!ndp || (ipv6_addr_type(&ifa->addr) & in ncsi_inet6addr_event()
1150 action = (++ndp->inet6_addr_num) == 1; in ncsi_inet6addr_event()
1154 action = (--ndp->inet6_addr_num == 0); in ncsi_inet6addr_event()
1165 np = ndp->active_package; in ncsi_inet6addr_event()
1166 nc = ndp->active_channel; in ncsi_inet6addr_event()
1174 nca.ndp = ndp; in ncsi_inet6addr_event()
1197 struct ncsi_dev_priv *ndp; in ncsi_register_dev() local
1208 ndp = kzalloc(sizeof(*ndp), GFP_ATOMIC); in ncsi_register_dev()
1209 if (!ndp) in ncsi_register_dev()
1212 nd = &ndp->ndev; in ncsi_register_dev()
1216 ndp->pending_req_num = 0; in ncsi_register_dev()
1217 INIT_LIST_HEAD(&ndp->channel_queue); in ncsi_register_dev()
1218 INIT_WORK(&ndp->work, ncsi_dev_work); in ncsi_register_dev()
1221 spin_lock_init(&ndp->lock); in ncsi_register_dev()
1222 INIT_LIST_HEAD(&ndp->packages); in ncsi_register_dev()
1223 ndp->request_id = NCSI_REQ_START_IDX; in ncsi_register_dev()
1224 for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) { in ncsi_register_dev()
1225 ndp->requests[i].id = i; in ncsi_register_dev()
1226 ndp->requests[i].ndp = ndp; in ncsi_register_dev()
1227 setup_timer(&ndp->requests[i].timer, in ncsi_register_dev()
1229 (unsigned long)&ndp->requests[i]); in ncsi_register_dev()
1234 ndp->inet6_addr_num = 0; in ncsi_register_dev()
1238 list_add_tail_rcu(&ndp->node, &ncsi_dev_list); in ncsi_register_dev()
1242 ndp->ptype.type = cpu_to_be16(ETH_P_NCSI); in ncsi_register_dev()
1243 ndp->ptype.func = ncsi_rcv_rsp; in ncsi_register_dev()
1244 ndp->ptype.dev = dev; in ncsi_register_dev()
1245 dev_add_pack(&ndp->ptype); in ncsi_register_dev()
1253 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_start_dev() local
1260 if (!(ndp->flags & NCSI_DEV_PROBED)) { in ncsi_start_dev()
1262 schedule_work(&ndp->work); in ncsi_start_dev()
1266 if (ndp->flags & NCSI_DEV_HWA) in ncsi_start_dev()
1267 ret = ncsi_enable_hwa(ndp); in ncsi_start_dev()
1269 ret = ncsi_choose_active_channel(ndp); in ncsi_start_dev()
1277 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_stop_dev() local
1285 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_stop_dev()
1300 ncsi_report_link(ndp, true); in ncsi_stop_dev()
1306 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_unregister_dev() local
1310 dev_remove_pack(&ndp->ptype); in ncsi_unregister_dev()
1312 list_for_each_entry_safe(np, tmp, &ndp->packages, node) in ncsi_unregister_dev()
1316 list_del_rcu(&ndp->node); in ncsi_unregister_dev()
1323 kfree(ndp); in ncsi_unregister_dev()