Lines Matching full:card

32 static int qeth_l2_setdelmac_makerc(struct qeth_card *card, u16 retcode)  in qeth_l2_setdelmac_makerc()  argument
37 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelmac_makerc()
66 static int qeth_l2_send_setdelmac_cb(struct qeth_card *card, in qeth_l2_send_setdelmac_cb() argument
72 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
75 static int qeth_l2_send_setdelmac(struct qeth_card *card, const __u8 *mac, in qeth_l2_send_setdelmac() argument
81 QETH_CARD_TEXT(card, 2, "L2sdmac"); in qeth_l2_send_setdelmac()
82 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelmac()
89 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelmac_cb, NULL); in qeth_l2_send_setdelmac()
92 static int qeth_l2_send_setmac(struct qeth_card *card, const __u8 *mac) in qeth_l2_send_setmac() argument
96 QETH_CARD_TEXT(card, 2, "L2Setmac"); in qeth_l2_send_setmac()
97 rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC); in qeth_l2_send_setmac()
99 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
104 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
108 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
116 static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac) in qeth_l2_write_mac() argument
122 QETH_CARD_TEXT(card, 2, "L2Wmac"); in qeth_l2_write_mac()
123 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_write_mac()
126 ether_addr_to_u64(mac), CARD_DEVID(card)); in qeth_l2_write_mac()
129 ether_addr_to_u64(mac), CARD_DEVID(card), rc); in qeth_l2_write_mac()
133 static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac) in qeth_l2_remove_mac() argument
139 QETH_CARD_TEXT(card, 2, "L2Rmac"); in qeth_l2_remove_mac()
140 rc = qeth_l2_send_setdelmac(card, mac, cmd); in qeth_l2_remove_mac()
143 ether_addr_to_u64(mac), CARD_DEVID(card), rc); in qeth_l2_remove_mac()
147 static void qeth_l2_drain_rx_mode_cache(struct qeth_card *card) in qeth_l2_drain_rx_mode_cache() argument
153 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
193 static int qeth_l2_setdelvlan_makerc(struct qeth_card *card, u16 retcode) in qeth_l2_setdelvlan_makerc() argument
196 QETH_CARD_TEXT_(card, 2, "err%04x", retcode); in qeth_l2_setdelvlan_makerc()
214 static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, in qeth_l2_send_setdelvlan_cb() argument
220 QETH_CARD_TEXT(card, 2, "L2sdvcb"); in qeth_l2_send_setdelvlan_cb()
224 CARD_DEVID(card), cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
225 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); in qeth_l2_send_setdelvlan_cb()
227 return qeth_l2_setdelvlan_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
230 static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, in qeth_l2_send_setdelvlan() argument
236 QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); in qeth_l2_send_setdelvlan()
237 iob = qeth_ipa_alloc_cmd(card, ipacmd, QETH_PROT_IPV4, in qeth_l2_send_setdelvlan()
243 return qeth_send_ipa_cmd(card, iob, qeth_l2_send_setdelvlan_cb, NULL); in qeth_l2_send_setdelvlan()
249 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid() local
251 QETH_CARD_TEXT_(card, 4, "aid:%d", vid); in qeth_l2_vlan_rx_add_vid()
255 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); in qeth_l2_vlan_rx_add_vid()
261 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid() local
263 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l2_vlan_rx_kill_vid()
267 return qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); in qeth_l2_vlan_rx_kill_vid()
270 static void qeth_l2_set_pnso_mode(struct qeth_card *card, in qeth_l2_set_pnso_mode() argument
273 spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
274 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
275 spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); in qeth_l2_set_pnso_mode()
278 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
281 static void qeth_l2_dev2br_fdb_flush(struct qeth_card *card) in qeth_l2_dev2br_fdb_flush() argument
285 QETH_CARD_TEXT(card, 2, "fdbflush"); in qeth_l2_dev2br_fdb_flush()
294 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
297 static int qeth_l2_request_initial_mac(struct qeth_card *card) in qeth_l2_request_initial_mac() argument
301 QETH_CARD_TEXT(card, 2, "l2reqmac"); in qeth_l2_request_initial_mac()
304 rc = qeth_vm_request_mac(card); in qeth_l2_request_initial_mac()
308 CARD_DEVID(card), rc); in qeth_l2_request_initial_mac()
309 QETH_CARD_TEXT_(card, 2, "err%04x", rc); 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 (!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()
429 /* New MAC address is added to the hash table and marked to be written on card
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()
502 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit() local
509 if (IS_IQD(card)) in qeth_l2_hard_start_xmit()
511 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
513 rc = qeth_xmit(card, skb, queue, vlan_get_protocol(skb), in qeth_l2_hard_start_xmit()
532 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode() local
534 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
539 * @card: qeth_card structure pointer
551 static int qeth_l2_pnso(struct qeth_card *card, u8 oc, int cnc, in qeth_l2_pnso() argument
555 struct ccw_device *ddev = CARD_DDEV(card); in qeth_l2_pnso()
566 QETH_CARD_TEXT(card, 2, "PNSO"); in qeth_l2_pnso()
599 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
605 static bool qeth_is_my_net_if_token(struct qeth_card *card, in qeth_is_my_net_if_token() argument
608 return ((card->info.ddev_devno == token->devnum) && in qeth_is_my_net_if_token()
609 (card->info.cssid == token->cssid) && in qeth_is_my_net_if_token()
610 (card->info.iid == token->iid) && in qeth_is_my_net_if_token()
611 (card->info.ssid == token->ssid) && in qeth_is_my_net_if_token()
612 (card->info.chpid == token->chpid) && in qeth_is_my_net_if_token()
613 (card->info.chid == token->chid)); in qeth_is_my_net_if_token()
618 * @card: qeth_card structure pointer
628 static void qeth_l2_dev2br_fdb_notify(struct qeth_card *card, u8 code, in qeth_l2_dev2br_fdb_notify() argument
643 if (qeth_is_my_net_if_token(card, token)) in qeth_l2_dev2br_fdb_notify()
654 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
655 QETH_CARD_TEXT(card, 4, "andelmac"); in qeth_l2_dev2br_fdb_notify()
656 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
660 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
661 QETH_CARD_TEXT(card, 4, "anaddmac"); in qeth_l2_dev2br_fdb_notify()
662 QETH_CARD_TEXT_(card, 4, in qeth_l2_dev2br_fdb_notify()
671 struct qeth_card *card = priv; in qeth_l2_dev2br_an_set_cb() local
675 qeth_l2_dev2br_fdb_notify(card, code, in qeth_l2_dev2br_an_set_cb()
683 * @card: qeth_card structure pointer
691 static int qeth_l2_dev2br_an_set(struct qeth_card *card, bool enable) in qeth_l2_dev2br_an_set() argument
696 QETH_CARD_TEXT(card, 2, "anseton"); in qeth_l2_dev2br_an_set()
697 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 1, in qeth_l2_dev2br_an_set()
698 qeth_l2_dev2br_an_set_cb, card); in qeth_l2_dev2br_an_set()
703 qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, in qeth_l2_dev2br_an_set()
706 QETH_CARD_TEXT(card, 2, "ansetoff"); in qeth_l2_dev2br_an_set()
707 rc = qeth_l2_pnso(card, PNSO_OC_NET_ADDR_INFO, 0, NULL, NULL); in qeth_l2_dev2br_an_set()
757 struct qeth_card *card = lsyncdev->ml_priv; in qeth_l2_br2dev_worker() local
762 QETH_CARD_TEXT_(card, 4, "b2dw%04lx", event); in qeth_l2_br2dev_worker()
763 QETH_CARD_TEXT_(card, 4, "ma%012llx", ether_addr_to_u64(addr)); in qeth_l2_br2dev_worker()
790 QETH_CARD_TEXT(card, 2, "b2derris"); in qeth_l2_br2dev_worker()
791 QETH_CARD_TEXT_(card, 2, in qeth_l2_br2dev_worker()
810 QETH_CARD_TEXT_(card, 2, "b2derr%02lx", event); in qeth_l2_br2dev_worker()
828 struct qeth_card *card; in qeth_l2_br2dev_queue_work() local
840 card = lsyncdev->ml_priv; in qeth_l2_br2dev_queue_work()
845 queue_work(card->event_wq, &worker_data->work); in qeth_l2_br2dev_queue_work()
857 struct qeth_card *card; in qeth_l2_switchdev_event() local
875 card = lowerdev->ml_priv; in qeth_l2_switchdev_event()
876 QETH_CARD_TEXT_(card, 4, "b2dqw%03lx", event); in qeth_l2_switchdev_event()
881 QETH_CARD_TEXT(card, 2, "b2dqwerr"); in qeth_l2_switchdev_event()
941 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink() local
946 qeth_bridgeport_is_in_use(card)) in qeth_l2_bridge_getlink()
973 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink() local
1021 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1023 if (qeth_bridgeport_is_in_use(card)) { in qeth_l2_bridge_setlink()
1027 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_bridge_setlink()
1028 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_bridge_setlink()
1030 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
1036 rc = qeth_l2_dev2br_an_set(card, false); in qeth_l2_bridge_setlink()
1038 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_bridge_setlink()
1040 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_bridge_setlink()
1044 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1089 static int qeth_l2_setup_netdev(struct qeth_card *card) in qeth_l2_setup_netdev() argument
1091 card->dev->netdev_ops = IS_IQD(card) ? &qeth_l2_iqd_netdev_ops : in qeth_l2_setup_netdev()
1093 card->dev->needed_headroom = sizeof(struct qeth_hdr); in qeth_l2_setup_netdev()
1094 card->dev->priv_flags |= IFF_UNICAST_FLT; in qeth_l2_setup_netdev()
1096 if (IS_OSM(card)) { in qeth_l2_setup_netdev()
1097 card->dev->features |= NETIF_F_VLAN_CHALLENGED; in qeth_l2_setup_netdev()
1099 if (!IS_VM_NIC(card)) in qeth_l2_setup_netdev()
1100 card->dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1101 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1104 if (IS_OSD(card) && !IS_VM_NIC(card)) { in qeth_l2_setup_netdev()
1105 card->dev->features |= NETIF_F_SG; in qeth_l2_setup_netdev()
1107 if (qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) { in qeth_l2_setup_netdev()
1108 card->dev->hw_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1109 card->dev->vlan_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1112 if (qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
1113 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1114 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1116 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM) || in qeth_l2_setup_netdev()
1117 qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) { in qeth_l2_setup_netdev()
1118 card->dev->hw_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1119 card->dev->vlan_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1121 if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
1122 card->dev->hw_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1123 card->dev->vlan_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1125 if (qeth_is_supported6(card, IPA_OUTBOUND_TSO)) { in qeth_l2_setup_netdev()
1126 card->dev->hw_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1127 card->dev->vlan_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1130 if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) { in qeth_l2_setup_netdev()
1131 card->dev->needed_headroom = sizeof(struct qeth_hdr_tso); in qeth_l2_setup_netdev()
1132 netif_keep_dst(card->dev); in qeth_l2_setup_netdev()
1133 netif_set_tso_max_size(card->dev, in qeth_l2_setup_netdev()
1137 netif_napi_add(card->dev, &card->napi, qeth_poll); in qeth_l2_setup_netdev()
1138 return register_netdev(card->dev); in qeth_l2_setup_netdev()
1141 static void qeth_l2_trace_features(struct qeth_card *card) in qeth_l2_trace_features() argument
1144 QETH_CARD_TEXT(card, 2, "featuSBP"); in qeth_l2_trace_features()
1145 QETH_CARD_HEX(card, 2, &card->options.sbp.supported_funcs, in qeth_l2_trace_features()
1146 sizeof(card->options.sbp.supported_funcs)); in qeth_l2_trace_features()
1148 QETH_CARD_TEXT(card, 2, "feaVNICC"); in qeth_l2_trace_features()
1149 QETH_CARD_HEX(card, 2, &card->options.vnicc.sup_chars, in qeth_l2_trace_features()
1150 sizeof(card->options.vnicc.sup_chars)); in qeth_l2_trace_features()
1153 static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) in qeth_l2_setup_bridgeport_attrs() argument
1155 if (!card->options.sbp.reflect_promisc && in qeth_l2_setup_bridgeport_attrs()
1156 card->options.sbp.role != QETH_SBP_ROLE_NONE) { in qeth_l2_setup_bridgeport_attrs()
1158 qeth_bridgeport_setrole(card, card->options.sbp.role); in qeth_l2_setup_bridgeport_attrs()
1160 qeth_bridgeport_query_ports(card, &card->options.sbp.role, in qeth_l2_setup_bridgeport_attrs()
1163 if (card->options.sbp.hostnotification) { in qeth_l2_setup_bridgeport_attrs()
1164 if (qeth_bridgeport_an_set(card, 1)) in qeth_l2_setup_bridgeport_attrs()
1165 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
1171 * Detect whether this card supports 'dev to bridge fdb network address
1174 * @card: qeth_card structure pointer
1176 static void qeth_l2_detect_dev2br_support(struct qeth_card *card) in qeth_l2_detect_dev2br_support() argument
1178 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
1181 QETH_CARD_TEXT(card, 2, "d2brsup"); in qeth_l2_detect_dev2br_support()
1182 if (!IS_IQD(card)) in qeth_l2_detect_dev2br_support()
1186 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1188 QETH_CARD_TEXT_(card, 2, "D2Bsup%02x", dev2br_supported); in qeth_l2_detect_dev2br_support()
1196 static void qeth_l2_enable_brport_features(struct qeth_card *card) in qeth_l2_enable_brport_features() argument
1198 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1203 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1204 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1207 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1208 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1209 qeth_l2_set_pnso_mode(card, QETH_PNSO_ADDR_INFO); in qeth_l2_enable_brport_features()
1210 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_enable_brport_features()
1213 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1216 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_enable_brport_features()
1217 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_enable_brport_features()
1221 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1234 * @card: qeth_card structure pointer, for udev events.
1247 static void qeth_bridge_emit_host_event(struct qeth_card *card, in qeth_bridge_emit_host_event() argument
1295 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1300 struct qeth_card *card; member
1330 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1335 static void qeth_bridge_state_change(struct qeth_card *card, in qeth_bridge_state_change() argument
1341 QETH_CARD_TEXT(card, 2, "brstchng"); in qeth_bridge_state_change()
1343 QETH_CARD_TEXT(card, 2, "BPempty"); in qeth_bridge_state_change()
1347 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1353 QETH_CARD_TEXT(card, 2, "BPSalloc"); in qeth_bridge_state_change()
1357 data->card = card; in qeth_bridge_state_change()
1362 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1367 struct qeth_card *card; member
1375 struct qeth_card *card; in qeth_l2_dev2br_worker() local
1381 card = data->card; in qeth_l2_dev2br_worker()
1382 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1384 QETH_CARD_TEXT(card, 4, "dev2brew"); in qeth_l2_dev2br_worker()
1386 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1392 queue_delayed_work(card->event_wq, dwork, in qeth_l2_dev2br_worker()
1397 if (!netif_device_present(card->dev)) { in qeth_l2_dev2br_worker()
1404 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1405 /* Card fdb and bridge fdb are out of sync, card has stopped in qeth_l2_dev2br_worker()
1410 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1411 rc = qeth_l2_dev2br_an_set(card, true); in qeth_l2_dev2br_worker()
1418 netdev_err(card->dev, in qeth_l2_dev2br_worker()
1421 WRITE_ONCE(card->info.pnso_mode, in qeth_l2_dev2br_worker()
1424 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_dev2br_worker()
1429 CARD_DEVID(card)); in qeth_l2_dev2br_worker()
1437 qeth_l2_dev2br_fdb_notify(card, in qeth_l2_dev2br_worker()
1452 struct qeth_card *card; in qeth_addr_change_event_worker() local
1456 card = data->card; in qeth_addr_change_event_worker()
1458 QETH_CARD_TEXT(data->card, 4, "adrchgew"); in qeth_addr_change_event_worker()
1460 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_addr_change_event_worker()
1465 if (!mutex_trylock(&card->sbp_lock)) { in qeth_addr_change_event_worker()
1466 queue_delayed_work(card->event_wq, dwork, in qeth_addr_change_event_worker()
1471 dev_info(&data->card->gdev->dev, in qeth_addr_change_event_worker()
1473 netdev_name(card->dev), in qeth_addr_change_event_worker()
1480 data->card->options.sbp.hostnotification = 0; in qeth_addr_change_event_worker()
1481 card->info.pnso_mode = QETH_PNSO_NONE; in qeth_addr_change_event_worker()
1482 mutex_unlock(&data->card->sbp_lock); in qeth_addr_change_event_worker()
1483 qeth_bridge_emit_host_event(data->card, anev_abort, in qeth_addr_change_event_worker()
1489 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1500 static void qeth_addr_change_event(struct qeth_card *card, in qeth_addr_change_event() argument
1508 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1511 QETH_CARD_TEXT(card, 4, "adrchgev"); in qeth_addr_change_event()
1517 QETH_CARD_TEXT_(card, 2, "ACHN%04x", in qeth_addr_change_event()
1527 QETH_CARD_TEXT(card, 2, "ACNalloc"); in qeth_addr_change_event()
1530 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1534 data->card = card; in qeth_addr_change_event()
1537 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1552 static int qeth_bridgeport_makerc(struct qeth_card *card, in qeth_bridgeport_makerc() argument
1564 if ((IS_IQD(card) && ipa_rc == IPA_RC_SUCCESS) || in qeth_bridgeport_makerc()
1565 (!IS_IQD(card) && ipa_rc == sbp_rc)) { in qeth_bridgeport_makerc()
1577 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1583 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1591 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1596 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1606 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1612 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1618 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1624 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1644 QETH_CARD_TEXT_(card, 2, "SBPi%04x", ipa_rc); in qeth_bridgeport_makerc()
1645 QETH_CARD_TEXT_(card, 2, "SBPc%04x", sbp_rc); in qeth_bridgeport_makerc()
1650 static struct qeth_cmd_buffer *qeth_sbp_build_cmd(struct qeth_card *card, in qeth_sbp_build_cmd() argument
1654 enum qeth_ipa_cmds ipa_cmd = IS_IQD(card) ? IPA_CMD_SETBRIDGEPORT_IQD : in qeth_sbp_build_cmd()
1659 iob = qeth_ipa_alloc_cmd(card, ipa_cmd, QETH_PROT_NONE, in qeth_sbp_build_cmd()
1674 static int qeth_bridgeport_query_support_cb(struct qeth_card *card, in qeth_bridgeport_query_support_cb() argument
1681 QETH_CARD_TEXT(card, 2, "brqsupcb"); in qeth_bridgeport_query_support_cb()
1682 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_support_cb()
1693 * @card: qeth_card structure pointer.
1696 * strucutre: card->options.sbp.supported_funcs.
1698 static void qeth_bridgeport_query_support(struct qeth_card *card) in qeth_bridgeport_query_support() argument
1703 QETH_CARD_TEXT(card, 2, "brqsuppo"); in qeth_bridgeport_query_support()
1704 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_COMMANDS_SUPPORTED, in qeth_bridgeport_query_support()
1709 if (qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_support_cb, in qeth_bridgeport_query_support()
1711 card->options.sbp.role = QETH_SBP_ROLE_NONE; in qeth_bridgeport_query_support()
1712 card->options.sbp.supported_funcs = 0; in qeth_bridgeport_query_support()
1715 card->options.sbp.supported_funcs = cbctl.data.supported; in qeth_bridgeport_query_support()
1718 static int qeth_bridgeport_query_ports_cb(struct qeth_card *card, in qeth_bridgeport_query_ports_cb() argument
1726 QETH_CARD_TEXT(card, 2, "brqprtcb"); in qeth_bridgeport_query_ports_cb()
1727 rc = qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_query_ports_cb()
1733 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1748 * @card: qeth_card structure pointer.
1756 int qeth_bridgeport_query_ports(struct qeth_card *card, in qeth_bridgeport_query_ports() argument
1769 QETH_CARD_TEXT(card, 2, "brqports"); in qeth_bridgeport_query_ports()
1770 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1772 iob = qeth_sbp_build_cmd(card, IPA_SBP_QUERY_BRIDGE_PORTS, 0); in qeth_bridgeport_query_ports()
1776 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_query_ports_cb, in qeth_bridgeport_query_ports()
1780 static int qeth_bridgeport_set_cb(struct qeth_card *card, in qeth_bridgeport_set_cb() argument
1785 QETH_CARD_TEXT(card, 2, "brsetrcb"); in qeth_bridgeport_set_cb()
1786 return qeth_bridgeport_makerc(card, cmd); in qeth_bridgeport_set_cb()
1791 * @card: qeth_card structure pointer.
1796 int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) in qeth_bridgeport_setrole() argument
1802 QETH_CARD_TEXT(card, 2, "brsetrol"); in qeth_bridgeport_setrole()
1817 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1819 iob = qeth_sbp_build_cmd(card, setcmd, cmdlength); in qeth_bridgeport_setrole()
1823 return qeth_send_ipa_cmd(card, iob, qeth_bridgeport_set_cb, NULL); in qeth_bridgeport_setrole()
1829 struct qeth_card *card = (struct qeth_card *)priv; in qeth_bridgeport_an_set_cb() local
1835 qeth_bridge_emit_host_event(card, anev_reg_unreg, code, in qeth_bridgeport_an_set_cb()
1842 * @card: qeth_card structure pointer.
1850 int qeth_bridgeport_an_set(struct qeth_card *card, int enable) in qeth_bridgeport_an_set() argument
1854 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1858 qeth_bridge_emit_host_event(card, anev_reset, 0, NULL, NULL); in qeth_bridgeport_an_set()
1859 qeth_l2_set_pnso_mode(card, QETH_PNSO_BRIDGEPORT); in qeth_bridgeport_an_set()
1860 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 1, in qeth_bridgeport_an_set()
1861 qeth_bridgeport_an_set_cb, card); in qeth_bridgeport_an_set()
1863 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1865 rc = qeth_l2_pnso(card, PNSO_OC_NET_BRIDGE_INFO, 0, NULL, NULL); in qeth_bridgeport_an_set()
1866 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_bridgeport_an_set()
1874 static int qeth_l2_vnicc_makerc(struct qeth_card *card, u16 ipa_rc) in qeth_l2_vnicc_makerc() argument
1901 QETH_CARD_TEXT_(card, 2, "err%04x", ipa_rc); in qeth_l2_vnicc_makerc()
1906 static int qeth_l2_vnicc_request_cb(struct qeth_card *card, in qeth_l2_vnicc_request_cb() argument
1914 QETH_CARD_TEXT(card, 2, "vniccrcb"); in qeth_l2_vnicc_request_cb()
1916 return qeth_l2_vnicc_makerc(card, cmd->hdr.return_code); in qeth_l2_vnicc_request_cb()
1918 card->options.vnicc.sup_chars = rep->vnicc_cmds.supported; in qeth_l2_vnicc_request_cb()
1919 card->options.vnicc.cur_chars = rep->vnicc_cmds.enabled; in qeth_l2_vnicc_request_cb()
1929 static struct qeth_cmd_buffer *qeth_l2_vnicc_build_cmd(struct qeth_card *card, in qeth_l2_vnicc_build_cmd() argument
1936 iob = qeth_ipa_alloc_cmd(card, IPA_CMD_VNICC, QETH_PROT_NONE, in qeth_l2_vnicc_build_cmd()
1949 static int qeth_l2_vnicc_query_chars(struct qeth_card *card) in qeth_l2_vnicc_query_chars() argument
1953 QETH_CARD_TEXT(card, 2, "vniccqch"); in qeth_l2_vnicc_query_chars()
1954 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CHARS, 0); in qeth_l2_vnicc_query_chars()
1958 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_query_chars()
1962 static int qeth_l2_vnicc_query_cmds(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_query_cmds() argument
1967 QETH_CARD_TEXT(card, 2, "vniccqcm"); in qeth_l2_vnicc_query_cmds()
1968 iob = qeth_l2_vnicc_build_cmd(card, IPA_VNICC_QUERY_CMDS, in qeth_l2_vnicc_query_cmds()
1975 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, sup_cmds); in qeth_l2_vnicc_query_cmds()
1979 static int qeth_l2_vnicc_set_char(struct qeth_card *card, u32 vnic_char, in qeth_l2_vnicc_set_char() argument
1984 QETH_CARD_TEXT(card, 2, "vniccedc"); in qeth_l2_vnicc_set_char()
1985 iob = qeth_l2_vnicc_build_cmd(card, cmd, VNICC_DATA_SIZEOF(set_char)); in qeth_l2_vnicc_set_char()
1991 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, NULL); in qeth_l2_vnicc_set_char()
1995 static int qeth_l2_vnicc_getset_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_getset_timeout() argument
2001 QETH_CARD_TEXT(card, 2, "vniccgst"); in qeth_l2_vnicc_getset_timeout()
2002 iob = qeth_l2_vnicc_build_cmd(card, cmd, in qeth_l2_vnicc_getset_timeout()
2013 return qeth_send_ipa_cmd(card, iob, qeth_l2_vnicc_request_cb, timeout); in qeth_l2_vnicc_getset_timeout()
2017 static bool qeth_l2_vnicc_recover_timeout(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_timeout() argument
2020 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_timeout()
2021 card->options.vnicc.getset_timeout_sup & vnicc && in qeth_l2_vnicc_recover_timeout()
2022 !qeth_l2_vnicc_getset_timeout(card, vnicc, IPA_VNICC_SET_TIMEOUT, in qeth_l2_vnicc_recover_timeout()
2030 int qeth_l2_vnicc_set_state(struct qeth_card *card, u32 vnicc, bool state) in qeth_l2_vnicc_set_state() argument
2035 QETH_CARD_TEXT(card, 2, "vniccsch"); in qeth_l2_vnicc_set_state()
2038 if (!(card->options.vnicc.sup_chars & vnicc) || in qeth_l2_vnicc_set_state()
2039 !(card->options.vnicc.set_char_sup & vnicc)) in qeth_l2_vnicc_set_state()
2042 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_state()
2048 card->options.vnicc.wanted_chars |= vnicc; in qeth_l2_vnicc_set_state()
2051 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2055 if (card->options.vnicc.cur_chars == card->options.vnicc.wanted_chars) in qeth_l2_vnicc_set_state()
2058 /* if card is not ready, simply stop here */ in qeth_l2_vnicc_set_state()
2059 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_state()
2061 card->options.vnicc.cur_chars |= vnicc; in qeth_l2_vnicc_set_state()
2063 card->options.vnicc.cur_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2067 rc = qeth_l2_vnicc_set_char(card, vnicc, cmd); in qeth_l2_vnicc_set_state()
2069 card->options.vnicc.wanted_chars = in qeth_l2_vnicc_set_state()
2070 card->options.vnicc.cur_chars; in qeth_l2_vnicc_set_state()
2074 card->options.vnicc.rx_bcast_enabled = true; in qeth_l2_vnicc_set_state()
2076 qeth_l2_vnicc_recover_timeout(card, vnicc, in qeth_l2_vnicc_set_state()
2077 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
2084 int qeth_l2_vnicc_get_state(struct qeth_card *card, u32 vnicc, bool *state) in qeth_l2_vnicc_get_state() argument
2088 QETH_CARD_TEXT(card, 2, "vniccgch"); in qeth_l2_vnicc_get_state()
2091 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
2094 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_state()
2097 /* if card is ready, query current VNICC state */ in qeth_l2_vnicc_get_state()
2098 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_state()
2099 rc = qeth_l2_vnicc_query_chars(card); in qeth_l2_vnicc_get_state()
2101 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
2108 int qeth_l2_vnicc_set_timeout(struct qeth_card *card, u32 timeout) in qeth_l2_vnicc_set_timeout() argument
2112 QETH_CARD_TEXT(card, 2, "vniccsto"); in qeth_l2_vnicc_set_timeout()
2115 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_set_timeout()
2116 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_set_timeout()
2119 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_set_timeout()
2123 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2126 /* if card is not ready, simply store the value internally and return */ in qeth_l2_vnicc_set_timeout()
2127 if (!qeth_card_hw_is_reachable(card)) { in qeth_l2_vnicc_set_timeout()
2128 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2132 /* send timeout value to card; if successful, store value internally */ in qeth_l2_vnicc_set_timeout()
2133 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_set_timeout()
2136 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2144 int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) in qeth_l2_vnicc_get_timeout() argument
2148 QETH_CARD_TEXT(card, 2, "vniccgto"); in qeth_l2_vnicc_get_timeout()
2151 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_get_timeout()
2152 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_get_timeout()
2155 if (qeth_bridgeport_is_in_use(card)) in qeth_l2_vnicc_get_timeout()
2158 /* if card is ready, get timeout. Otherwise, just return stored value */ in qeth_l2_vnicc_get_timeout()
2159 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2160 if (qeth_card_hw_is_reachable(card)) in qeth_l2_vnicc_get_timeout()
2161 rc = qeth_l2_vnicc_getset_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_get_timeout()
2169 static bool _qeth_l2_vnicc_is_in_use(struct qeth_card *card) in _qeth_l2_vnicc_is_in_use() argument
2171 if (!card->options.vnicc.sup_chars) in _qeth_l2_vnicc_is_in_use()
2174 * or the card is offline. in _qeth_l2_vnicc_is_in_use()
2176 if (card->options.vnicc.cur_chars == QETH_VNICC_DEFAULT) { in _qeth_l2_vnicc_is_in_use()
2177 if (!card->options.vnicc.rx_bcast_enabled || in _qeth_l2_vnicc_is_in_use()
2178 !qeth_card_hw_is_reachable(card)) in _qeth_l2_vnicc_is_in_use()
2186 * @card: qeth_card structure pointer
2191 bool qeth_bridgeport_allowed(struct qeth_card *card) in qeth_bridgeport_allowed() argument
2193 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2195 return (!_qeth_l2_vnicc_is_in_use(card) && in qeth_bridgeport_allowed()
2200 static bool qeth_l2_vnicc_recover_char(struct qeth_card *card, u32 vnicc, in qeth_l2_vnicc_recover_char() argument
2205 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_char()
2206 card->options.vnicc.set_char_sup & vnicc && in qeth_l2_vnicc_recover_char()
2207 !qeth_l2_vnicc_set_char(card, vnicc, cmd)) in qeth_l2_vnicc_recover_char()
2209 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_recover_char()
2210 card->options.vnicc.wanted_chars |= QETH_VNICC_DEFAULT & vnicc; in qeth_l2_vnicc_recover_char()
2215 static void qeth_l2_vnicc_init(struct qeth_card *card) in qeth_l2_vnicc_init() argument
2217 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2223 QETH_CARD_TEXT(card, 2, "vniccini"); in qeth_l2_vnicc_init()
2225 card->options.vnicc.rx_bcast_enabled = 0; in qeth_l2_vnicc_init()
2227 if (qeth_l2_vnicc_query_chars(card)) { in qeth_l2_vnicc_init()
2228 if (card->options.vnicc.wanted_chars != QETH_VNICC_DEFAULT || in qeth_l2_vnicc_init()
2230 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2232 card->options.vnicc.sup_chars = 0; in qeth_l2_vnicc_init()
2233 card->options.vnicc.cur_chars = 0; in qeth_l2_vnicc_init()
2234 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_init()
2238 chars_tmp = card->options.vnicc.sup_chars; in qeth_l2_vnicc_init()
2239 chars_len = sizeof(card->options.vnicc.sup_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2242 if (qeth_l2_vnicc_query_cmds(card, vnicc, &sup_cmds)) { in qeth_l2_vnicc_init()
2248 card->options.vnicc.getset_timeout_sup |= vnicc; in qeth_l2_vnicc_init()
2250 card->options.vnicc.getset_timeout_sup &= ~vnicc; in qeth_l2_vnicc_init()
2253 card->options.vnicc.set_char_sup |= vnicc; in qeth_l2_vnicc_init()
2255 card->options.vnicc.set_char_sup &= ~vnicc; in qeth_l2_vnicc_init()
2258 error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, in qeth_l2_vnicc_init()
2261 chars_tmp = card->options.vnicc.wanted_chars ^ in qeth_l2_vnicc_init()
2262 card->options.vnicc.cur_chars; in qeth_l2_vnicc_init()
2263 chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2266 enable = card->options.vnicc.wanted_chars & vnicc; in qeth_l2_vnicc_init()
2267 error |= qeth_l2_vnicc_recover_char(card, vnicc, enable); in qeth_l2_vnicc_init()
2270 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2274 static void qeth_l2_vnicc_set_defaults(struct qeth_card *card) in qeth_l2_vnicc_set_defaults() argument
2277 card->options.vnicc.sup_chars = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2278 card->options.vnicc.cur_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2279 card->options.vnicc.learning_timeout = QETH_VNICC_DEFAULT_TIMEOUT; in qeth_l2_vnicc_set_defaults()
2281 card->options.vnicc.set_char_sup = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2282 card->options.vnicc.getset_timeout_sup = QETH_VNICC_LEARNING; in qeth_l2_vnicc_set_defaults()
2284 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2294 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_probe_device() local
2297 qeth_l2_vnicc_set_defaults(card); in qeth_l2_probe_device()
2298 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2308 INIT_WORK(&card->rx_mode_work, qeth_l2_rx_mode_work); in qeth_l2_probe_device()
2314 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_remove_device() local
2320 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_remove_device()
2321 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2324 qeth_set_offline(card, card->discipline, false); in qeth_l2_remove_device()
2326 if (card->dev->reg_state == NETREG_REGISTERED) { in qeth_l2_remove_device()
2327 priv = netdev_priv(card->dev); in qeth_l2_remove_device()
2333 unregister_netdev(card->dev); in qeth_l2_remove_device()
2337 static int qeth_l2_set_online(struct qeth_card *card, bool carrier_ok) in qeth_l2_set_online() argument
2339 struct net_device *dev = card->dev; in qeth_l2_set_online()
2342 qeth_l2_detect_dev2br_support(card); in qeth_l2_set_online()
2344 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2345 qeth_bridgeport_query_support(card); in qeth_l2_set_online()
2346 if (card->options.sbp.supported_funcs) { in qeth_l2_set_online()
2347 qeth_l2_setup_bridgeport_attrs(card); in qeth_l2_set_online()
2348 dev_info(&card->gdev->dev, in qeth_l2_set_online()
2351 mutex_unlock(&card->sbp_lock); in qeth_l2_set_online()
2353 qeth_l2_register_dev_addr(card); in qeth_l2_set_online()
2356 qeth_l2_vnicc_init(card); in qeth_l2_set_online()
2358 qeth_l2_trace_features(card); in qeth_l2_set_online()
2361 QETH_CARD_TEXT(card, 2, "softsetp"); in qeth_l2_set_online()
2363 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2365 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l2_set_online()
2368 rc = qeth_l2_setup_netdev(card); in qeth_l2_set_online()
2376 rc = qeth_set_real_num_tx_queues(card, in qeth_l2_set_online()
2377 qeth_tx_actual_queues(card)); in qeth_l2_set_online()
2390 qeth_l2_enable_brport_features(card); in qeth_l2_set_online()
2394 napi_schedule(&card->napi); in qeth_l2_set_online()
2405 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_online()
2406 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2410 static void qeth_l2_set_offline(struct qeth_card *card) in qeth_l2_set_offline() argument
2412 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_set_offline()
2414 qeth_set_allowed_threads(card, 0, 1); in qeth_l2_set_offline()
2415 qeth_l2_drain_rx_mode_cache(card); in qeth_l2_set_offline()
2417 if (card->state == CARD_STATE_SOFTSETUP) in qeth_l2_set_offline()
2418 card->state = CARD_STATE_DOWN; in qeth_l2_set_offline()
2420 qeth_l2_set_pnso_mode(card, QETH_PNSO_NONE); in qeth_l2_set_offline()
2422 qeth_l2_dev2br_fdb_flush(card); in qeth_l2_set_offline()
2426 static int qeth_l2_control_event(struct qeth_card *card, in qeth_l2_control_event() argument
2434 qeth_bridge_state_change(card, cmd); in qeth_l2_control_event()
2440 qeth_addr_change_event(card, cmd); in qeth_l2_control_event()