• Home
  • Raw
  • Download

Lines Matching refs:card

31 static int qeth_l2_setdelmac_makerc(struct qeth_card *card, u16 retcode)  in qeth_l2_setdelmac_makerc()  argument
36 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelmac_makerc()
65 static int qeth_l2_send_setdelmac_cb(struct qeth_card *card, in qeth_l2_send_setdelmac_cb() argument
71 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
74 static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, in qeth_l2_send_setdelmac() argument
80 QETH_CARD_TEXT(card, 2, "L2sdmac"); in qeth_l2_send_setdelmac()
81 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelmac()
88 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelmac_cb, NULL); in qeth_l2_send_setdelmac()
91 static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) in qeth_l2_send_setmac() argument
95 QETH_CARD_TEXT(card, 2, "L2Setmac"); in qeth_l2_send_setmac()
96 rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC); in qeth_l2_send_setmac()
98 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
103 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
107 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
115 static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac) in qeth_l2_write_mac() argument
121 QETH_CARD_TEXT(card, 2, "L2Wmac"); in qeth_l2_write_mac()
122 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_write_mac()
125 CARD_DEVID(card)); in qeth_l2_write_mac()
128 CARD_DEVID(card), rc); in qeth_l2_write_mac()
132 static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac) in qeth_l2_remove_mac() argument
138 QETH_CARD_TEXT(card, 2, "L2Rmac"); in qeth_l2_remove_mac()
139 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_remove_mac()
142 CARD_DEVID(card), rc); in qeth_l2_remove_mac()
146 static void qeth_l2_drain_rx_mode_cache(struct qeth_card *card) in qeth_l2_drain_rx_mode_cache() argument
152 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
192 static int qeth_l2_setdelvlan_makerc(struct qeth_card *card, u16 retcode) in qeth_l2_setdelvlan_makerc() argument
195 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelvlan_makerc()
213 static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, in qeth_l2_send_setdelvlan_cb() argument
219 QETH_CARD_TEXT(card, 2, "L2sdvcb"); in qeth_l2_send_setdelvlan_cb()
223 CARD_DEVID(card), cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
224 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); in qeth_l2_send_setdelvlan_cb()
226 return qeth_l2_setdelvlan_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
229 static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, in qeth_l2_send_setdelvlan() argument
235 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); in qeth_l2_send_setdelvlan()
236 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelvlan()
242 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelvlan_cb, NULL); in qeth_l2_send_setdelvlan()
248 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid() local
250 QETH_CARD_TEXT_(card, 4, "aid:%d", vid); in qeth_l2_vlan_rx_add_vid()
254 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); in qeth_l2_vlan_rx_add_vid()
260 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid() local
262 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l2_vlan_rx_kill_vid()
266 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); in qeth_l2_vlan_rx_kill_vid()
269 static void qeth_l2_set_pnso_mode(struct qeth_card *card, in qeth_l2_set_pnso_mode() argument
272 spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
273 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
274 spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
277 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
280 static void qeth_l2_dev2br_fdb_flush(struct qeth_card *card) in qeth_l2_dev2br_fdb_flush() argument
284 QETH_CARD_TEXT(card, 2, "fdbflush"); in qeth_l2_dev2br_fdb_flush()
293 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
296 static int qeth_l2_request_initial_mac(struct qeth_card *card) in qeth_l2_request_initial_mac() argument
300 QETH_CARD_TEXT(card, 2, "l2reqmac"); in qeth_l2_request_initial_mac()
303 rc = qeth_vm_request_mac(card); in qeth_l2_request_initial_mac()
307 CARD_DEVID(card), rc); in qeth_l2_request_initial_mac()
308 QETH_CARD_TEXT_(card, 2, "err%04x", rc); in qeth_l2_request_initial_mac()
312 if (!IS_OSN(card)) { in qeth_l2_request_initial_mac()
313 rc = qeth_setadpparms_change_macaddr(card); in qeth_l2_request_initial_mac()
317 CARD_DEVID(card), rc); in qeth_l2_request_initial_mac()
318 QETH_CARD_TEXT_(card, 2, "1err%04x", rc); in qeth_l2_request_initial_mac()
323 if (IS_OSM(card) || IS_OSX(card)) in qeth_l2_request_initial_mac()
325 eth_hw_addr_random(card->dev); in qeth_l2_request_initial_mac()
328 QETH_CARD_HEX(card, 2, card->dev->dev_addr, card->dev->addr_len); in qeth_l2_request_initial_mac()
332 static void qeth_l2_register_dev_addr(struct qeth_card *card) in qeth_l2_register_dev_addr() argument
334 if (!is_valid_ether_addr(card->dev->dev_addr)) in qeth_l2_register_dev_addr()
335 qeth_l2_request_initial_mac(card); in qeth_l2_register_dev_addr()
337 if (!IS_OSN(card) && !qeth_l2_send_setmac(card, card->dev->dev_addr)) in qeth_l2_register_dev_addr()
338 card->info.dev_addr_is_registered = 1; in qeth_l2_register_dev_addr()
340 card->info.dev_addr_is_registered = 0; in qeth_l2_register_dev_addr()
345 struct qeth_card *card = dev->ml_priv; in qeth_l2_validate_addr() local
347 if (card->info.dev_addr_is_registered) in qeth_l2_validate_addr()
350 QETH_CARD_TEXT(card, 4, "nomacadr"); in qeth_l2_validate_addr()
357 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_mac_address() local
361 QETH_CARD_TEXT(card, 3, "setmac"); in qeth_l2_set_mac_address()
363 if (IS_OSM(card) || IS_OSX(card)) { in qeth_l2_set_mac_address()
364 QETH_CARD_TEXT(card, 3, "setmcTYP"); in qeth_l2_set_mac_address()
367 QETH_CARD_HEX(card, 3, addr->sa_data, ETH_ALEN); in qeth_l2_set_mac_address()
373 card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
377 rc = qeth_l2_send_setmac(card, addr->sa_data); in qeth_l2_set_mac_address()
383 if (card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
384 qeth_l2_remove_mac(card, old_addr); in qeth_l2_set_mac_address()
385 card->info.dev_addr_is_registered = 1; in qeth_l2_set_mac_address()
389 static void qeth_l2_promisc_to_bridge(struct qeth_card *card, bool enable) in qeth_l2_promisc_to_bridge() argument
394 QETH_CARD_TEXT(card, 3, "pmisc2br"); in qeth_l2_promisc_to_bridge()
397 if (card->options.sbp.reflect_promisc_primary) in qeth_l2_promisc_to_bridge()
404 rc = qeth_bridgeport_setrole(card, role); in qeth_l2_promisc_to_bridge()
405 QETH_CARD_TEXT_(card, 2, "bpm%c%04x", enable ? '+' : '-', rc); in qeth_l2_promisc_to_bridge()
407 card->options.sbp.role = role; in qeth_l2_promisc_to_bridge()
408 card->info.promisc_mode = enable; in qeth_l2_promisc_to_bridge()
412 static void qeth_l2_set_promisc_mode(struct qeth_card *card) in qeth_l2_set_promisc_mode() argument
414 bool enable = card->dev->flags & IFF_PROMISC; in qeth_l2_set_promisc_mode()
416 if (card->info.promisc_mode == enable) in qeth_l2_set_promisc_mode()
419 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) { in qeth_l2_set_promisc_mode()
420 qeth_setadp_promisc_mode(card, enable); in qeth_l2_set_promisc_mode()
422 mutex_lock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
423 if (card->options.sbp.reflect_promisc) in qeth_l2_set_promisc_mode()
424 qeth_l2_promisc_to_bridge(card, enable); in qeth_l2_set_promisc_mode()
425 mutex_unlock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
433 static void qeth_l2_add_mac(struct qeth_card *card, struct netdev_hw_addr *ha) in qeth_l2_add_mac() argument
438 hash_for_each_possible(card->rx_mode_addrs, mac, hnode, mac_hash) { in qeth_l2_add_mac()
452 hash_add(card->rx_mode_addrs, &mac->hnode, mac_hash); in qeth_l2_add_mac()
457 struct qeth_card *card = container_of(work, struct qeth_card, in qeth_l2_rx_mode_work() local
459 struct net_device *dev = card->dev; in qeth_l2_rx_mode_work()
466 QETH_CARD_TEXT(card, 3, "setmulti"); in qeth_l2_rx_mode_work()
470 qeth_l2_add_mac(card, ha); in qeth_l2_rx_mode_work()
472 qeth_l2_add_mac(card, ha); in qeth_l2_rx_mode_work()
475 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_rx_mode_work()
478 qeth_l2_remove_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
483 rc = qeth_l2_write_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
496 qeth_l2_set_promisc_mode(card); in qeth_l2_rx_mode_work()
499 static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb, in qeth_l2_xmit_osn() argument
529 rc = qeth_do_send_packet(card, queue, skb, hdr, hd_len, hd_len, in qeth_l2_xmit_osn()
540 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit() local
547 if (IS_IQD(card)) in qeth_l2_hard_start_xmit()
549 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
551 if (IS_OSN(card)) in qeth_l2_hard_start_xmit()
552 rc = qeth_l2_xmit_osn(card, skb, queue); in qeth_l2_hard_start_xmit()
554 rc = qeth_xmit(card, skb, queue, qeth_get_ip_version(skb), in qeth_l2_hard_start_xmit()
568 struct qeth_card *card = dev->ml_priv; in qeth_l2_select_queue() local
570 if (IS_IQD(card)) in qeth_l2_select_queue()
574 if (qeth_uses_tx_prio_queueing(card)) in qeth_l2_select_queue()
575 return qeth_get_priority_queue(card, skb); in qeth_l2_select_queue()
582 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode() local
584 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
601 static int qeth_l2_pnso(struct qeth_card *card, u8 oc, int cnc, in qeth_l2_pnso() argument
605 struct ccw_device *ddev = CARD_DDEV(card); in qeth_l2_pnso()
616 QETH_CARD_TEXT(card, 2, "PNSO"); in qeth_l2_pnso()
649 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
655 static bool qeth_is_my_net_if_token(struct qeth_card *card, in qeth_is_my_net_if_token() argument
658 return ((card->info.ddev_devno == token->devnum) && in qeth_is_my_net_if_token()
659 (card->info.cssid == token->cssid) && in qeth_is_my_net_if_token()
660 (card->info.iid == token->iid) && in qeth_is_my_net_if_token()
661 (card->info.ssid == token->ssid) && in qeth_is_my_net_if_token()
662 (card->info.chpid == token->chpid) && in qeth_is_my_net_if_token()
663 (card->info.chid == token->chid)); in qeth_is_my_net_if_token()
678 static void qeth_l2_dev2br_fdb_notify(struct qeth_card *card, u8 code, in qeth_l2_dev2br_fdb_notify() argument
693 if (qeth_is_my_net_if_token(card, token)) in qeth_l2_dev2br_fdb_notify()
704 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
705 QETH_CARD_TEXT(card, 4, "andelmac"); in qeth_l2_dev2br_fdb_notify()
706 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
710 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
711 QETH_CARD_TEXT(card, 4, "anaddmac"); in qeth_l2_dev2br_fdb_notify()
712 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
721 struct qeth_card *card = priv; in qeth_l2_dev2br_an_set_cb() local
725 qeth_l2_dev2br_fdb_notify(card, code, in qeth_l2_dev2br_an_set_cb()
743 static int qeth_l2_dev2br_an_set(struct qeth_card *card, bool enable) in qeth_l2_dev2br_an_set() argument
748 QETH_CARD_TEXT(card, 2, "anseton"); in qeth_l2_dev2br_an_set()
749 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 1, in qeth_l2_dev2br_an_set()
750 qeth_l2_dev2br_an_set_cb, card); in qeth_l2_dev2br_an_set()
755 qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, in qeth_l2_dev2br_an_set()
758 QETH_CARD_TEXT(card, 2, "ansetoff"); in qeth_l2_dev2br_an_set()
759 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, NULL, NULL); in qeth_l2_dev2br_an_set()
770 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink() local
775 qeth_bridgeport_is_in_use(card)) in qeth_l2_bridge_getlink()
802 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink() local
842 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
844 if (qeth_bridgeport_is_in_use(card)) { in qeth_l2_bridge_setlink()
848 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_bridge_setlink()
849 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_bridge_setlink()
851 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
855 rc = qeth_l2_dev2br_an_set(card, false); in qeth_l2_bridge_setlink()
857 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
859 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_bridge_setlink()
862 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
896 static int qeth_l2_setup_netdev(struct qeth_card *card) in qeth_l2_setup_netdev() argument
898 if (IS_OSN(card)) { in qeth_l2_setup_netdev()
899 card->dev->netdev_ops = &qeth_osn_netdev_ops; in qeth_l2_setup_netdev()
900 card->dev->flags |= IFF_NOARP; in qeth_l2_setup_netdev()
904 card->dev->needed_headroom = sizeof(struct qeth_hdr); in qeth_l2_setup_netdev()
905 card->dev->netdev_ops = &qeth_l2_netdev_ops; in qeth_l2_setup_netdev()
906 card->dev->priv_flags |= IFF_UNICAST_FLT; in qeth_l2_setup_netdev()
908 if (IS_OSM(card)) { in qeth_l2_setup_netdev()
909 card->dev->features |= NETIF_F_VLAN_CHALLENGED; in qeth_l2_setup_netdev()
911 if (!IS_VM_NIC(card)) in qeth_l2_setup_netdev()
912 card->dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
913 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
916 if (IS_OSD(card) && !IS_VM_NIC(card)) { in qeth_l2_setup_netdev()
917 card->dev->features |= NETIF_F_SG; in qeth_l2_setup_netdev()
919 if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) { in qeth_l2_setup_netdev()
920 card->dev->hw_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
921 card->dev->vlan_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
924 if (qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
925 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
926 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
928 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM) || in qeth_l2_setup_netdev()
929 qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
930 card->dev->hw_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
931 card->dev->vlan_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
933 if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
934 card->dev->hw_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
935 card->dev->vlan_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
937 if (qeth_is_supported6(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
938 card->dev->hw_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
939 card->dev->vlan_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
942 if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) { in qeth_l2_setup_netdev()
943 card->dev->needed_headroom = sizeof(struct qeth_hdr_tso); in qeth_l2_setup_netdev()
944 netif_keep_dst(card->dev); in qeth_l2_setup_netdev()
945 netif_set_gso_max_size(card->dev, in qeth_l2_setup_netdev()
950 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); in qeth_l2_setup_netdev()
951 return register_netdev(card->dev); in qeth_l2_setup_netdev()
954 static void qeth_l2_trace_features(struct qeth_card *card) in qeth_l2_trace_features() argument
957 QETH_CARD_TEXT(card, 2, "featuSBP"); in qeth_l2_trace_features()
958 QETH_CARD_HEX(card, 2, &card->options.sbp.supported_funcs, in qeth_l2_trace_features()
959 sizeof(card->options.sbp.supported_funcs)); in qeth_l2_trace_features()
961 QETH_CARD_TEXT(card, 2, "feaVNICC"); in qeth_l2_trace_features()
962 QETH_CARD_HEX(card, 2, &card->options.vnicc.sup_chars, in qeth_l2_trace_features()
963 sizeof(card->options.vnicc.sup_chars)); in qeth_l2_trace_features()
966 static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) in qeth_l2_setup_bridgeport_attrs() argument
968 if (!card->options.sbp.reflect_promisc && in qeth_l2_setup_bridgeport_attrs()
969 card->options.sbp.role != QETH_SBP_ROLE_NONE) { in qeth_l2_setup_bridgeport_attrs()
971 qeth_bridgeport_setrole(card, card->options.sbp.role); in qeth_l2_setup_bridgeport_attrs()
973 qeth_bridgeport_query_ports(card, &card->options.sbp.role, in qeth_l2_setup_bridgeport_attrs()
976 if (card->options.sbp.hostnotification) { in qeth_l2_setup_bridgeport_attrs()
977 if (qeth_bridgeport_an_set(card, 1)) in qeth_l2_setup_bridgeport_attrs()
978 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
989 static void qeth_l2_detect_dev2br_support(struct qeth_card *card) in qeth_l2_detect_dev2br_support() argument
991 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
994 QETH_CARD_TEXT(card, 2, "d2brsup"); in qeth_l2_detect_dev2br_support()
995 if (!IS_IQD(card)) in qeth_l2_detect_dev2br_support()
999 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1001 QETH_CARD_TEXT_(card, 2, "D2Bsup%02x", dev2br_supported); in qeth_l2_detect_dev2br_support()
1009 static void qeth_l2_enable_brport_features(struct qeth_card *card) in qeth_l2_enable_brport_features() argument
1011 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1016 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1017 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1020 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1021 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1022 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1023 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1026 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1029 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1030 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1034 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1042 static void qeth_osn_assist_cb(struct qeth_card *card, in qeth_osn_assist_cb() argument
1053 struct qeth_card *card; in qeth_osn_assist() local
1059 card = dev->ml_priv; in qeth_osn_assist()
1060 if (!card) in qeth_osn_assist()
1062 QETH_CARD_TEXT(card, 2, "osnsdmc"); in qeth_osn_assist()
1063 if (!qeth_card_hw_is_reachable(card)) in qeth_osn_assist()
1066 iob = qeth_alloc_cmd(&card->write, IPA_PDU_HEADER_SIZE + data_len, 1, in qeth_osn_assist()
1071 qeth_prepare_ipa_cmd(card, iob, (u16) data_len, NULL); in qeth_osn_assist()
1075 return qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_osn_assist()
1083 struct qeth_card *card; in qeth_osn_register() local
1089 card = qeth_get_card_by_busid(bus_id); in qeth_osn_register()
1090 if (!card || !IS_OSN(card)) in qeth_osn_register()
1092 *dev = card->dev; in qeth_osn_register()
1094 QETH_CARD_TEXT(card, 2, "osnreg"); in qeth_osn_register()
1097 card->osn_info.assist_cb = assist_cb; in qeth_osn_register()
1098 card->osn_info.data_cb = data_cb; in qeth_osn_register()
1105 struct qeth_card *card; in qeth_osn_deregister() local
1109 card = dev->ml_priv; in qeth_osn_deregister()
1110 if (!card) in qeth_osn_deregister()
1112 QETH_CARD_TEXT(card, 2, "osndereg"); in qeth_osn_deregister()
1113 card->osn_info.assist_cb = NULL; in qeth_osn_deregister()
1114 card->osn_info.data_cb = NULL; in qeth_osn_deregister()
1138 static void qeth_bridge_emit_host_event(struct qeth_card *card, in qeth_bridge_emit_host_event() argument
1185 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1190 struct qeth_card *card; member
1220 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1225 static void qeth_bridge_state_change(struct qeth_card *card, in qeth_bridge_state_change() argument
1231 QETH_CARD_TEXT(card, 2, "brstchng"); in qeth_bridge_state_change()
1233 QETH_CARD_TEXT(card, 2, "BPempty"); in qeth_bridge_state_change()
1237 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1243 QETH_CARD_TEXT(card, 2, "BPSalloc"); in qeth_bridge_state_change()
1247 data->card = card; in qeth_bridge_state_change()
1252 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1257 struct qeth_card *card; member
1265 struct qeth_card *card; in qeth_l2_dev2br_worker() local
1271 card = data->card; in qeth_l2_dev2br_worker()
1272 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1274 QETH_CARD_TEXT(card, 4, "dev2brew"); in qeth_l2_dev2br_worker()
1276 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1281 queue_delayed_work(card->event_wq, dwork, in qeth_l2_dev2br_worker()
1285 if (!netif_device_present(card->dev)) in qeth_l2_dev2br_worker()
1291 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1297 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1298 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_dev2br_worker()
1305 netdev_err(card->dev, in qeth_l2_dev2br_worker()
1308 WRITE_ONCE(card->info.pnso_mode, in qeth_l2_dev2br_worker()
1311 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1316 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1322 qeth_l2_dev2br_fdb_notify(card, in qeth_l2_dev2br_worker()
1340 struct qeth_card *card; in qeth_addr_change_event_worker() local
1344 card = data->card; in qeth_addr_change_event_worker()
1346 QETH_CARD_TEXT(data->card, 4, "adrchgew"); in qeth_addr_change_event_worker()
1348 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_addr_change_event_worker()
1353 if (!mutex_trylock(&card->sbp_lock)) { in qeth_addr_change_event_worker()
1354 queue_delayed_work(card->event_wq, dwork, in qeth_addr_change_event_worker()
1359 dev_info(&data->card->gdev->dev, in qeth_addr_change_event_worker()
1361 netdev_name(card->dev), in qeth_addr_change_event_worker()
1368 data->card->options.sbp.hostnotification = 0; in qeth_addr_change_event_worker()
1369 card->info.pnso_mode = QETH_PNSO_NONE; in qeth_addr_change_event_worker()
1370 mutex_unlock(&data->card->sbp_lock); in qeth_addr_change_event_worker()
1371 qeth_bridge_emit_host_event(data->card, anev_abort, in qeth_addr_change_event_worker()
1377 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1388 static void qeth_addr_change_event(struct qeth_card *card, in qeth_addr_change_event() argument
1396 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1399 QETH_CARD_TEXT(card, 4, "adrchgev"); in qeth_addr_change_event()
1405 QETH_CARD_TEXT_(card, 2, "ACHN%04x", in qeth_addr_change_event()
1415 QETH_CARD_TEXT(card, 2, "ACNalloc"); in qeth_addr_change_event()
1418 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1422 data->card = card; in qeth_addr_change_event()
1425 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1440 static int qeth_bridgeport_makerc(struct qeth_card *card, in qeth_bridgeport_makerc() argument
1452 if ((IS_IQD(card) && ipa_rc == IPA_RC_SUCCESS) || in qeth_bridgeport_makerc()
1453 (!IS_IQD(card) && ipa_rc == sbp_rc)) { in qeth_bridgeport_makerc()
1465 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1471 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1479 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1484 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1494 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1500 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1506 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1512 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1532 QETH_CARD_TEXT_(card, 2, "SBPi%04x", ipa_rc); in qeth_bridgeport_makerc()
1533 QETH_CARD_TEXT_(card, 2, "SBPc%04x", sbp_rc); in qeth_bridgeport_makerc()
1538 static struct qeth_cmd_buffer *qeth_sbp_build_cmd(struct qeth_card *card, in qeth_sbp_build_cmd() argument
1542 enum qeth_ipa_cmds ipa_cmd = IS_IQD(card) ? IPA_CMD_SETBRIDGEPORT_IQD : in qeth_sbp_build_cmd()
1547 iob = qeth_ipa_alloc_cmd(card, ipa_cmd, QETH_PROT_NONE, in qeth_sbp_build_cmd()
1562 static int qeth_bridgeport_query_support_cb(struct qeth_card *card, in qeth_bridgeport_query_support_cb() argument
1569 QETH_CARD_TEXT(card, 2, "brqsupcb"); in qeth_bridgeport_query_support_cb()
1570 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_support_cb()
1586 static void qeth_bridgeport_query_support(struct qeth_card *card) in qeth_bridgeport_query_support() argument
1591 QETH_CARD_TEXT(card, 2, "brqsuppo"); in qeth_bridgeport_query_support()
1592 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_COMMANDS_SUPPORTED, in qeth_bridgeport_query_support()
1597 if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb, in qeth_bridgeport_query_support()
1599 card->options.sbp.role = QETH_SBP_ROLE_NONE; in qeth_bridgeport_query_support()
1600 card->options.sbp.supported_funcs = 0; in qeth_bridgeport_query_support()
1603 card->options.sbp.supported_funcs = cbctl.data.supported; in qeth_bridgeport_query_support()
1606 static int qeth_bridgeport_query_ports_cb(struct qeth_card *card, in qeth_bridgeport_query_ports_cb() argument
1614 QETH_CARD_TEXT(card, 2, "brqprtcb"); in qeth_bridgeport_query_ports_cb()
1615 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_ports_cb()
1621 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1644 int qeth_bridgeport_query_ports(struct qeth_card *card, in qeth_bridgeport_query_ports() argument
1657 QETH_CARD_TEXT(card, 2, "brqports"); in qeth_bridgeport_query_ports()
1658 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1660 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_BRIDGE_PORTS, 0); in qeth_bridgeport_query_ports()
1664 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb, in qeth_bridgeport_query_ports()
1668 static int qeth_bridgeport_set_cb(struct qeth_card *card, in qeth_bridgeport_set_cb() argument
1673 QETH_CARD_TEXT(card, 2, "brsetrcb"); in qeth_bridgeport_set_cb()
1674 return qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_set_cb()
1684 int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) in qeth_bridgeport_setrole() argument
1690 QETH_CARD_TEXT(card, 2, "brsetrol"); in qeth_bridgeport_setrole()
1705 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1707 iob = qeth_sbp_build_cmd(card, setcmd, cmdlength); in qeth_bridgeport_setrole()
1711 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb, NULL); in qeth_bridgeport_setrole()
1717 struct qeth_card *card = (struct qeth_card *)priv; in qeth_bridgeport_an_set_cb() local
1723 qeth_bridge_emit_host_event(card, anev_reg_unreg, code, in qeth_bridgeport_an_set_cb()
1738 int qeth_bridgeport_an_set(struct qeth_card *card, int enable) in qeth_bridgeport_an_set() argument
1742 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1746 qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL); in qeth_bridgeport_an_set()
1747 qeth_l2_set_pnso_mode(card, QETH_PNSO_BRIDGEPORT); in qeth_bridgeport_an_set()
1748 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 1, in qeth_bridgeport_an_set()
1749 qeth_bridgeport_an_set_cb, card); in qeth_bridgeport_an_set()
1751 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1753 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 0, NULL, NULL); in qeth_bridgeport_an_set()
1754 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1762 static int qeth_l2_vnicc_makerc(struct qeth_card *card, u16 ipa_rc) in qeth_l2_vnicc_makerc() argument
1789 QETH_CARD_TEXT_(card, 2, "err%04x", ipa_rc); in qeth_l2_vnicc_makerc()
1794 static int qeth_l2_vnicc_request_cb(struct qeth_card *card, in qeth_l2_vnicc_request_cb() argument
1802 QETH_CARD_TEXT(card, 2, "vniccrcb"); in qeth_l2_vnicc_request_cb()
1804 return qeth_l2_vnicc_makerc(card, cmd->hdr.return_code); in qeth_l2_vnicc_request_cb()
1806 card->options.vnicc.sup_chars = rep->vnicc_cmds.supported; in qeth_l2_vnicc_request_cb()
1807 card->options.vnicc.cur_chars = rep->vnicc_cmds.enabled; in qeth_l2_vnicc_request_cb()
1817 static struct qeth_cmd_buffer *qeth_l2_vnicc_build_cmd(struct qeth_card *card, in qeth_l2_vnicc_build_cmd() argument
1824 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_VNICC, QETH_PROT_NONE, in qeth_l2_vnicc_build_cmd()
1837 static int qeth_l2_vnicc_query_chars(struct qeth_card *card) in qeth_l2_vnicc_query_chars() argument
1841 QETH_CARD_TEXT(card, 2, "vniccqch"); in qeth_l2_vnicc_query_chars()
1842 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CHARS, 0); in qeth_l2_vnicc_query_chars()
1846 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_query_chars()
1850 static int qeth_l2_vnicc_query_cmds(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_query_cmds() argument
1855 QETH_CARD_TEXT(card, 2, "vniccqcm"); in qeth_l2_vnicc_query_cmds()
1856 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CMDS, in qeth_l2_vnicc_query_cmds()
1863 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, sup_cmds); in qeth_l2_vnicc_query_cmds()
1867 static int qeth_l2_vnicc_set_char(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_set_char() argument
1872 QETH_CARD_TEXT(card, 2, "vniccedc"); in qeth_l2_vnicc_set_char()
1873 iob = qeth_l2_vnicc_build_cmd(card, cmd, VNICC_DATA_SIZEOF(set_char)); in qeth_l2_vnicc_set_char()
1879 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_set_char()
1883 static int qeth_l2_vnicc_getset_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_getset_timeout() argument
1889 QETH_CARD_TEXT(card, 2, "vniccgst"); in qeth_l2_vnicc_getset_timeout()
1890 iob = qeth_l2_vnicc_build_cmd(card, cmd, in qeth_l2_vnicc_getset_timeout()
1901 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, timeout); in qeth_l2_vnicc_getset_timeout()
1905 static bool qeth_l2_vnicc_recover_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_timeout() argument
1908 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_timeout()
1909 card->options.vnicc.getset_timeout_sup & vnicc && in qeth_l2_vnicc_recover_timeout()
1910 !qeth_l2_vnicc_getset_timeout(card, vnicc, IPA_VNICC_SET_TIMEOUT, in qeth_l2_vnicc_recover_timeout()
1918 int qeth_l2_vnicc_set_state(struct qeth_card *card, u32 vnicc, bool state) in qeth_l2_vnicc_set_state() argument
1923 QETH_CARD_TEXT(card, 2, "vniccsch"); in qeth_l2_vnicc_set_state()
1926 if (!(card->options.vnicc.sup_chars & vnicc) || in qeth_l2_vnicc_set_state()
1927 !(card->options.vnicc.set_char_sup & vnicc)) in qeth_l2_vnicc_set_state()
1930 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_state()
1936 card->options.vnicc.wanted_chars |= vnicc; in qeth_l2_vnicc_set_state()
1939 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
1943 if (card->options.vnicc.cur_chars == card->options.vnicc.wanted_chars) in qeth_l2_vnicc_set_state()
1947 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_state()
1949 card->options.vnicc.cur_chars |= vnicc; in qeth_l2_vnicc_set_state()
1951 card->options.vnicc.cur_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
1955 rc = qeth_l2_vnicc_set_char(card, vnicc, cmd); in qeth_l2_vnicc_set_state()
1957 card->options.vnicc.wanted_chars = in qeth_l2_vnicc_set_state()
1958 card->options.vnicc.cur_chars; in qeth_l2_vnicc_set_state()
1962 card->options.vnicc.rx_bcast_enabled = true; in qeth_l2_vnicc_set_state()
1964 qeth_l2_vnicc_recover_timeout(card, vnicc, in qeth_l2_vnicc_set_state()
1965 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
1972 int qeth_l2_vnicc_get_state(struct qeth_card *card, u32 vnicc, bool *state) in qeth_l2_vnicc_get_state() argument
1976 QETH_CARD_TEXT(card, 2, "vniccgch"); in qeth_l2_vnicc_get_state()
1979 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
1982 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_state()
1986 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_state()
1987 rc = qeth_l2_vnicc_query_chars(card); in qeth_l2_vnicc_get_state()
1989 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
1996 int qeth_l2_vnicc_set_timeout(struct qeth_card *card, u32 timeout) in qeth_l2_vnicc_set_timeout() argument
2000 QETH_CARD_TEXT(card, 2, "vniccsto"); in qeth_l2_vnicc_set_timeout()
2003 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_set_timeout()
2004 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_set_timeout()
2007 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_timeout()
2011 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2015 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_timeout()
2016 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2021 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_set_timeout()
2024 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2032 int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) in qeth_l2_vnicc_get_timeout() argument
2036 QETH_CARD_TEXT(card, 2, "vniccgto"); in qeth_l2_vnicc_get_timeout()
2039 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_get_timeout()
2040 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_get_timeout()
2043 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_timeout()
2047 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2048 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_timeout()
2049 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_get_timeout()
2057 static bool _qeth_l2_vnicc_is_in_use(struct qeth_card *card) in _qeth_l2_vnicc_is_in_use() argument
2059 if (!card->options.vnicc.sup_chars) in _qeth_l2_vnicc_is_in_use()
2064 if (card->options.vnicc.cur_chars == QETH_VNICC_DEFAULT) { in _qeth_l2_vnicc_is_in_use()
2065 if (!card->options.vnicc.rx_bcast_enabled || in _qeth_l2_vnicc_is_in_use()
2066 !qeth_card_hw_is_reachable(card)) in _qeth_l2_vnicc_is_in_use()
2079 bool qeth_bridgeport_allowed(struct qeth_card *card) in qeth_bridgeport_allowed() argument
2081 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2083 return (!_qeth_l2_vnicc_is_in_use(card) && in qeth_bridgeport_allowed()
2088 static bool qeth_l2_vnicc_recover_char(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_char() argument
2093 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_char()
2094 card->options.vnicc.set_char_sup & vnicc && in qeth_l2_vnicc_recover_char()
2095 !qeth_l2_vnicc_set_char(card, vnicc, cmd)) in qeth_l2_vnicc_recover_char()
2097 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_recover_char()
2098 card->options.vnicc.wanted_chars |= QETH_VNICC_DEFAULT & vnicc; in qeth_l2_vnicc_recover_char()
2103 static void qeth_l2_vnicc_init(struct qeth_card *card) in qeth_l2_vnicc_init() argument
2105 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2111 QETH_CARD_TEXT(card, 2, "vniccini"); in qeth_l2_vnicc_init()
2113 card->options.vnicc.rx_bcast_enabled = 0; in qeth_l2_vnicc_init()
2115 if (qeth_l2_vnicc_query_chars(card)) { in qeth_l2_vnicc_init()
2116 if (card->options.vnicc.wanted_chars != QETH_VNICC_DEFAULT || in qeth_l2_vnicc_init()
2118 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2120 card->options.vnicc.sup_chars = 0; in qeth_l2_vnicc_init()
2121 card->options.vnicc.cur_chars = 0; in qeth_l2_vnicc_init()
2122 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_init()
2126 chars_tmp = card->options.vnicc.sup_chars; in qeth_l2_vnicc_init()
2127 chars_len = sizeof(card->options.vnicc.sup_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2130 if (qeth_l2_vnicc_query_cmds(card, vnicc, &sup_cmds)) { in qeth_l2_vnicc_init()
2136 card->options.vnicc.getset_timeout_sup |= vnicc; in qeth_l2_vnicc_init()
2138 card->options.vnicc.getset_timeout_sup &= ~vnicc; in qeth_l2_vnicc_init()
2141 card->options.vnicc.set_char_sup |= vnicc; in qeth_l2_vnicc_init()
2143 card->options.vnicc.set_char_sup &= ~vnicc; in qeth_l2_vnicc_init()
2146 error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_init()
2149 chars_tmp = card->options.vnicc.wanted_chars ^ in qeth_l2_vnicc_init()
2150 card->options.vnicc.cur_chars; in qeth_l2_vnicc_init()
2151 chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2154 enable = card->options.vnicc.wanted_chars & vnicc; in qeth_l2_vnicc_init()
2155 error |= qeth_l2_vnicc_recover_char(card, vnicc, enable); in qeth_l2_vnicc_init()
2158 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2162 static void qeth_l2_vnicc_set_defaults(struct qeth_card *card) in qeth_l2_vnicc_set_defaults() argument
2165 card->options.vnicc.sup_chars = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2166 card->options.vnicc.cur_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2167 card->options.vnicc.learning_timeout = QETH_VNICC_DEFAULT_TIMEOUT; in qeth_l2_vnicc_set_defaults()
2169 card->options.vnicc.set_char_sup = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2170 card->options.vnicc.getset_timeout_sup = QETH_VNICC_LEARNING; in qeth_l2_vnicc_set_defaults()
2172 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2182 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_probe_device() local
2185 if (IS_OSN(card)) in qeth_l2_probe_device()
2188 qeth_l2_vnicc_set_defaults(card); in qeth_l2_probe_device()
2189 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2197 INIT_WORK(&card->rx_mode_work, qeth_l2_rx_mode_work); in qeth_l2_probe_device()
2203 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_remove_device() local
2207 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_remove_device()
2208 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2211 qeth_set_offline(card, card->discipline, false); in qeth_l2_remove_device()
2213 cancel_work_sync(&card->close_dev_work); in qeth_l2_remove_device()
2214 if (card->dev->reg_state == NETREG_REGISTERED) in qeth_l2_remove_device()
2215 unregister_netdev(card->dev); in qeth_l2_remove_device()
2218 static int qeth_l2_set_online(struct qeth_card *card, bool carrier_ok) in qeth_l2_set_online() argument
2220 struct net_device *dev = card->dev; in qeth_l2_set_online()
2223 qeth_l2_detect_dev2br_support(card); in qeth_l2_set_online()
2225 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2226 qeth_bridgeport_query_support(card); in qeth_l2_set_online()
2227 if (card->options.sbp.supported_funcs) { in qeth_l2_set_online()
2228 qeth_l2_setup_bridgeport_attrs(card); in qeth_l2_set_online()
2229 dev_info(&card->gdev->dev, in qeth_l2_set_online()
2232 mutex_unlock(&card->sbp_lock); in qeth_l2_set_online()
2234 qeth_l2_register_dev_addr(card); in qeth_l2_set_online()
2237 qeth_l2_vnicc_init(card); in qeth_l2_set_online()
2239 qeth_l2_trace_features(card); in qeth_l2_set_online()
2242 QETH_CARD_TEXT(card, 2, "softsetp"); in qeth_l2_set_online()
2244 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2246 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l2_set_online()
2249 rc = qeth_l2_setup_netdev(card); in qeth_l2_set_online()
2257 rc = qeth_set_real_num_tx_queues(card, in qeth_l2_set_online()
2258 qeth_tx_actual_queues(card)); in qeth_l2_set_online()
2271 qeth_l2_enable_brport_features(card); in qeth_l2_set_online()
2273 if (card->info.open_when_online) { in qeth_l2_set_online()
2274 card->info.open_when_online = 0; in qeth_l2_set_online()
2283 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_online()
2284 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2288 static void qeth_l2_set_offline(struct qeth_card *card) in qeth_l2_set_offline() argument
2290 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_set_offline()
2292 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_offline()
2293 qeth_l2_drain_rx_mode_cache(card); in qeth_l2_set_offline()
2295 if (card->state == CARD_STATE_SOFTSETUP) in qeth_l2_set_offline()
2296 card->state = CARD_STATE_DOWN; in qeth_l2_set_offline()
2298 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_set_offline()
2301 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_set_offline()
2307 static int qeth_l2_control_event(struct qeth_card *card, in qeth_l2_control_event() argument
2315 qeth_bridge_state_change(card, cmd); in qeth_l2_control_event()
2321 qeth_addr_change_event(card, cmd); in qeth_l2_control_event()