Lines Matching full:card
33 static int qeth_l2_setdelmac_makerc(struct qeth_card *card, u16 retcode) in qeth_l2_setdelmac_makerc() argument
38 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelmac_makerc()
67 static int qeth_l2_send_setdelmac_cb(struct qeth_card *card, in qeth_l2_send_setdelmac_cb() argument
73 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
76 static int qeth_l2_send_setdelmac(struct qeth_card *card, const __u8 *mac, in qeth_l2_send_setdelmac() argument
82 QETH_CARD_TEXT(card, 2, "L2sdmac"); in qeth_l2_send_setdelmac()
83 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelmac()
90 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelmac_cb, NULL); in qeth_l2_send_setdelmac()
93 static int qeth_l2_send_setmac(struct qeth_card *card, const __u8 *mac) in qeth_l2_send_setmac() argument
97 QETH_CARD_TEXT(card, 2, "L2Setmac"); in qeth_l2_send_setmac()
98 rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC); in qeth_l2_send_setmac()
100 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
105 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
109 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
117 static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac) in qeth_l2_write_mac() argument
123 QETH_CARD_TEXT(card, 2, "L2Wmac"); in qeth_l2_write_mac()
124 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_write_mac()
127 ether_addr_to_u64(mac), CARD_DEVID(card)); in qeth_l2_write_mac()
130 ether_addr_to_u64(mac), CARD_DEVID(card), rc); in qeth_l2_write_mac()
134 static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac) in qeth_l2_remove_mac() argument
140 QETH_CARD_TEXT(card, 2, "L2Rmac"); in qeth_l2_remove_mac()
141 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_remove_mac()
144 ether_addr_to_u64(mac), CARD_DEVID(card), rc); in qeth_l2_remove_mac()
148 static void qeth_l2_drain_rx_mode_cache(struct qeth_card *card) in qeth_l2_drain_rx_mode_cache() argument
154 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
194 static int qeth_l2_setdelvlan_makerc(struct qeth_card *card, u16 retcode) in qeth_l2_setdelvlan_makerc() argument
197 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelvlan_makerc()
215 static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, in qeth_l2_send_setdelvlan_cb() argument
221 QETH_CARD_TEXT(card, 2, "L2sdvcb"); in qeth_l2_send_setdelvlan_cb()
225 CARD_DEVID(card), cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
226 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); in qeth_l2_send_setdelvlan_cb()
228 return qeth_l2_setdelvlan_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
231 static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, in qeth_l2_send_setdelvlan() argument
237 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); in qeth_l2_send_setdelvlan()
238 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelvlan()
244 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelvlan_cb, NULL); in qeth_l2_send_setdelvlan()
250 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid() local
252 QETH_CARD_TEXT_(card, 4, "aid:%d", vid); in qeth_l2_vlan_rx_add_vid()
256 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); in qeth_l2_vlan_rx_add_vid()
262 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid() local
264 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l2_vlan_rx_kill_vid()
268 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); in qeth_l2_vlan_rx_kill_vid()
271 static void qeth_l2_set_pnso_mode(struct qeth_card *card, in qeth_l2_set_pnso_mode() argument
274 spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
275 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
276 spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
279 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
282 static void qeth_l2_dev2br_fdb_flush(struct qeth_card *card) in qeth_l2_dev2br_fdb_flush() argument
286 QETH_CARD_TEXT(card, 2, "fdbflush"); in qeth_l2_dev2br_fdb_flush()
295 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
298 static int qeth_l2_request_initial_mac(struct qeth_card *card) in qeth_l2_request_initial_mac() argument
302 QETH_CARD_TEXT(card, 2, "l2reqmac"); in qeth_l2_request_initial_mac()
305 rc = qeth_vm_request_mac(card); in qeth_l2_request_initial_mac()
309 CARD_DEVID(card), rc); in qeth_l2_request_initial_mac()
310 QETH_CARD_TEXT_(card, 2, "err%04x", rc); in qeth_l2_request_initial_mac()
314 rc = qeth_setadpparms_change_macaddr(card); in qeth_l2_request_initial_mac()
318 CARD_DEVID(card), rc); in qeth_l2_request_initial_mac()
319 QETH_CARD_TEXT_(card, 2, "1err%04x", rc); in qeth_l2_request_initial_mac()
324 if (IS_OSM(card) || IS_OSX(card)) in qeth_l2_request_initial_mac()
326 eth_hw_addr_random(card->dev); in qeth_l2_request_initial_mac()
329 QETH_CARD_HEX(card, 2, card->dev->dev_addr, card->dev->addr_len); in qeth_l2_request_initial_mac()
333 static void qeth_l2_register_dev_addr(struct qeth_card *card) in qeth_l2_register_dev_addr() argument
335 if (!is_valid_ether_addr(card->dev->dev_addr)) in qeth_l2_register_dev_addr()
336 qeth_l2_request_initial_mac(card); in qeth_l2_register_dev_addr()
338 if (!qeth_l2_send_setmac(card, card->dev->dev_addr)) in qeth_l2_register_dev_addr()
339 card->info.dev_addr_is_registered = 1; in qeth_l2_register_dev_addr()
341 card->info.dev_addr_is_registered = 0; in qeth_l2_register_dev_addr()
346 struct qeth_card *card = dev->ml_priv; in qeth_l2_validate_addr() local
348 if (card->info.dev_addr_is_registered) in qeth_l2_validate_addr()
351 QETH_CARD_TEXT(card, 4, "nomacadr"); in qeth_l2_validate_addr()
358 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_mac_address() local
362 QETH_CARD_TEXT(card, 3, "setmac"); in qeth_l2_set_mac_address()
364 if (IS_OSM(card) || IS_OSX(card)) { in qeth_l2_set_mac_address()
365 QETH_CARD_TEXT(card, 3, "setmcTYP"); in qeth_l2_set_mac_address()
368 QETH_CARD_HEX(card, 3, addr->sa_data, ETH_ALEN); in qeth_l2_set_mac_address()
374 card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
378 rc = qeth_l2_send_setmac(card, addr->sa_data); in qeth_l2_set_mac_address()
384 if (card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
385 qeth_l2_remove_mac(card, old_addr); in qeth_l2_set_mac_address()
386 card->info.dev_addr_is_registered = 1; in qeth_l2_set_mac_address()
390 static void qeth_l2_promisc_to_bridge(struct qeth_card *card, bool enable) in qeth_l2_promisc_to_bridge() argument
395 QETH_CARD_TEXT(card, 3, "pmisc2br"); in qeth_l2_promisc_to_bridge()
398 if (card->options.sbp.reflect_promisc_primary) in qeth_l2_promisc_to_bridge()
405 rc = qeth_bridgeport_setrole(card, role); in qeth_l2_promisc_to_bridge()
406 QETH_CARD_TEXT_(card, 2, "bpm%c%04x", enable ? '+' : '-', rc); in qeth_l2_promisc_to_bridge()
408 card->options.sbp.role = role; in qeth_l2_promisc_to_bridge()
409 card->info.promisc_mode = enable; in qeth_l2_promisc_to_bridge()
413 static void qeth_l2_set_promisc_mode(struct qeth_card *card) in qeth_l2_set_promisc_mode() argument
415 bool enable = card->dev->flags & IFF_PROMISC; in qeth_l2_set_promisc_mode()
417 if (card->info.promisc_mode == enable) in qeth_l2_set_promisc_mode()
420 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) { in qeth_l2_set_promisc_mode()
421 qeth_setadp_promisc_mode(card, enable); in qeth_l2_set_promisc_mode()
423 mutex_lock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
424 if (card->options.sbp.reflect_promisc) in qeth_l2_set_promisc_mode()
425 qeth_l2_promisc_to_bridge(card, enable); in qeth_l2_set_promisc_mode()
426 mutex_unlock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
430 /* New MAC address is added to the hash table and marked to be written on card
434 static void qeth_l2_add_mac(struct qeth_card *card, struct netdev_hw_addr *ha) in qeth_l2_add_mac() argument
439 hash_for_each_possible(card->rx_mode_addrs, mac, hnode, mac_hash) { in qeth_l2_add_mac()
453 hash_add(card->rx_mode_addrs, &mac->hnode, mac_hash); in qeth_l2_add_mac()
458 struct qeth_card *card = container_of(work, struct qeth_card, in qeth_l2_rx_mode_work() local
460 struct net_device *dev = card->dev; in qeth_l2_rx_mode_work()
467 QETH_CARD_TEXT(card, 3, "setmulti"); in qeth_l2_rx_mode_work()
471 qeth_l2_add_mac(card, ha); in qeth_l2_rx_mode_work()
473 qeth_l2_add_mac(card, ha); in qeth_l2_rx_mode_work()
476 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_rx_mode_work()
479 qeth_l2_remove_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
484 rc = qeth_l2_write_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
497 qeth_l2_set_promisc_mode(card); in qeth_l2_rx_mode_work()
503 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit() local
510 if (IS_IQD(card)) in qeth_l2_hard_start_xmit()
512 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
514 rc = qeth_xmit(card, skb, queue, vlan_get_protocol(skb), in qeth_l2_hard_start_xmit()
533 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode() local
535 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
540 * @card: qeth_card structure pointer
552 static int qeth_l2_pnso(struct qeth_card *card, u8 oc, int cnc, in qeth_l2_pnso() argument
556 struct ccw_device *ddev = CARD_DDEV(card); in qeth_l2_pnso()
567 QETH_CARD_TEXT(card, 2, "PNSO"); in qeth_l2_pnso()
600 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
606 static bool qeth_is_my_net_if_token(struct qeth_card *card, in qeth_is_my_net_if_token() argument
609 return ((card->info.ddev_devno == token->devnum) && in qeth_is_my_net_if_token()
610 (card->info.cssid == token->cssid) && in qeth_is_my_net_if_token()
611 (card->info.iid == token->iid) && in qeth_is_my_net_if_token()
612 (card->info.ssid == token->ssid) && in qeth_is_my_net_if_token()
613 (card->info.chpid == token->chpid) && in qeth_is_my_net_if_token()
614 (card->info.chid == token->chid)); in qeth_is_my_net_if_token()
619 * @card: qeth_card structure pointer
629 static void qeth_l2_dev2br_fdb_notify(struct qeth_card *card, u8 code, in qeth_l2_dev2br_fdb_notify() argument
644 if (qeth_is_my_net_if_token(card, token)) in qeth_l2_dev2br_fdb_notify()
655 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
656 QETH_CARD_TEXT(card, 4, "andelmac"); in qeth_l2_dev2br_fdb_notify()
657 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
661 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
662 QETH_CARD_TEXT(card, 4, "anaddmac"); in qeth_l2_dev2br_fdb_notify()
663 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
672 struct qeth_card *card = priv; in qeth_l2_dev2br_an_set_cb() local
676 qeth_l2_dev2br_fdb_notify(card, code, in qeth_l2_dev2br_an_set_cb()
684 * @card: qeth_card structure pointer
692 static int qeth_l2_dev2br_an_set(struct qeth_card *card, bool enable) in qeth_l2_dev2br_an_set() argument
697 QETH_CARD_TEXT(card, 2, "anseton"); in qeth_l2_dev2br_an_set()
698 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 1, in qeth_l2_dev2br_an_set()
699 qeth_l2_dev2br_an_set_cb, card); in qeth_l2_dev2br_an_set()
704 qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, in qeth_l2_dev2br_an_set()
707 QETH_CARD_TEXT(card, 2, "ansetoff"); in qeth_l2_dev2br_an_set()
708 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, NULL, NULL); in qeth_l2_dev2br_an_set()
758 struct qeth_card *card = lsyncdev->ml_priv; in qeth_l2_br2dev_worker() local
763 QETH_CARD_TEXT_(card, 4, "b2dw%04lx", event); in qeth_l2_br2dev_worker()
764 QETH_CARD_TEXT_(card, 4, "ma%012llx", ether_addr_to_u64(addr)); in qeth_l2_br2dev_worker()
791 QETH_CARD_TEXT(card, 2, "b2derris"); in qeth_l2_br2dev_worker()
792 QETH_CARD_TEXT_(card, 2, in qeth_l2_br2dev_worker()
811 QETH_CARD_TEXT_(card, 2, "b2derr%02lx", event); in qeth_l2_br2dev_worker()
829 struct qeth_card *card; in qeth_l2_br2dev_queue_work() local
841 card = lsyncdev->ml_priv; in qeth_l2_br2dev_queue_work()
846 queue_work(card->event_wq, &worker_data->work); in qeth_l2_br2dev_queue_work()
858 struct qeth_card *card; in qeth_l2_switchdev_event() local
876 card = lowerdev->ml_priv; in qeth_l2_switchdev_event()
877 QETH_CARD_TEXT_(card, 4, "b2dqw%03lx", event); in qeth_l2_switchdev_event()
882 QETH_CARD_TEXT(card, 2, "b2dqwerr"); in qeth_l2_switchdev_event()
942 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink() local
947 qeth_bridgeport_is_in_use(card)) in qeth_l2_bridge_getlink()
974 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink() local
1022 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1024 if (qeth_bridgeport_is_in_use(card)) { in qeth_l2_bridge_setlink()
1028 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_bridge_setlink()
1029 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_bridge_setlink()
1031 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
1037 rc = qeth_l2_dev2br_an_set(card, false); in qeth_l2_bridge_setlink()
1039 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
1041 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_bridge_setlink()
1045 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1090 static int qeth_l2_setup_netdev(struct qeth_card *card) in qeth_l2_setup_netdev() argument
1092 card->dev->netdev_ops = IS_IQD(card) ? &qeth_l2_iqd_netdev_ops : in qeth_l2_setup_netdev()
1094 card->dev->needed_headroom = sizeof(struct qeth_hdr); in qeth_l2_setup_netdev()
1095 card->dev->priv_flags |= IFF_UNICAST_FLT; in qeth_l2_setup_netdev()
1097 if (IS_OSM(card)) { in qeth_l2_setup_netdev()
1098 card->dev->features |= NETIF_F_VLAN_CHALLENGED; in qeth_l2_setup_netdev()
1100 if (!IS_VM_NIC(card)) in qeth_l2_setup_netdev()
1101 card->dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1102 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1105 if (IS_OSD(card) && !IS_VM_NIC(card)) { in qeth_l2_setup_netdev()
1106 card->dev->features |= NETIF_F_SG; in qeth_l2_setup_netdev()
1108 if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) { in qeth_l2_setup_netdev()
1109 card->dev->hw_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1110 card->dev->vlan_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1113 if (qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
1114 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1115 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1117 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM) || in qeth_l2_setup_netdev()
1118 qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
1119 card->dev->hw_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1120 card->dev->vlan_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1122 if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
1123 card->dev->hw_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1124 card->dev->vlan_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1126 if (qeth_is_supported6(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
1127 card->dev->hw_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1128 card->dev->vlan_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1131 if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) { in qeth_l2_setup_netdev()
1132 card->dev->needed_headroom = sizeof(struct qeth_hdr_tso); in qeth_l2_setup_netdev()
1133 netif_keep_dst(card->dev); in qeth_l2_setup_netdev()
1134 netif_set_tso_max_size(card->dev, in qeth_l2_setup_netdev()
1138 netif_napi_add(card->dev, &card->napi, qeth_poll); in qeth_l2_setup_netdev()
1139 return register_netdev(card->dev); in qeth_l2_setup_netdev()
1142 static void qeth_l2_trace_features(struct qeth_card *card) in qeth_l2_trace_features() argument
1145 QETH_CARD_TEXT(card, 2, "featuSBP"); in qeth_l2_trace_features()
1146 QETH_CARD_HEX(card, 2, &card->options.sbp.supported_funcs, in qeth_l2_trace_features()
1147 sizeof(card->options.sbp.supported_funcs)); in qeth_l2_trace_features()
1149 QETH_CARD_TEXT(card, 2, "feaVNICC"); in qeth_l2_trace_features()
1150 QETH_CARD_HEX(card, 2, &card->options.vnicc.sup_chars, in qeth_l2_trace_features()
1151 sizeof(card->options.vnicc.sup_chars)); in qeth_l2_trace_features()
1154 static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) in qeth_l2_setup_bridgeport_attrs() argument
1156 if (!card->options.sbp.reflect_promisc && in qeth_l2_setup_bridgeport_attrs()
1157 card->options.sbp.role != QETH_SBP_ROLE_NONE) { in qeth_l2_setup_bridgeport_attrs()
1159 qeth_bridgeport_setrole(card, card->options.sbp.role); in qeth_l2_setup_bridgeport_attrs()
1161 qeth_bridgeport_query_ports(card, &card->options.sbp.role, in qeth_l2_setup_bridgeport_attrs()
1164 if (card->options.sbp.hostnotification) { in qeth_l2_setup_bridgeport_attrs()
1165 if (qeth_bridgeport_an_set(card, 1)) in qeth_l2_setup_bridgeport_attrs()
1166 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
1172 * Detect whether this card supports 'dev to bridge fdb network address
1175 * @card: qeth_card structure pointer
1177 static void qeth_l2_detect_dev2br_support(struct qeth_card *card) in qeth_l2_detect_dev2br_support() argument
1179 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
1182 QETH_CARD_TEXT(card, 2, "d2brsup"); in qeth_l2_detect_dev2br_support()
1183 if (!IS_IQD(card)) in qeth_l2_detect_dev2br_support()
1187 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1189 QETH_CARD_TEXT_(card, 2, "D2Bsup%02x", dev2br_supported); in qeth_l2_detect_dev2br_support()
1197 static void qeth_l2_enable_brport_features(struct qeth_card *card) in qeth_l2_enable_brport_features() argument
1199 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1204 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1205 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1208 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1209 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1210 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1211 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1214 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1217 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1218 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1222 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1235 * @card: qeth_card structure pointer, for udev events.
1248 static void qeth_bridge_emit_host_event(struct qeth_card *card, in qeth_bridge_emit_host_event() argument
1296 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1301 struct qeth_card *card; member
1331 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1336 static void qeth_bridge_state_change(struct qeth_card *card, in qeth_bridge_state_change() argument
1342 QETH_CARD_TEXT(card, 2, "brstchng"); in qeth_bridge_state_change()
1344 QETH_CARD_TEXT(card, 2, "BPempty"); in qeth_bridge_state_change()
1348 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1354 QETH_CARD_TEXT(card, 2, "BPSalloc"); in qeth_bridge_state_change()
1358 data->card = card; in qeth_bridge_state_change()
1363 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1368 struct qeth_card *card; member
1376 struct qeth_card *card; in qeth_l2_dev2br_worker() local
1382 card = data->card; in qeth_l2_dev2br_worker()
1383 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1385 QETH_CARD_TEXT(card, 4, "dev2brew"); in qeth_l2_dev2br_worker()
1387 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1393 queue_delayed_work(card->event_wq, dwork, in qeth_l2_dev2br_worker()
1398 if (!netif_device_present(card->dev)) { in qeth_l2_dev2br_worker()
1405 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1406 /* Card fdb and bridge fdb are out of sync, card has stopped in qeth_l2_dev2br_worker()
1411 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1412 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_dev2br_worker()
1419 netdev_err(card->dev, in qeth_l2_dev2br_worker()
1422 WRITE_ONCE(card->info.pnso_mode, in qeth_l2_dev2br_worker()
1425 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1430 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1438 qeth_l2_dev2br_fdb_notify(card, in qeth_l2_dev2br_worker()
1453 struct qeth_card *card; in qeth_addr_change_event_worker() local
1457 card = data->card; in qeth_addr_change_event_worker()
1459 QETH_CARD_TEXT(data->card, 4, "adrchgew"); in qeth_addr_change_event_worker()
1461 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_addr_change_event_worker()
1466 if (!mutex_trylock(&card->sbp_lock)) { in qeth_addr_change_event_worker()
1467 queue_delayed_work(card->event_wq, dwork, in qeth_addr_change_event_worker()
1472 dev_info(&data->card->gdev->dev, in qeth_addr_change_event_worker()
1474 netdev_name(card->dev), in qeth_addr_change_event_worker()
1481 data->card->options.sbp.hostnotification = 0; in qeth_addr_change_event_worker()
1482 card->info.pnso_mode = QETH_PNSO_NONE; in qeth_addr_change_event_worker()
1483 mutex_unlock(&data->card->sbp_lock); in qeth_addr_change_event_worker()
1484 qeth_bridge_emit_host_event(data->card, anev_abort, in qeth_addr_change_event_worker()
1490 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1501 static void qeth_addr_change_event(struct qeth_card *card, in qeth_addr_change_event() argument
1509 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1512 QETH_CARD_TEXT(card, 4, "adrchgev"); in qeth_addr_change_event()
1518 QETH_CARD_TEXT_(card, 2, "ACHN%04x", in qeth_addr_change_event()
1528 QETH_CARD_TEXT(card, 2, "ACNalloc"); in qeth_addr_change_event()
1531 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1535 data->card = card; in qeth_addr_change_event()
1538 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1553 static int qeth_bridgeport_makerc(struct qeth_card *card, in qeth_bridgeport_makerc() argument
1565 if ((IS_IQD(card) && ipa_rc == IPA_RC_SUCCESS) || in qeth_bridgeport_makerc()
1566 (!IS_IQD(card) && ipa_rc == sbp_rc)) { in qeth_bridgeport_makerc()
1578 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1584 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1592 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1597 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1607 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1613 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1619 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1625 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1645 QETH_CARD_TEXT_(card, 2, "SBPi%04x", ipa_rc); in qeth_bridgeport_makerc()
1646 QETH_CARD_TEXT_(card, 2, "SBPc%04x", sbp_rc); in qeth_bridgeport_makerc()
1651 static struct qeth_cmd_buffer *qeth_sbp_build_cmd(struct qeth_card *card, in qeth_sbp_build_cmd() argument
1655 enum qeth_ipa_cmds ipa_cmd = IS_IQD(card) ? IPA_CMD_SETBRIDGEPORT_IQD : in qeth_sbp_build_cmd()
1660 iob = qeth_ipa_alloc_cmd(card, ipa_cmd, QETH_PROT_NONE, in qeth_sbp_build_cmd()
1675 static int qeth_bridgeport_query_support_cb(struct qeth_card *card, in qeth_bridgeport_query_support_cb() argument
1682 QETH_CARD_TEXT(card, 2, "brqsupcb"); in qeth_bridgeport_query_support_cb()
1683 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_support_cb()
1694 * @card: qeth_card structure pointer.
1697 * strucutre: card->options.sbp.supported_funcs.
1699 static void qeth_bridgeport_query_support(struct qeth_card *card) in qeth_bridgeport_query_support() argument
1704 QETH_CARD_TEXT(card, 2, "brqsuppo"); in qeth_bridgeport_query_support()
1705 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_COMMANDS_SUPPORTED, in qeth_bridgeport_query_support()
1710 if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb, in qeth_bridgeport_query_support()
1712 card->options.sbp.role = QETH_SBP_ROLE_NONE; in qeth_bridgeport_query_support()
1713 card->options.sbp.supported_funcs = 0; in qeth_bridgeport_query_support()
1716 card->options.sbp.supported_funcs = cbctl.data.supported; in qeth_bridgeport_query_support()
1719 static int qeth_bridgeport_query_ports_cb(struct qeth_card *card, in qeth_bridgeport_query_ports_cb() argument
1727 QETH_CARD_TEXT(card, 2, "brqprtcb"); in qeth_bridgeport_query_ports_cb()
1728 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_ports_cb()
1734 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1749 * @card: qeth_card structure pointer.
1757 int qeth_bridgeport_query_ports(struct qeth_card *card, in qeth_bridgeport_query_ports() argument
1770 QETH_CARD_TEXT(card, 2, "brqports"); in qeth_bridgeport_query_ports()
1771 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1773 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_BRIDGE_PORTS, 0); in qeth_bridgeport_query_ports()
1777 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb, in qeth_bridgeport_query_ports()
1781 static int qeth_bridgeport_set_cb(struct qeth_card *card, in qeth_bridgeport_set_cb() argument
1786 QETH_CARD_TEXT(card, 2, "brsetrcb"); in qeth_bridgeport_set_cb()
1787 return qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_set_cb()
1792 * @card: qeth_card structure pointer.
1797 int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) in qeth_bridgeport_setrole() argument
1803 QETH_CARD_TEXT(card, 2, "brsetrol"); in qeth_bridgeport_setrole()
1818 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1820 iob = qeth_sbp_build_cmd(card, setcmd, cmdlength); in qeth_bridgeport_setrole()
1824 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb, NULL); in qeth_bridgeport_setrole()
1830 struct qeth_card *card = (struct qeth_card *)priv; in qeth_bridgeport_an_set_cb() local
1836 qeth_bridge_emit_host_event(card, anev_reg_unreg, code, in qeth_bridgeport_an_set_cb()
1843 * @card: qeth_card structure pointer.
1851 int qeth_bridgeport_an_set(struct qeth_card *card, int enable) in qeth_bridgeport_an_set() argument
1855 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1859 qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL); in qeth_bridgeport_an_set()
1860 qeth_l2_set_pnso_mode(card, QETH_PNSO_BRIDGEPORT); in qeth_bridgeport_an_set()
1861 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 1, in qeth_bridgeport_an_set()
1862 qeth_bridgeport_an_set_cb, card); in qeth_bridgeport_an_set()
1864 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1866 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 0, NULL, NULL); in qeth_bridgeport_an_set()
1867 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1875 static int qeth_l2_vnicc_makerc(struct qeth_card *card, u16 ipa_rc) in qeth_l2_vnicc_makerc() argument
1902 QETH_CARD_TEXT_(card, 2, "err%04x", ipa_rc); in qeth_l2_vnicc_makerc()
1907 static int qeth_l2_vnicc_request_cb(struct qeth_card *card, in qeth_l2_vnicc_request_cb() argument
1915 QETH_CARD_TEXT(card, 2, "vniccrcb"); in qeth_l2_vnicc_request_cb()
1917 return qeth_l2_vnicc_makerc(card, cmd->hdr.return_code); in qeth_l2_vnicc_request_cb()
1919 card->options.vnicc.sup_chars = rep->vnicc_cmds.supported; in qeth_l2_vnicc_request_cb()
1920 card->options.vnicc.cur_chars = rep->vnicc_cmds.enabled; in qeth_l2_vnicc_request_cb()
1930 static struct qeth_cmd_buffer *qeth_l2_vnicc_build_cmd(struct qeth_card *card, in qeth_l2_vnicc_build_cmd() argument
1937 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_VNICC, QETH_PROT_NONE, in qeth_l2_vnicc_build_cmd()
1950 static int qeth_l2_vnicc_query_chars(struct qeth_card *card) in qeth_l2_vnicc_query_chars() argument
1954 QETH_CARD_TEXT(card, 2, "vniccqch"); in qeth_l2_vnicc_query_chars()
1955 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CHARS, 0); in qeth_l2_vnicc_query_chars()
1959 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_query_chars()
1963 static int qeth_l2_vnicc_query_cmds(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_query_cmds() argument
1968 QETH_CARD_TEXT(card, 2, "vniccqcm"); in qeth_l2_vnicc_query_cmds()
1969 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CMDS, in qeth_l2_vnicc_query_cmds()
1976 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, sup_cmds); in qeth_l2_vnicc_query_cmds()
1980 static int qeth_l2_vnicc_set_char(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_set_char() argument
1985 QETH_CARD_TEXT(card, 2, "vniccedc"); in qeth_l2_vnicc_set_char()
1986 iob = qeth_l2_vnicc_build_cmd(card, cmd, VNICC_DATA_SIZEOF(set_char)); in qeth_l2_vnicc_set_char()
1992 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_set_char()
1996 static int qeth_l2_vnicc_getset_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_getset_timeout() argument
2002 QETH_CARD_TEXT(card, 2, "vniccgst"); in qeth_l2_vnicc_getset_timeout()
2003 iob = qeth_l2_vnicc_build_cmd(card, cmd, in qeth_l2_vnicc_getset_timeout()
2014 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, timeout); in qeth_l2_vnicc_getset_timeout()
2018 static bool qeth_l2_vnicc_recover_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_timeout() argument
2021 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_timeout()
2022 card->options.vnicc.getset_timeout_sup & vnicc && in qeth_l2_vnicc_recover_timeout()
2023 !qeth_l2_vnicc_getset_timeout(card, vnicc, IPA_VNICC_SET_TIMEOUT, in qeth_l2_vnicc_recover_timeout()
2031 int qeth_l2_vnicc_set_state(struct qeth_card *card, u32 vnicc, bool state) in qeth_l2_vnicc_set_state() argument
2036 QETH_CARD_TEXT(card, 2, "vniccsch"); in qeth_l2_vnicc_set_state()
2039 if (!(card->options.vnicc.sup_chars & vnicc) || in qeth_l2_vnicc_set_state()
2040 !(card->options.vnicc.set_char_sup & vnicc)) in qeth_l2_vnicc_set_state()
2043 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_state()
2049 card->options.vnicc.wanted_chars |= vnicc; in qeth_l2_vnicc_set_state()
2052 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2056 if (card->options.vnicc.cur_chars == card->options.vnicc.wanted_chars) in qeth_l2_vnicc_set_state()
2059 /* if card is not ready, simply stop here */ in qeth_l2_vnicc_set_state()
2060 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_state()
2062 card->options.vnicc.cur_chars |= vnicc; in qeth_l2_vnicc_set_state()
2064 card->options.vnicc.cur_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2068 rc = qeth_l2_vnicc_set_char(card, vnicc, cmd); in qeth_l2_vnicc_set_state()
2070 card->options.vnicc.wanted_chars = in qeth_l2_vnicc_set_state()
2071 card->options.vnicc.cur_chars; in qeth_l2_vnicc_set_state()
2075 card->options.vnicc.rx_bcast_enabled = true; in qeth_l2_vnicc_set_state()
2077 qeth_l2_vnicc_recover_timeout(card, vnicc, in qeth_l2_vnicc_set_state()
2078 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
2085 int qeth_l2_vnicc_get_state(struct qeth_card *card, u32 vnicc, bool *state) in qeth_l2_vnicc_get_state() argument
2089 QETH_CARD_TEXT(card, 2, "vniccgch"); in qeth_l2_vnicc_get_state()
2092 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
2095 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_state()
2098 /* if card is ready, query current VNICC state */ in qeth_l2_vnicc_get_state()
2099 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_state()
2100 rc = qeth_l2_vnicc_query_chars(card); in qeth_l2_vnicc_get_state()
2102 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
2109 int qeth_l2_vnicc_set_timeout(struct qeth_card *card, u32 timeout) in qeth_l2_vnicc_set_timeout() argument
2113 QETH_CARD_TEXT(card, 2, "vniccsto"); in qeth_l2_vnicc_set_timeout()
2116 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_set_timeout()
2117 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_set_timeout()
2120 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_timeout()
2124 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2127 /* if card is not ready, simply store the value internally and return */ in qeth_l2_vnicc_set_timeout()
2128 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_timeout()
2129 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2133 /* send timeout value to card; if successful, store value internally */ in qeth_l2_vnicc_set_timeout()
2134 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_set_timeout()
2137 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2145 int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) in qeth_l2_vnicc_get_timeout() argument
2149 QETH_CARD_TEXT(card, 2, "vniccgto"); in qeth_l2_vnicc_get_timeout()
2152 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_get_timeout()
2153 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_get_timeout()
2156 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_timeout()
2159 /* if card is ready, get timeout. Otherwise, just return stored value */ in qeth_l2_vnicc_get_timeout()
2160 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2161 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_timeout()
2162 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_get_timeout()
2170 static bool _qeth_l2_vnicc_is_in_use(struct qeth_card *card) in _qeth_l2_vnicc_is_in_use() argument
2172 if (!card->options.vnicc.sup_chars) in _qeth_l2_vnicc_is_in_use()
2175 * or the card is offline. in _qeth_l2_vnicc_is_in_use()
2177 if (card->options.vnicc.cur_chars == QETH_VNICC_DEFAULT) { in _qeth_l2_vnicc_is_in_use()
2178 if (!card->options.vnicc.rx_bcast_enabled || in _qeth_l2_vnicc_is_in_use()
2179 !qeth_card_hw_is_reachable(card)) in _qeth_l2_vnicc_is_in_use()
2187 * @card: qeth_card structure pointer
2192 bool qeth_bridgeport_allowed(struct qeth_card *card) in qeth_bridgeport_allowed() argument
2194 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2196 return (!_qeth_l2_vnicc_is_in_use(card) && in qeth_bridgeport_allowed()
2201 static bool qeth_l2_vnicc_recover_char(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_char() argument
2206 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_char()
2207 card->options.vnicc.set_char_sup & vnicc && in qeth_l2_vnicc_recover_char()
2208 !qeth_l2_vnicc_set_char(card, vnicc, cmd)) in qeth_l2_vnicc_recover_char()
2210 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_recover_char()
2211 card->options.vnicc.wanted_chars |= QETH_VNICC_DEFAULT & vnicc; in qeth_l2_vnicc_recover_char()
2216 static void qeth_l2_vnicc_init(struct qeth_card *card) in qeth_l2_vnicc_init() argument
2218 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2224 QETH_CARD_TEXT(card, 2, "vniccini"); in qeth_l2_vnicc_init()
2226 card->options.vnicc.rx_bcast_enabled = 0; in qeth_l2_vnicc_init()
2228 if (qeth_l2_vnicc_query_chars(card)) { in qeth_l2_vnicc_init()
2229 if (card->options.vnicc.wanted_chars != QETH_VNICC_DEFAULT || in qeth_l2_vnicc_init()
2231 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2233 card->options.vnicc.sup_chars = 0; in qeth_l2_vnicc_init()
2234 card->options.vnicc.cur_chars = 0; in qeth_l2_vnicc_init()
2235 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_init()
2239 chars_tmp = card->options.vnicc.sup_chars; in qeth_l2_vnicc_init()
2240 chars_len = sizeof(card->options.vnicc.sup_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2243 if (qeth_l2_vnicc_query_cmds(card, vnicc, &sup_cmds)) { in qeth_l2_vnicc_init()
2249 card->options.vnicc.getset_timeout_sup |= vnicc; in qeth_l2_vnicc_init()
2251 card->options.vnicc.getset_timeout_sup &= ~vnicc; in qeth_l2_vnicc_init()
2254 card->options.vnicc.set_char_sup |= vnicc; in qeth_l2_vnicc_init()
2256 card->options.vnicc.set_char_sup &= ~vnicc; in qeth_l2_vnicc_init()
2259 error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_init()
2262 chars_tmp = card->options.vnicc.wanted_chars ^ in qeth_l2_vnicc_init()
2263 card->options.vnicc.cur_chars; in qeth_l2_vnicc_init()
2264 chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2267 enable = card->options.vnicc.wanted_chars & vnicc; in qeth_l2_vnicc_init()
2268 error |= qeth_l2_vnicc_recover_char(card, vnicc, enable); in qeth_l2_vnicc_init()
2271 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2275 static void qeth_l2_vnicc_set_defaults(struct qeth_card *card) in qeth_l2_vnicc_set_defaults() argument
2278 card->options.vnicc.sup_chars = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2279 card->options.vnicc.cur_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2280 card->options.vnicc.learning_timeout = QETH_VNICC_DEFAULT_TIMEOUT; in qeth_l2_vnicc_set_defaults()
2282 card->options.vnicc.set_char_sup = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2283 card->options.vnicc.getset_timeout_sup = QETH_VNICC_LEARNING; in qeth_l2_vnicc_set_defaults()
2285 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2295 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_probe_device() local
2298 qeth_l2_vnicc_set_defaults(card); in qeth_l2_probe_device()
2299 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2309 INIT_WORK(&card->rx_mode_work, qeth_l2_rx_mode_work); in qeth_l2_probe_device()
2315 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_remove_device() local
2321 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_remove_device()
2322 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2325 qeth_set_offline(card, card->discipline, false); in qeth_l2_remove_device()
2327 if (card->dev->reg_state == NETREG_REGISTERED) { in qeth_l2_remove_device()
2328 priv = netdev_priv(card->dev); in qeth_l2_remove_device()
2334 unregister_netdev(card->dev); in qeth_l2_remove_device()
2338 static int qeth_l2_set_online(struct qeth_card *card, bool carrier_ok) in qeth_l2_set_online() argument
2340 struct net_device *dev = card->dev; in qeth_l2_set_online()
2343 qeth_l2_detect_dev2br_support(card); in qeth_l2_set_online()
2345 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2346 qeth_bridgeport_query_support(card); in qeth_l2_set_online()
2347 if (card->options.sbp.supported_funcs) { in qeth_l2_set_online()
2348 qeth_l2_setup_bridgeport_attrs(card); in qeth_l2_set_online()
2349 dev_info(&card->gdev->dev, in qeth_l2_set_online()
2352 mutex_unlock(&card->sbp_lock); in qeth_l2_set_online()
2354 qeth_l2_register_dev_addr(card); in qeth_l2_set_online()
2357 qeth_l2_vnicc_init(card); in qeth_l2_set_online()
2359 qeth_l2_trace_features(card); in qeth_l2_set_online()
2362 QETH_CARD_TEXT(card, 2, "softsetp"); in qeth_l2_set_online()
2364 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2366 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l2_set_online()
2369 rc = qeth_l2_setup_netdev(card); in qeth_l2_set_online()
2377 rc = qeth_set_real_num_tx_queues(card, in qeth_l2_set_online()
2378 qeth_tx_actual_queues(card)); in qeth_l2_set_online()
2391 qeth_l2_enable_brport_features(card); in qeth_l2_set_online()
2395 napi_schedule(&card->napi); in qeth_l2_set_online()
2406 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_online()
2407 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2411 static void qeth_l2_set_offline(struct qeth_card *card) in qeth_l2_set_offline() argument
2413 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_set_offline()
2415 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_offline()
2416 qeth_l2_drain_rx_mode_cache(card); in qeth_l2_set_offline()
2418 if (card->state == CARD_STATE_SOFTSETUP) in qeth_l2_set_offline()
2419 card->state = CARD_STATE_DOWN; in qeth_l2_set_offline()
2421 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_set_offline()
2423 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_set_offline()
2427 static int qeth_l2_control_event(struct qeth_card *card, in qeth_l2_control_event() argument
2435 qeth_bridge_state_change(card, cmd); in qeth_l2_control_event()
2441 qeth_addr_change_event(card, cmd); in qeth_l2_control_event()