Lines Matching refs:ndp
30 static void ncsi_report_link(struct ncsi_dev_priv *ndp, bool force_down) in ncsi_report_link() argument
32 struct ncsi_dev *nd = &ndp->ndev; in ncsi_report_link()
44 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_report_link()
72 struct ncsi_dev_priv *ndp = np->ndp; in ncsi_channel_monitor() local
100 nca.ndp = ndp; in ncsi_channel_monitor()
107 netdev_err(ndp->ndev.dev, "Error %d sending GLS\n", in ncsi_channel_monitor()
113 netdev_err(ndp->ndev.dev, "NCSI Channel %d timed out!\n", in ncsi_channel_monitor()
115 if (!(ndp->flags & NCSI_DEV_HWA)) { in ncsi_channel_monitor()
116 ncsi_report_link(ndp, true); in ncsi_channel_monitor()
117 ndp->flags |= NCSI_DEV_RESHUFFLE; in ncsi_channel_monitor()
128 spin_lock_irqsave(&ndp->lock, flags); in ncsi_channel_monitor()
130 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_channel_monitor()
131 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_channel_monitor()
132 ncsi_process_next_channel(ndp); in ncsi_channel_monitor()
244 struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp, in ncsi_find_package() argument
249 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_find_package()
257 struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp, in ncsi_add_package() argument
268 np->ndp = ndp; in ncsi_add_package()
272 spin_lock_irqsave(&ndp->lock, flags); in ncsi_add_package()
273 tmp = ncsi_find_package(ndp, id); in ncsi_add_package()
275 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_add_package()
280 list_add_tail_rcu(&np->node, &ndp->packages); in ncsi_add_package()
281 ndp->package_num++; in ncsi_add_package()
282 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_add_package()
289 struct ncsi_dev_priv *ndp = np->ndp; in ncsi_remove_package() local
298 spin_lock_irqsave(&ndp->lock, flags); in ncsi_remove_package()
300 ndp->package_num--; in ncsi_remove_package()
301 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_remove_package()
306 void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp, in ncsi_find_package_and_channel() argument
314 p = ncsi_find_package(ndp, NCSI_PACKAGE_INDEX(id)); in ncsi_find_package_and_channel()
327 struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp, in ncsi_alloc_request() argument
331 int i, limit = ARRAY_SIZE(ndp->requests); in ncsi_alloc_request()
335 spin_lock_irqsave(&ndp->lock, flags); in ncsi_alloc_request()
336 for (i = ndp->request_id; i < limit; i++) { in ncsi_alloc_request()
337 if (ndp->requests[i].used) in ncsi_alloc_request()
340 nr = &ndp->requests[i]; in ncsi_alloc_request()
343 ndp->request_id = i + 1; in ncsi_alloc_request()
348 for (i = NCSI_REQ_START_IDX; i < ndp->request_id; i++) { in ncsi_alloc_request()
349 if (ndp->requests[i].used) in ncsi_alloc_request()
352 nr = &ndp->requests[i]; in ncsi_alloc_request()
355 ndp->request_id = i + 1; in ncsi_alloc_request()
360 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_alloc_request()
366 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_free_request() local
376 spin_lock_irqsave(&ndp->lock, flags); in ncsi_free_request()
383 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_free_request()
385 if (driven && cmd && --ndp->pending_req_num == 0) in ncsi_free_request()
386 schedule_work(&ndp->work); in ncsi_free_request()
395 struct ncsi_dev_priv *ndp; in ncsi_find_dev() local
397 NCSI_FOR_EACH_DEV(ndp) { in ncsi_find_dev()
398 if (ndp->ndev.dev == dev) in ncsi_find_dev()
399 return &ndp->ndev; in ncsi_find_dev()
408 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_request_timeout() local
414 spin_lock_irqsave(&ndp->lock, flags); in ncsi_request_timeout()
417 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_request_timeout()
420 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_request_timeout()
426 static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp) in ncsi_suspend_channel() argument
428 struct ncsi_dev *nd = &ndp->ndev; in ncsi_suspend_channel()
429 struct ncsi_package *np = ndp->active_package; in ncsi_suspend_channel()
430 struct ncsi_channel *nc = ndp->active_channel; in ncsi_suspend_channel()
435 nca.ndp = ndp; in ncsi_suspend_channel()
442 ndp->pending_req_num = 1; in ncsi_suspend_channel()
447 if (ndp->flags & NCSI_DEV_HWA) in ncsi_suspend_channel()
460 if (ndp->flags & NCSI_DEV_RESHUFFLE) in ncsi_suspend_channel()
470 ndp->pending_req_num = np->channel_num; in ncsi_suspend_channel()
485 ndp->pending_req_num = 1; in ncsi_suspend_channel()
498 ndp->pending_req_num = 1; in ncsi_suspend_channel()
512 ndp->pending_req_num = 1; in ncsi_suspend_channel()
528 ncsi_process_next_channel(ndp); in ncsi_suspend_channel()
544 static int clear_one_vid(struct ncsi_dev_priv *ndp, struct ncsi_channel *nc, in clear_one_vid() argument
579 static int set_one_vid(struct ncsi_dev_priv *ndp, struct ncsi_channel *nc, in set_one_vid() argument
589 if (list_empty(&ndp->vlan_vids)) in set_one_vid()
598 list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) { in set_one_vid()
618 netdev_err(ndp->ndev.dev, in set_one_vid()
638 static void ncsi_configure_channel(struct ncsi_dev_priv *ndp) in ncsi_configure_channel() argument
640 struct ncsi_dev *nd = &ndp->ndev; in ncsi_configure_channel()
642 struct ncsi_package *np = ndp->active_package; in ncsi_configure_channel()
643 struct ncsi_channel *nc = ndp->active_channel; in ncsi_configure_channel()
650 nca.ndp = ndp; in ncsi_configure_channel()
655 ndp->pending_req_num = 1; in ncsi_configure_channel()
659 if (ndp->flags & NCSI_DEV_HWA) in ncsi_configure_channel()
667 netdev_err(ndp->ndev.dev, in ncsi_configure_channel()
675 ndp->pending_req_num = 1; in ncsi_configure_channel()
683 netdev_err(ndp->ndev.dev, in ncsi_configure_channel()
702 ndp->pending_req_num = 1; in ncsi_configure_channel()
709 ret = clear_one_vid(ndp, nc, &nca); in ncsi_configure_channel()
712 schedule_work(&ndp->work); in ncsi_configure_channel()
719 ret = set_one_vid(ndp, nc, &nca); in ncsi_configure_channel()
722 schedule_work(&ndp->work); in ncsi_configure_channel()
729 if (list_empty(&ndp->vlan_vids)) { in ncsi_configure_channel()
752 if (ndp->inet6_addr_num > 0 && in ncsi_configure_channel()
784 netdev_err(ndp->ndev.dev, in ncsi_configure_channel()
791 netdev_dbg(ndp->ndev.dev, "NCSI: channel %u config done\n", in ncsi_configure_channel()
803 spin_lock_irqsave(&ndp->lock, flags); in ncsi_configure_channel()
804 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_configure_channel()
805 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_configure_channel()
808 ncsi_process_next_channel(ndp); in ncsi_configure_channel()
818 netdev_dbg(ndp->ndev.dev, in ncsi_configure_channel()
825 spin_lock_irqsave(&ndp->lock, flags); in ncsi_configure_channel()
826 ndp->hot_channel = hot_nc; in ncsi_configure_channel()
827 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_configure_channel()
830 ncsi_process_next_channel(ndp); in ncsi_configure_channel()
840 ncsi_report_link(ndp, true); in ncsi_configure_channel()
843 static int ncsi_choose_active_channel(struct ncsi_dev_priv *ndp) in ncsi_choose_active_channel() argument
850 spin_lock_irqsave(&ndp->lock, flags); in ncsi_choose_active_channel()
851 hot_nc = ndp->hot_channel; in ncsi_choose_active_channel()
852 force_channel = ndp->force_channel; in ncsi_choose_active_channel()
853 force_package = ndp->force_package; in ncsi_choose_active_channel()
854 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_choose_active_channel()
863 netdev_info(ndp->ndev.dev, in ncsi_choose_active_channel()
873 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_choose_active_channel()
874 if (ndp->force_package && np != ndp->force_package) in ncsi_choose_active_channel()
903 netdev_warn(ndp->ndev.dev, in ncsi_choose_active_channel()
905 ncsi_report_link(ndp, true); in ncsi_choose_active_channel()
910 netdev_dbg(ndp->ndev.dev, in ncsi_choose_active_channel()
915 spin_lock_irqsave(&ndp->lock, flags); in ncsi_choose_active_channel()
916 list_add_tail_rcu(&found->link, &ndp->channel_queue); in ncsi_choose_active_channel()
917 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_choose_active_channel()
919 return ncsi_process_next_channel(ndp); in ncsi_choose_active_channel()
922 static bool ncsi_check_hwa(struct ncsi_dev_priv *ndp) in ncsi_check_hwa() argument
932 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_check_hwa()
940 ndp->flags &= ~NCSI_DEV_HWA; in ncsi_check_hwa()
947 ndp->flags |= NCSI_DEV_HWA; in ncsi_check_hwa()
951 ndp->flags &= ~NCSI_DEV_HWA; in ncsi_check_hwa()
955 static int ncsi_enable_hwa(struct ncsi_dev_priv *ndp) in ncsi_enable_hwa() argument
962 spin_lock_irqsave(&ndp->lock, flags); in ncsi_enable_hwa()
963 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_enable_hwa()
968 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_enable_hwa()
971 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_enable_hwa()
974 if (list_empty(&ndp->channel_queue)) { in ncsi_enable_hwa()
975 netdev_err(ndp->ndev.dev, in ncsi_enable_hwa()
977 ncsi_report_link(ndp, false); in ncsi_enable_hwa()
981 return ncsi_process_next_channel(ndp); in ncsi_enable_hwa()
984 static void ncsi_probe_channel(struct ncsi_dev_priv *ndp) in ncsi_probe_channel() argument
986 struct ncsi_dev *nd = &ndp->ndev; in ncsi_probe_channel()
993 nca.ndp = ndp; in ncsi_probe_channel()
1000 ndp->pending_req_num = 8; in ncsi_probe_channel()
1015 ndp->pending_req_num = 16; in ncsi_probe_channel()
1040 if (!ndp->active_package) in ncsi_probe_channel()
1041 ndp->active_package = list_first_or_null_rcu( in ncsi_probe_channel()
1042 &ndp->packages, struct ncsi_package, node); in ncsi_probe_channel()
1043 else if (list_is_last(&ndp->active_package->node, in ncsi_probe_channel()
1044 &ndp->packages)) in ncsi_probe_channel()
1045 ndp->active_package = NULL; in ncsi_probe_channel()
1047 ndp->active_package = list_next_entry( in ncsi_probe_channel()
1048 ndp->active_package, node); in ncsi_probe_channel()
1059 if (!ndp->active_package) { in ncsi_probe_channel()
1060 ndp->flags |= NCSI_DEV_PROBED; in ncsi_probe_channel()
1061 if (ncsi_check_hwa(ndp)) in ncsi_probe_channel()
1062 ncsi_enable_hwa(ndp); in ncsi_probe_channel()
1064 ncsi_choose_active_channel(ndp); in ncsi_probe_channel()
1069 ndp->pending_req_num = 1; in ncsi_probe_channel()
1072 nca.package = ndp->active_package->id; in ncsi_probe_channel()
1081 ndp->pending_req_num = NCSI_RESERVED_CHANNEL; in ncsi_probe_channel()
1085 nca.package = ndp->active_package->id; in ncsi_probe_channel()
1098 np = ndp->active_package; in ncsi_probe_channel()
1099 ndp->pending_req_num = np->channel_num; in ncsi_probe_channel()
1125 ndp->pending_req_num = 1; in ncsi_probe_channel()
1129 nca.package = ndp->active_package->id; in ncsi_probe_channel()
1145 netdev_err(ndp->ndev.dev, in ncsi_probe_channel()
1148 ncsi_report_link(ndp, true); in ncsi_probe_channel()
1153 struct ncsi_dev_priv *ndp = container_of(work, in ncsi_dev_work() local
1155 struct ncsi_dev *nd = &ndp->ndev; in ncsi_dev_work()
1159 ncsi_probe_channel(ndp); in ncsi_dev_work()
1162 ncsi_suspend_channel(ndp); in ncsi_dev_work()
1165 ncsi_configure_channel(ndp); in ncsi_dev_work()
1173 int ncsi_process_next_channel(struct ncsi_dev_priv *ndp) in ncsi_process_next_channel() argument
1179 spin_lock_irqsave(&ndp->lock, flags); in ncsi_process_next_channel()
1180 nc = list_first_or_null_rcu(&ndp->channel_queue, in ncsi_process_next_channel()
1183 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_process_next_channel()
1188 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_process_next_channel()
1195 ndp->active_channel = nc; in ncsi_process_next_channel()
1196 ndp->active_package = nc->package; in ncsi_process_next_channel()
1200 ndp->ndev.state = ncsi_dev_state_config; in ncsi_process_next_channel()
1201 netdev_dbg(ndp->ndev.dev, "NCSI: configuring channel %u\n", in ncsi_process_next_channel()
1203 ncsi_configure_channel(ndp); in ncsi_process_next_channel()
1206 ndp->ndev.state = ncsi_dev_state_suspend; in ncsi_process_next_channel()
1207 netdev_dbg(ndp->ndev.dev, "NCSI: suspending channel %u\n", in ncsi_process_next_channel()
1209 ncsi_suspend_channel(ndp); in ncsi_process_next_channel()
1212 netdev_err(ndp->ndev.dev, "Invalid state 0x%x on %d:%d\n", in ncsi_process_next_channel()
1214 ncsi_report_link(ndp, false); in ncsi_process_next_channel()
1221 ndp->active_channel = NULL; in ncsi_process_next_channel()
1222 ndp->active_package = NULL; in ncsi_process_next_channel()
1223 if (ndp->flags & NCSI_DEV_RESHUFFLE) { in ncsi_process_next_channel()
1224 ndp->flags &= ~NCSI_DEV_RESHUFFLE; in ncsi_process_next_channel()
1225 return ncsi_choose_active_channel(ndp); in ncsi_process_next_channel()
1228 ncsi_report_link(ndp, false); in ncsi_process_next_channel()
1239 struct ncsi_dev_priv *ndp = nd ? TO_NCSI_DEV_PRIV(nd) : NULL; in ncsi_inet6addr_event() local
1246 if (!ndp || (ipv6_addr_type(&ifa->addr) & in ncsi_inet6addr_event()
1252 action = (++ndp->inet6_addr_num) == 1; in ncsi_inet6addr_event()
1256 action = (--ndp->inet6_addr_num == 0); in ncsi_inet6addr_event()
1267 np = ndp->active_package; in ncsi_inet6addr_event()
1268 nc = ndp->active_channel; in ncsi_inet6addr_event()
1276 nca.ndp = ndp; in ncsi_inet6addr_event()
1296 static int ncsi_kick_channels(struct ncsi_dev_priv *ndp) in ncsi_kick_channels() argument
1298 struct ncsi_dev *nd = &ndp->ndev; in ncsi_kick_channels()
1304 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_kick_channels()
1315 if ((ndp->ndev.state & 0xff00) == in ncsi_kick_channels()
1334 spin_lock_irqsave(&ndp->lock, flags); in ncsi_kick_channels()
1335 list_add_tail_rcu(&nc->link, &ndp->channel_queue); in ncsi_kick_channels()
1336 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_kick_channels()
1348 struct ncsi_dev_priv *ndp; in ncsi_vlan_rx_add_vid() local
1363 ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_vlan_rx_add_vid()
1366 list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) { in ncsi_vlan_rx_add_vid()
1387 list_add_rcu(&vlan->list, &ndp->vlan_vids); in ncsi_vlan_rx_add_vid()
1391 found = ncsi_kick_channels(ndp) != 0; in ncsi_vlan_rx_add_vid()
1393 return found ? ncsi_process_next_channel(ndp) : 0; in ncsi_vlan_rx_add_vid()
1400 struct ncsi_dev_priv *ndp; in ncsi_vlan_rx_kill_vid() local
1413 ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_vlan_rx_kill_vid()
1416 list_for_each_entry_safe(vlan, tmp, &ndp->vlan_vids, list) in ncsi_vlan_rx_kill_vid()
1429 found = ncsi_kick_channels(ndp) != 0; in ncsi_vlan_rx_kill_vid()
1431 return found ? ncsi_process_next_channel(ndp) : 0; in ncsi_vlan_rx_kill_vid()
1438 struct ncsi_dev_priv *ndp; in ncsi_register_dev() local
1449 ndp = kzalloc(sizeof(*ndp), GFP_ATOMIC); in ncsi_register_dev()
1450 if (!ndp) in ncsi_register_dev()
1453 nd = &ndp->ndev; in ncsi_register_dev()
1457 ndp->pending_req_num = 0; in ncsi_register_dev()
1458 INIT_LIST_HEAD(&ndp->channel_queue); in ncsi_register_dev()
1459 INIT_LIST_HEAD(&ndp->vlan_vids); in ncsi_register_dev()
1460 INIT_WORK(&ndp->work, ncsi_dev_work); in ncsi_register_dev()
1463 spin_lock_init(&ndp->lock); in ncsi_register_dev()
1464 INIT_LIST_HEAD(&ndp->packages); in ncsi_register_dev()
1465 ndp->request_id = NCSI_REQ_START_IDX; in ncsi_register_dev()
1466 for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) { in ncsi_register_dev()
1467 ndp->requests[i].id = i; in ncsi_register_dev()
1468 ndp->requests[i].ndp = ndp; in ncsi_register_dev()
1469 timer_setup(&ndp->requests[i].timer, ncsi_request_timeout, 0); in ncsi_register_dev()
1474 ndp->inet6_addr_num = 0; in ncsi_register_dev()
1478 list_add_tail_rcu(&ndp->node, &ncsi_dev_list); in ncsi_register_dev()
1482 ndp->ptype.type = cpu_to_be16(ETH_P_NCSI); in ncsi_register_dev()
1483 ndp->ptype.func = ncsi_rcv_rsp; in ncsi_register_dev()
1484 ndp->ptype.dev = dev; in ncsi_register_dev()
1485 dev_add_pack(&ndp->ptype); in ncsi_register_dev()
1496 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_start_dev() local
1503 if (!(ndp->flags & NCSI_DEV_PROBED)) { in ncsi_start_dev()
1505 schedule_work(&ndp->work); in ncsi_start_dev()
1509 if (ndp->flags & NCSI_DEV_HWA) { in ncsi_start_dev()
1510 netdev_info(ndp->ndev.dev, "NCSI: Enabling HWA mode\n"); in ncsi_start_dev()
1511 ret = ncsi_enable_hwa(ndp); in ncsi_start_dev()
1513 ret = ncsi_choose_active_channel(ndp); in ncsi_start_dev()
1522 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_stop_dev() local
1530 NCSI_FOR_EACH_PACKAGE(ndp, np) { in ncsi_stop_dev()
1545 netdev_dbg(ndp->ndev.dev, "NCSI: Stopping device\n"); in ncsi_stop_dev()
1546 ncsi_report_link(ndp, true); in ncsi_stop_dev()
1552 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); in ncsi_unregister_dev() local
1556 dev_remove_pack(&ndp->ptype); in ncsi_unregister_dev()
1558 list_for_each_entry_safe(np, tmp, &ndp->packages, node) in ncsi_unregister_dev()
1562 list_del_rcu(&ndp->node); in ncsi_unregister_dev()
1571 kfree(ndp); in ncsi_unregister_dev()