Lines Matching +full:mcast +full:- +full:groups

1 // SPDX-License-Identifier: GPL-2.0
44 rc = -EOPNOTSUPP; in qeth_l2_setdelmac_makerc()
47 rc = -ENOSPC; in qeth_l2_setdelmac_makerc()
51 rc = -EADDRINUSE; in qeth_l2_setdelmac_makerc()
55 rc = -EADDRNOTAVAIL; in qeth_l2_setdelmac_makerc()
58 rc = -ENOENT; in qeth_l2_setdelmac_makerc()
61 rc = -EIO; in qeth_l2_setdelmac_makerc()
73 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
86 return -ENOMEM; in qeth_l2_send_setdelmac()
88 cmd->data.setdelmac.mac_length = ETH_ALEN; in qeth_l2_send_setdelmac()
89 ether_addr_copy(cmd->data.setdelmac.mac, mac); in qeth_l2_send_setdelmac()
100 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
104 case -EADDRINUSE: in qeth_l2_send_setmac()
105 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
108 case -EADDRNOTAVAIL: in qeth_l2_send_setmac()
109 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
125 if (rc == -EADDRINUSE) in qeth_l2_write_mac()
154 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
155 hash_del(&mac->hnode); in qeth_l2_drain_rx_mode_cache()
167 hdr->hdr.l2.pkt_length = data_len; in qeth_l2_fill_header()
170 hdr->hdr.l2.id = QETH_HEADER_TYPE_L2_TSO; in qeth_l2_fill_header()
172 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2; in qeth_l2_fill_header()
173 if (skb->ip_summed == CHECKSUM_PARTIAL) in qeth_l2_fill_header()
174 qeth_tx_csum(skb, &hdr->hdr.l2.flags[1], proto); in qeth_l2_fill_header()
179 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; in qeth_l2_fill_header()
181 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; in qeth_l2_fill_header()
183 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; in qeth_l2_fill_header()
188 if (veth->h_vlan_proto == htons(ETH_P_8021Q)) { in qeth_l2_fill_header()
189 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN; in qeth_l2_fill_header()
190 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI); in qeth_l2_fill_header()
203 return -EINVAL; in qeth_l2_setdelvlan_makerc()
205 return -EEXIST; in qeth_l2_setdelvlan_makerc()
207 return -ENOENT; in qeth_l2_setdelvlan_makerc()
209 return -EPERM; in qeth_l2_setdelvlan_makerc()
211 return -EIO; in qeth_l2_setdelvlan_makerc()
222 if (cmd->hdr.return_code) { in qeth_l2_send_setdelvlan_cb()
224 cmd->data.setdelvlan.vlan_id, 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()
241 return -ENOMEM; in qeth_l2_send_setdelvlan()
243 cmd->data.setdelvlan.vlan_id = i; in qeth_l2_send_setdelvlan()
250 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid()
262 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid()
275 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
279 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
295 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
325 return (rc) ? rc : -EADDRNOTAVAIL; 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()
335 if (!is_valid_ether_addr(card->dev->dev_addr)) 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()
348 if (card->info.dev_addr_is_registered) in qeth_l2_validate_addr()
352 return -EPERM; in qeth_l2_validate_addr()
358 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_mac_address()
366 return -EOPNOTSUPP; in qeth_l2_set_mac_address()
368 QETH_CARD_HEX(card, 3, addr->sa_data, ETH_ALEN); in qeth_l2_set_mac_address()
369 if (!is_valid_ether_addr(addr->sa_data)) in qeth_l2_set_mac_address()
370 return -EADDRNOTAVAIL; in qeth_l2_set_mac_address()
373 if (ether_addr_equal_64bits(dev->dev_addr, addr->sa_data) && 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()
381 ether_addr_copy(old_addr, dev->dev_addr); in qeth_l2_set_mac_address()
382 eth_hw_addr_set(dev, addr->sa_data); in qeth_l2_set_mac_address()
384 if (card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
386 card->info.dev_addr_is_registered = 1; in qeth_l2_set_mac_address()
398 if (card->options.sbp.reflect_promisc_primary) 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()
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()
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()
426 mutex_unlock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
436 u32 mac_hash = get_unaligned((u32 *)(&ha->addr[2])); in qeth_l2_add_mac()
439 hash_for_each_possible(card->rx_mode_addrs, mac, hnode, mac_hash) { in qeth_l2_add_mac()
440 if (ether_addr_equal_64bits(ha->addr, mac->mac_addr)) { in qeth_l2_add_mac()
441 mac->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l2_add_mac()
450 ether_addr_copy(mac->mac_addr, ha->addr); in qeth_l2_add_mac()
451 mac->disp_flag = QETH_DISP_ADDR_ADD; in qeth_l2_add_mac()
453 hash_add(card->rx_mode_addrs, &mac->hnode, mac_hash); in qeth_l2_add_mac()
460 struct net_device *dev = card->dev; 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()
477 switch (mac->disp_flag) { in qeth_l2_rx_mode_work()
479 qeth_l2_remove_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
480 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
484 rc = qeth_l2_write_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
486 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
493 mac->disp_flag = QETH_DISP_ADDR_DELETE; in qeth_l2_rx_mode_work()
503 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit()
509 qdisc_skb_cb(skb)->pkt_len = skb->len; in qeth_l2_hard_start_xmit()
512 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
533 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode()
535 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
539 * qeth_l2_pnso() - perform network subchannel operation
542 * @cnc: Boolean Change-Notification Control
548 * callback function for every entry in the list. If "change-notification-
565 return -ENOMEM; in qeth_l2_pnso()
569 rc = ccw_device_pnso(ddev, rr, oc, rr->naihdr.resume_token, in qeth_l2_pnso()
576 size = rr->naihdr.naids; in qeth_l2_pnso()
582 elems = (rr->response.length - sizeof(struct chsc_header) - in qeth_l2_pnso()
585 if (!isfirstblock && (rr->naihdr.instance != prev_instance)) { in qeth_l2_pnso()
588 rc = -EAGAIN; in qeth_l2_pnso()
592 prev_instance = rr->naihdr.instance; in qeth_l2_pnso()
594 (*cb)(priv, &rr->entries[i]); in qeth_l2_pnso()
595 } while ((rc == -EBUSY) || (!rc && /* list stored */ in qeth_l2_pnso()
596 /* resume token is non-zero => list incomplete */ in qeth_l2_pnso()
597 (rr->naihdr.resume_token.t1 || rr->naihdr.resume_token.t2))); in qeth_l2_pnso()
600 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
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()
618 * qeth_l2_dev2br_fdb_notify() - update fdb of master bridge
621 * 1 - removal of an object
622 * 0 - addition of an object
624 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC
636 ether_addr_copy(ntfy_mac, addr_lnid->mac); in qeth_l2_dev2br_fdb_notify()
640 /* Ignore mcast entries */ in qeth_l2_dev2br_fdb_notify()
655 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
661 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
674 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_l2_dev2br_an_set_cb()
677 (struct net_if_token *)&entry->nit, in qeth_l2_dev2br_an_set_cb()
678 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_l2_dev2br_an_set_cb()
682 * qeth_l2_dev2br_an_set() -
687 * Returns negative errno-compatible error indication or 0 on success.
700 if (rc == -EAGAIN) in qeth_l2_dev2br_an_set()
702 * addresses reported -> disable address notification in qeth_l2_dev2br_an_set()
733 (priv->brport_features & BR_LEARNING_SYNC) && in qeth_l2_must_learn()
736 (netdev->netdev_ops == &qeth_l2_iqd_netdev_ops || in qeth_l2_must_learn()
737 netdev->netdev_ops == &qeth_l2_osa_netdev_ops)); in qeth_l2_must_learn()
741 * qeth_l2_br2dev_worker() - update local MACs
753 struct net_device *lsyncdev = br2dev_event_work->lsync_dev; in qeth_l2_br2dev_worker()
754 struct net_device *dstdev = br2dev_event_work->dst_dev; in qeth_l2_br2dev_worker()
755 struct net_device *brdev = br2dev_event_work->br_dev; in qeth_l2_br2dev_worker()
756 unsigned long event = br2dev_event_work->event; in qeth_l2_br2dev_worker()
757 unsigned char *addr = br2dev_event_work->addr; in qeth_l2_br2dev_worker()
758 struct qeth_card *card = lsyncdev->ml_priv; in qeth_l2_br2dev_worker()
776 iter = &brdev->adj_list.lower; in qeth_l2_br2dev_worker()
794 lowerdev->ifindex); in qeth_l2_br2dev_worker()
833 return -ENOMEM; in qeth_l2_br2dev_queue_work()
834 INIT_WORK(&worker_data->work, qeth_l2_br2dev_worker); in qeth_l2_br2dev_queue_work()
835 worker_data->br_dev = brdev; in qeth_l2_br2dev_queue_work()
836 worker_data->lsync_dev = lsyncdev; in qeth_l2_br2dev_queue_work()
837 worker_data->dst_dev = dstdev; in qeth_l2_br2dev_queue_work()
838 worker_data->event = event; in qeth_l2_br2dev_queue_work()
839 ether_addr_copy(worker_data->addr, addr); in qeth_l2_br2dev_queue_work()
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()
872 iter = &brdev->adj_list.lower; in qeth_l2_switchdev_event()
876 card = lowerdev->ml_priv; in qeth_l2_switchdev_event()
880 fdb_info->addr); in qeth_l2_switchdev_event()
933 QETH_DBF_TEXT_(SETUP, 2, "b2d-%04d", in qeth_l2_br2dev_put()
942 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink()
946 if (!priv->brport_hw_features || !netif_device_present(dev) || in qeth_l2_bridge_getlink()
948 return -EOPNOTSUPP; in qeth_l2_bridge_getlink()
951 mode, priv->brport_features, in qeth_l2_bridge_getlink()
952 priv->brport_hw_features, in qeth_l2_bridge_getlink()
961 * qeth_l2_bridge_setlink() - set bridgeport attributes
974 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink()
981 return -ENODEV; in qeth_l2_bridge_setlink()
996 return -EINVAL; in qeth_l2_bridge_setlink()
1000 return -EINVAL; in qeth_l2_bridge_setlink()
1006 return -EINVAL; in qeth_l2_bridge_setlink()
1007 if (!(priv->brport_hw_features & BR_LEARNING_SYNC)) { in qeth_l2_bridge_setlink()
1010 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1015 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1019 if (enable == !!(priv->brport_features & BR_LEARNING_SYNC)) in qeth_l2_bridge_setlink()
1022 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1026 rc = -EBUSY; in qeth_l2_bridge_setlink()
1033 priv->brport_features |= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1040 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1045 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
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()
1098 card->dev->features |= NETIF_F_VLAN_CHALLENGED; 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()
1106 card->dev->features |= NETIF_F_SG; 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()
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()
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()
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()
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()
1135 PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1)); 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()
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()
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()
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()
1166 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
1171 * qeth_l2_detect_dev2br_support() -
1179 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
1187 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1192 priv->brport_hw_features |= BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1194 priv->brport_hw_features &= ~BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1199 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1202 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1203 if (priv->brport_hw_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1206 if (rc == -EAGAIN) { in qeth_l2_enable_brport_features()
1214 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1219 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1222 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1224 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1234 * qeth_bridge_emit_host_event() - bridgeport address change notification
1239 * object, 0 - addition of an object.
1240 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1245 * reported by the hardware, and also when notifications are enabled -
1266 addr_lnid->lnid); in qeth_bridge_emit_host_event()
1271 addr_lnid->mac); in qeth_bridge_emit_host_event()
1275 token->cssid, token->ssid, token->devnum); in qeth_bridge_emit_host_event()
1277 scnprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid); in qeth_bridge_emit_host_event()
1280 token->chpid); in qeth_bridge_emit_host_event()
1283 token->chid); in qeth_bridge_emit_host_event()
1296 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1322 (data->role == QETH_SBP_ROLE_NONE) ? "none" : in qeth_bridge_state_change_worker()
1323 (data->role == QETH_SBP_ROLE_PRIMARY) ? "primary" : in qeth_bridge_state_change_worker()
1324 (data->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" : in qeth_bridge_state_change_worker()
1327 (data->state == QETH_SBP_STATE_INACTIVE) ? "inactive" : in qeth_bridge_state_change_worker()
1328 (data->state == QETH_SBP_STATE_STANDBY) ? "standby" : in qeth_bridge_state_change_worker()
1329 (data->state == QETH_SBP_STATE_ACTIVE) ? "active" : in qeth_bridge_state_change_worker()
1331 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1339 struct qeth_sbp_port_data *qports = &cmd->data.sbp.data.port_data; in qeth_bridge_state_change()
1343 if (qports->num_entries == 0) { in qeth_bridge_state_change()
1347 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridge_state_change()
1348 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1357 INIT_WORK(&data->worker, qeth_bridge_state_change_worker); in qeth_bridge_state_change()
1358 data->card = card; in qeth_bridge_state_change()
1360 data->role = qports->entry[0].role; in qeth_bridge_state_change()
1361 data->state = qports->entry[0].state; in qeth_bridge_state_change()
1363 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1382 card = data->card; in qeth_l2_dev2br_worker()
1383 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1387 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1390 if (data->ac_event.lost_event_mask) { in qeth_l2_dev2br_worker()
1391 /* Potential re-config in progress, try again later: */ 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()
1414 /* TODO: if we want to retry after -EAGAIN, be 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()
1426 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_dev2br_worker()
1435 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_l2_dev2br_worker()
1437 &data->ac_event.entry[i]; in qeth_l2_dev2br_worker()
1439 entry->change_code, in qeth_l2_dev2br_worker()
1440 &entry->token, in qeth_l2_dev2br_worker()
1441 &entry->addr_lnid); in qeth_l2_dev2br_worker()
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()
1464 if (data->ac_event.lost_event_mask) { in qeth_addr_change_event_worker()
1465 /* Potential re-config in progress, try again later: */ 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()
1475 (data->ac_event.lost_event_mask == 0x01) in qeth_addr_change_event_worker()
1477 : (data->ac_event.lost_event_mask == 0x02) 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()
1487 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_addr_change_event_worker()
1489 &data->ac_event.entry[i]; in qeth_addr_change_event_worker()
1490 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1492 entry->change_code, in qeth_addr_change_event_worker()
1493 &entry->token, in qeth_addr_change_event_worker()
1494 &entry->addr_lnid); in qeth_addr_change_event_worker()
1505 &cmd->data.addrchange; in qeth_addr_change_event()
1509 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1513 if (cmd->hdr.return_code != 0x0000) { in qeth_addr_change_event()
1514 if (cmd->hdr.return_code == 0x0010) { in qeth_addr_change_event()
1515 if (hostevs->lost_event_mask == 0x00) in qeth_addr_change_event()
1516 hostevs->lost_event_mask = 0xff; in qeth_addr_change_event()
1519 cmd->hdr.return_code); in qeth_addr_change_event()
1524 hostevs->num_entries; in qeth_addr_change_event()
1531 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1532 INIT_DELAYED_WORK(&data->dwork, qeth_addr_change_event_worker); in qeth_addr_change_event()
1534 INIT_DELAYED_WORK(&data->dwork, qeth_l2_dev2br_worker); in qeth_addr_change_event()
1535 data->card = card; in qeth_addr_change_event()
1536 data->ac_event = *hostevs; in qeth_addr_change_event()
1537 memcpy(data->ac_event.entry, hostevs->entry, extrasize); in qeth_addr_change_event()
1538 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1556 struct qeth_ipacmd_setbridgeport *sbp = &cmd->data.sbp; in qeth_bridgeport_makerc()
1557 enum qeth_ipa_sbp_cmd setcmd = sbp->hdr.command_code; in qeth_bridgeport_makerc()
1558 u16 ipa_rc = cmd->hdr.return_code; in qeth_bridgeport_makerc()
1559 u16 sbp_rc = sbp->hdr.return_code; in qeth_bridgeport_makerc()
1573 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1577 rc = -ENODEV; /* maybe not the best code here? */ in qeth_bridgeport_makerc()
1578 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1583 rc = -EPERM; in qeth_bridgeport_makerc()
1584 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1591 rc = -EEXIST; in qeth_bridgeport_makerc()
1592 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1596 rc = -EBUSY; in qeth_bridgeport_makerc()
1597 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1601 rc = -EIO; in qeth_bridgeport_makerc()
1606 rc = -EBUSY; in qeth_bridgeport_makerc()
1607 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1612 rc = -EEXIST; in qeth_bridgeport_makerc()
1613 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1618 rc = -EBUSY; in qeth_bridgeport_makerc()
1619 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1624 rc = -EACCES; in qeth_bridgeport_makerc()
1625 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1629 rc = -EIO; in qeth_bridgeport_makerc()
1634 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1637 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1640 rc = -EIO; in qeth_bridgeport_makerc()
1667 hdr = &__ipa_cmd(iob)->data.sbp.hdr; in qeth_sbp_build_cmd()
1668 hdr->cmdlength = sizeof(*hdr) + data_length; in qeth_sbp_build_cmd()
1669 hdr->command_code = sbp_cmd; in qeth_sbp_build_cmd()
1670 hdr->used_total = 1; in qeth_sbp_build_cmd()
1671 hdr->seq_no = 1; in qeth_sbp_build_cmd()
1679 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_support_cb()
1687 cbctl->data.supported = in qeth_bridgeport_query_support_cb()
1688 cmd->data.sbp.data.query_cmds_supp.supported_cmds; in qeth_bridgeport_query_support_cb()
1693 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1697 * strucutre: card->options.sbp.supported_funcs.
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()
1723 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_ports_cb()
1732 qports = &cmd->data.sbp.data.port_data; in qeth_bridgeport_query_ports_cb()
1733 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridgeport_query_ports_cb()
1734 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1735 return -EINVAL; in qeth_bridgeport_query_ports_cb()
1738 if (qports->num_entries > 0) { in qeth_bridgeport_query_ports_cb()
1739 if (cbctl->data.qports.role) in qeth_bridgeport_query_ports_cb()
1740 *cbctl->data.qports.role = qports->entry[0].role; in qeth_bridgeport_query_ports_cb()
1741 if (cbctl->data.qports.state) in qeth_bridgeport_query_ports_cb()
1742 *cbctl->data.qports.state = qports->entry[0].state; in qeth_bridgeport_query_ports_cb()
1748 * qeth_bridgeport_query_ports() - query local bridgeport status.
1750 * @role: Role of the port: 0-none, 1-primary, 2-secondary.
1751 * @state: State of the port: 0-inactive, 1-standby, 2-active.
1753 * Returns negative errno-compatible error indication or 0 on success.
1771 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1772 return -EOPNOTSUPP; in qeth_bridgeport_query_ports()
1775 return -ENOMEM; in qeth_bridgeport_query_ports()
1791 * qeth_bridgeport_setrole() - Assign primary role to the port.
1795 * Returns negative errno-compatible error indication or 0 on success.
1816 return -EINVAL; in qeth_bridgeport_setrole()
1818 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1819 return -EOPNOTSUPP; in qeth_bridgeport_setrole()
1822 return -ENOMEM; in qeth_bridgeport_setrole()
1834 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_bridgeport_an_set_cb()
1837 (struct net_if_token *)&entry->nit, in qeth_bridgeport_an_set_cb()
1838 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_bridgeport_an_set_cb()
1842 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1844 * @enable: 0 - disable, non-zero - enable notifications
1846 * Returns negative errno-compatible error indication or 0 on success.
1855 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1856 return -EOPNOTSUPP; in qeth_bridgeport_an_set()
1884 rc = -EOPNOTSUPP; in qeth_l2_vnicc_makerc()
1887 rc = -EALREADY; in qeth_l2_vnicc_makerc()
1890 rc = -EBUSY; in qeth_l2_vnicc_makerc()
1893 rc = -ENOSPC; in qeth_l2_vnicc_makerc()
1896 rc = -EACCES; in qeth_l2_vnicc_makerc()
1899 rc = -EIO; in qeth_l2_vnicc_makerc()
1912 struct qeth_ipacmd_vnicc *rep = &cmd->data.vnicc; in qeth_l2_vnicc_request_cb()
1913 u32 sub_cmd = cmd->data.vnicc.hdr.sub_command; in qeth_l2_vnicc_request_cb()
1916 if (cmd->hdr.return_code) 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()
1923 *(u32 *)reply->param = rep->data.query_cmds.sup_cmds; in qeth_l2_vnicc_request_cb()
1925 *(u32 *)reply->param = rep->data.getset_timeout.timeout; in qeth_l2_vnicc_request_cb()
1943 hdr = &__ipa_cmd(iob)->data.vnicc.hdr; in qeth_l2_vnicc_build_cmd()
1944 hdr->data_length = sizeof(*hdr) + data_length; in qeth_l2_vnicc_build_cmd()
1945 hdr->sub_command = vnicc_cmd; in qeth_l2_vnicc_build_cmd()
1957 return -ENOMEM; in qeth_l2_vnicc_query_chars()
1972 return -ENOMEM; in qeth_l2_vnicc_query_cmds()
1974 __ipa_cmd(iob)->data.vnicc.data.query_cmds.vnic_char = vnic_char; in qeth_l2_vnicc_query_cmds()
1988 return -ENOMEM; in qeth_l2_vnicc_set_char()
1990 __ipa_cmd(iob)->data.vnicc.data.set_char.vnic_char = vnic_char; in qeth_l2_vnicc_set_char()
2006 return -ENOMEM; in qeth_l2_vnicc_getset_timeout()
2008 getset_timeout = &__ipa_cmd(iob)->data.vnicc.data.getset_timeout; in qeth_l2_vnicc_getset_timeout()
2009 getset_timeout->vnic_char = vnicc; in qeth_l2_vnicc_getset_timeout()
2012 getset_timeout->timeout = *timeout; in qeth_l2_vnicc_getset_timeout()
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()
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()
2041 return -EOPNOTSUPP; in qeth_l2_vnicc_set_state()
2044 return -EBUSY; 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()
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()
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()
2078 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
2092 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
2093 return -EOPNOTSUPP; in qeth_l2_vnicc_get_state()
2096 return -EBUSY; in qeth_l2_vnicc_get_state()
2102 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
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()
2118 return -EOPNOTSUPP; in qeth_l2_vnicc_set_timeout()
2121 return -EBUSY; in qeth_l2_vnicc_set_timeout()
2124 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2129 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2137 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_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()
2154 return -EOPNOTSUPP; in qeth_l2_vnicc_get_timeout()
2157 return -EBUSY; in qeth_l2_vnicc_get_timeout()
2160 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2172 if (!card->options.vnicc.sup_chars) 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()
2186 * qeth_bridgeport_allowed - are any qeth_bridgeport functions allowed?
2194 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2197 !(priv->brport_features & BR_LEARNING_SYNC)); in qeth_bridgeport_allowed()
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()
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()
2215 /* (re-)initialize VNICC */
2218 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2226 card->options.vnicc.rx_bcast_enabled = 0; 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()
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()
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()
2271 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
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()
2290 .groups = qeth_l2_attr_groups,
2295 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_probe_device()
2299 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2301 if (gdev->dev.type) { in qeth_l2_probe_device()
2302 rc = device_add_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_probe_device()
2306 gdev->dev.type = &qeth_l2_devtype; 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()
2318 if (gdev->dev.type != &qeth_l2_devtype) in qeth_l2_remove_device()
2319 device_remove_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_remove_device()
2322 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2324 if (gdev->state == CCWGROUP_ONLINE) 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()
2329 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_remove_device()
2334 unregister_netdev(card->dev); in qeth_l2_remove_device()
2340 struct net_device *dev = card->dev; in qeth_l2_set_online()
2345 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2347 if (card->options.sbp.supported_funcs) { 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()
2364 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2368 if (dev->reg_state != NETREG_REGISTERED) { in qeth_l2_set_online()
2395 napi_schedule(&card->napi); in qeth_l2_set_online()
2396 /* kick-start the NAPI softirq: */ in qeth_l2_set_online()
2407 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2413 struct qeth_priv *priv = netdev_priv(card->dev); 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()
2422 if (priv->brport_features & BR_LEARNING_SYNC) in qeth_l2_set_offline()
2430 switch (cmd->hdr.command) { in qeth_l2_control_event()
2433 if (cmd->data.sbp.hdr.command_code == in qeth_l2_control_event()