Lines Matching +full:spurious +full:- +full:oc

1 // SPDX-License-Identifier: GPL-2.0
42 rc = -EOPNOTSUPP; in qeth_l2_setdelmac_makerc()
45 rc = -ENOSPC; in qeth_l2_setdelmac_makerc()
49 rc = -EADDRINUSE; in qeth_l2_setdelmac_makerc()
53 rc = -EADDRNOTAVAIL; in qeth_l2_setdelmac_makerc()
56 rc = -ENOENT; in qeth_l2_setdelmac_makerc()
59 rc = -EIO; in qeth_l2_setdelmac_makerc()
71 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
84 return -ENOMEM; in qeth_l2_send_setdelmac()
86 cmd->data.setdelmac.mac_length = ETH_ALEN; in qeth_l2_send_setdelmac()
87 ether_addr_copy(cmd->data.setdelmac.mac, mac); in qeth_l2_send_setdelmac()
98 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
102 case -EADDRINUSE: in qeth_l2_send_setmac()
103 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
106 case -EADDRNOTAVAIL: in qeth_l2_send_setmac()
107 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
123 if (rc == -EADDRINUSE) in qeth_l2_write_mac()
152 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
153 hash_del(&mac->hnode); in qeth_l2_drain_rx_mode_cache()
165 hdr->hdr.l2.pkt_length = data_len; in qeth_l2_fill_header()
168 hdr->hdr.l2.id = QETH_HEADER_TYPE_L2_TSO; in qeth_l2_fill_header()
170 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2; in qeth_l2_fill_header()
171 if (skb->ip_summed == CHECKSUM_PARTIAL) in qeth_l2_fill_header()
172 qeth_tx_csum(skb, &hdr->hdr.l2.flags[1], proto); in qeth_l2_fill_header()
177 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; in qeth_l2_fill_header()
179 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; in qeth_l2_fill_header()
181 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; in qeth_l2_fill_header()
186 if (veth->h_vlan_proto == htons(ETH_P_8021Q)) { in qeth_l2_fill_header()
187 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN; in qeth_l2_fill_header()
188 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI); in qeth_l2_fill_header()
201 return -EINVAL; in qeth_l2_setdelvlan_makerc()
203 return -EEXIST; in qeth_l2_setdelvlan_makerc()
205 return -ENOENT; in qeth_l2_setdelvlan_makerc()
207 return -EPERM; in qeth_l2_setdelvlan_makerc()
209 return -EIO; in qeth_l2_setdelvlan_makerc()
220 if (cmd->hdr.return_code) { in qeth_l2_send_setdelvlan_cb()
222 cmd->data.setdelvlan.vlan_id, in qeth_l2_send_setdelvlan_cb()
223 CARD_DEVID(card), cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
224 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); in qeth_l2_send_setdelvlan_cb()
226 return qeth_l2_setdelvlan_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelvlan_cb()
239 return -ENOMEM; in qeth_l2_send_setdelvlan()
241 cmd->data.setdelvlan.vlan_id = i; in qeth_l2_send_setdelvlan()
248 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid()
260 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid()
273 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
277 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
293 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
323 return (rc) ? rc : -EADDRNOTAVAIL; in qeth_l2_request_initial_mac()
324 eth_hw_addr_random(card->dev); in qeth_l2_request_initial_mac()
327 QETH_CARD_HEX(card, 2, card->dev->dev_addr, card->dev->addr_len); in qeth_l2_request_initial_mac()
333 if (!is_valid_ether_addr(card->dev->dev_addr)) in qeth_l2_register_dev_addr()
336 if (!qeth_l2_send_setmac(card, card->dev->dev_addr)) in qeth_l2_register_dev_addr()
337 card->info.dev_addr_is_registered = 1; in qeth_l2_register_dev_addr()
339 card->info.dev_addr_is_registered = 0; in qeth_l2_register_dev_addr()
344 struct qeth_card *card = dev->ml_priv; in qeth_l2_validate_addr()
346 if (card->info.dev_addr_is_registered) in qeth_l2_validate_addr()
350 return -EPERM; in qeth_l2_validate_addr()
356 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_mac_address()
364 return -EOPNOTSUPP; in qeth_l2_set_mac_address()
366 QETH_CARD_HEX(card, 3, addr->sa_data, ETH_ALEN); in qeth_l2_set_mac_address()
367 if (!is_valid_ether_addr(addr->sa_data)) in qeth_l2_set_mac_address()
368 return -EADDRNOTAVAIL; in qeth_l2_set_mac_address()
371 if (ether_addr_equal_64bits(dev->dev_addr, addr->sa_data) && in qeth_l2_set_mac_address()
372 card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
376 rc = qeth_l2_send_setmac(card, addr->sa_data); in qeth_l2_set_mac_address()
379 ether_addr_copy(old_addr, dev->dev_addr); in qeth_l2_set_mac_address()
380 ether_addr_copy(dev->dev_addr, addr->sa_data); in qeth_l2_set_mac_address()
382 if (card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
384 card->info.dev_addr_is_registered = 1; in qeth_l2_set_mac_address()
396 if (card->options.sbp.reflect_promisc_primary) in qeth_l2_promisc_to_bridge()
404 QETH_CARD_TEXT_(card, 2, "bpm%c%04x", enable ? '+' : '-', rc); in qeth_l2_promisc_to_bridge()
406 card->options.sbp.role = role; in qeth_l2_promisc_to_bridge()
407 card->info.promisc_mode = enable; in qeth_l2_promisc_to_bridge()
413 bool enable = card->dev->flags & IFF_PROMISC; in qeth_l2_set_promisc_mode()
415 if (card->info.promisc_mode == enable) in qeth_l2_set_promisc_mode()
421 mutex_lock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
422 if (card->options.sbp.reflect_promisc) in qeth_l2_set_promisc_mode()
424 mutex_unlock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
434 u32 mac_hash = get_unaligned((u32 *)(&ha->addr[2])); in qeth_l2_add_mac()
437 hash_for_each_possible(card->rx_mode_addrs, mac, hnode, mac_hash) { in qeth_l2_add_mac()
438 if (ether_addr_equal_64bits(ha->addr, mac->mac_addr)) { in qeth_l2_add_mac()
439 mac->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l2_add_mac()
448 ether_addr_copy(mac->mac_addr, ha->addr); in qeth_l2_add_mac()
449 mac->disp_flag = QETH_DISP_ADDR_ADD; in qeth_l2_add_mac()
451 hash_add(card->rx_mode_addrs, &mac->hnode, mac_hash); in qeth_l2_add_mac()
458 struct net_device *dev = card->dev; in qeth_l2_rx_mode_work()
474 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_rx_mode_work()
475 switch (mac->disp_flag) { in qeth_l2_rx_mode_work()
477 qeth_l2_remove_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
478 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
482 rc = qeth_l2_write_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
484 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
491 mac->disp_flag = QETH_DISP_ADDR_DELETE; in qeth_l2_rx_mode_work()
501 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit()
507 qdisc_skb_cb(skb)->pkt_len = skb->len; in qeth_l2_hard_start_xmit()
510 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
525 struct qeth_card *card = dev->ml_priv; in qeth_l2_select_queue()
539 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode()
541 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
545 * qeth_l2_pnso() - perform network subchannel operation
547 * @oc: Operation Code
548 * @cnc: Boolean Change-Notification Control
554 * callback function for every entry in the list. If "change-notification-
558 static int qeth_l2_pnso(struct qeth_card *card, u8 oc, int cnc, in qeth_l2_pnso() argument
571 return -ENOMEM; in qeth_l2_pnso()
575 rc = ccw_device_pnso(ddev, rr, oc, rr->naihdr.resume_token, in qeth_l2_pnso()
582 size = rr->naihdr.naids; in qeth_l2_pnso()
588 elems = (rr->response.length - sizeof(struct chsc_header) - in qeth_l2_pnso()
591 if (!isfirstblock && (rr->naihdr.instance != prev_instance)) { in qeth_l2_pnso()
594 rc = -EAGAIN; in qeth_l2_pnso()
598 prev_instance = rr->naihdr.instance; in qeth_l2_pnso()
600 (*cb)(priv, &rr->entries[i]); in qeth_l2_pnso()
601 } while ((rc == -EBUSY) || (!rc && /* list stored */ in qeth_l2_pnso()
602 /* resume token is non-zero => list incomplete */ in qeth_l2_pnso()
603 (rr->naihdr.resume_token.t1 || rr->naihdr.resume_token.t2))); in qeth_l2_pnso()
606 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
615 return ((card->info.ddev_devno == token->devnum) && in qeth_is_my_net_if_token()
616 (card->info.cssid == token->cssid) && in qeth_is_my_net_if_token()
617 (card->info.iid == token->iid) && in qeth_is_my_net_if_token()
618 (card->info.ssid == token->ssid) && in qeth_is_my_net_if_token()
619 (card->info.chpid == token->chpid) && in qeth_is_my_net_if_token()
620 (card->info.chid == token->chid)); in qeth_is_my_net_if_token()
624 * qeth_l2_dev2br_fdb_notify() - update fdb of master bridge
627 * 1 - removal of an object
628 * 0 - addition of an object
630 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC
642 ether_addr_copy(ntfy_mac, addr_lnid->mac); in qeth_l2_dev2br_fdb_notify()
661 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
667 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
680 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_l2_dev2br_an_set_cb()
683 (struct net_if_token *)&entry->nit, in qeth_l2_dev2br_an_set_cb()
684 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_l2_dev2br_an_set_cb()
688 * qeth_l2_dev2br_an_set() -
693 * Returns negative errno-compatible error indication or 0 on success.
706 if (rc == -EAGAIN) in qeth_l2_dev2br_an_set()
708 * addresses reported -> disable address notification in qeth_l2_dev2br_an_set()
738 (priv->brport_features & BR_LEARNING_SYNC) && in qeth_l2_must_learn()
741 netdev->netdev_ops == &qeth_l2_netdev_ops); in qeth_l2_must_learn()
745 * qeth_l2_br2dev_worker() - update local MACs
757 struct net_device *lsyncdev = br2dev_event_work->lsync_dev; in qeth_l2_br2dev_worker()
758 struct net_device *dstdev = br2dev_event_work->dst_dev; in qeth_l2_br2dev_worker()
759 struct net_device *brdev = br2dev_event_work->br_dev; in qeth_l2_br2dev_worker()
760 unsigned long event = br2dev_event_work->event; in qeth_l2_br2dev_worker()
761 unsigned char *addr = br2dev_event_work->addr; in qeth_l2_br2dev_worker()
762 struct qeth_card *card = lsyncdev->ml_priv; in qeth_l2_br2dev_worker()
781 iter = &brdev->adj_list.lower; in qeth_l2_br2dev_worker()
799 lowerdev->ifindex); in qeth_l2_br2dev_worker()
837 return -ENOMEM; in qeth_l2_br2dev_queue_work()
838 INIT_WORK(&worker_data->work, qeth_l2_br2dev_worker); in qeth_l2_br2dev_queue_work()
839 worker_data->br_dev = brdev; in qeth_l2_br2dev_queue_work()
840 worker_data->lsync_dev = lsyncdev; in qeth_l2_br2dev_queue_work()
841 worker_data->dst_dev = dstdev; in qeth_l2_br2dev_queue_work()
842 worker_data->event = event; in qeth_l2_br2dev_queue_work()
843 ether_addr_copy(worker_data->addr, addr); in qeth_l2_br2dev_queue_work()
845 card = lsyncdev->ml_priv; in qeth_l2_br2dev_queue_work()
850 queue_work(card->event_wq, &worker_data->work); in qeth_l2_br2dev_queue_work()
876 iter = &brdev->adj_list.lower; in qeth_l2_switchdev_event()
880 card = lowerdev->ml_priv; in qeth_l2_switchdev_event()
884 fdb_info->addr); in qeth_l2_switchdev_event()
937 QETH_DBF_TEXT_(SETUP, 2, "b2d-%04d", in qeth_l2_br2dev_put()
946 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink()
950 if (!priv->brport_hw_features || !netif_device_present(dev) || in qeth_l2_bridge_getlink()
952 return -EOPNOTSUPP; in qeth_l2_bridge_getlink()
955 mode, priv->brport_features, in qeth_l2_bridge_getlink()
956 priv->brport_hw_features, in qeth_l2_bridge_getlink()
965 * qeth_l2_bridge_setlink() - set bridgeport attributes
978 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink()
985 return -ENODEV; in qeth_l2_bridge_setlink()
1000 return -EINVAL; in qeth_l2_bridge_setlink()
1004 return -EINVAL; in qeth_l2_bridge_setlink()
1010 return -EINVAL; in qeth_l2_bridge_setlink()
1011 if (!(priv->brport_hw_features & BR_LEARNING_SYNC)) { in qeth_l2_bridge_setlink()
1014 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1019 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1023 if (enable == !!(priv->brport_features & BR_LEARNING_SYNC)) in qeth_l2_bridge_setlink()
1026 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1030 rc = -EBUSY; in qeth_l2_bridge_setlink()
1037 priv->brport_features |= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1044 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1049 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1077 card->dev->needed_headroom = sizeof(struct qeth_hdr); in qeth_l2_setup_netdev()
1078 card->dev->netdev_ops = &qeth_l2_netdev_ops; in qeth_l2_setup_netdev()
1079 card->dev->priv_flags |= IFF_UNICAST_FLT; in qeth_l2_setup_netdev()
1082 card->dev->features |= NETIF_F_VLAN_CHALLENGED; in qeth_l2_setup_netdev()
1085 card->dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1086 card->dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; in qeth_l2_setup_netdev()
1090 card->dev->features |= NETIF_F_SG; in qeth_l2_setup_netdev()
1093 card->dev->hw_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1094 card->dev->vlan_features |= NETIF_F_IP_CSUM; in qeth_l2_setup_netdev()
1098 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1099 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l2_setup_netdev()
1103 card->dev->hw_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1104 card->dev->vlan_features |= NETIF_F_RXCSUM; in qeth_l2_setup_netdev()
1107 card->dev->hw_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1108 card->dev->vlan_features |= NETIF_F_TSO; in qeth_l2_setup_netdev()
1111 card->dev->hw_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1112 card->dev->vlan_features |= NETIF_F_TSO6; in qeth_l2_setup_netdev()
1115 if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) { in qeth_l2_setup_netdev()
1116 card->dev->needed_headroom = sizeof(struct qeth_hdr_tso); in qeth_l2_setup_netdev()
1117 netif_keep_dst(card->dev); in qeth_l2_setup_netdev()
1118 netif_set_gso_max_size(card->dev, in qeth_l2_setup_netdev()
1119 PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1)); in qeth_l2_setup_netdev()
1122 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); in qeth_l2_setup_netdev()
1123 return register_netdev(card->dev); in qeth_l2_setup_netdev()
1130 QETH_CARD_HEX(card, 2, &card->options.sbp.supported_funcs, in qeth_l2_trace_features()
1131 sizeof(card->options.sbp.supported_funcs)); in qeth_l2_trace_features()
1134 QETH_CARD_HEX(card, 2, &card->options.vnicc.sup_chars, in qeth_l2_trace_features()
1135 sizeof(card->options.vnicc.sup_chars)); in qeth_l2_trace_features()
1140 if (!card->options.sbp.reflect_promisc && in qeth_l2_setup_bridgeport_attrs()
1141 card->options.sbp.role != QETH_SBP_ROLE_NONE) { in qeth_l2_setup_bridgeport_attrs()
1142 /* Conditional to avoid spurious error messages */ in qeth_l2_setup_bridgeport_attrs()
1143 qeth_bridgeport_setrole(card, card->options.sbp.role); in qeth_l2_setup_bridgeport_attrs()
1145 qeth_bridgeport_query_ports(card, &card->options.sbp.role, in qeth_l2_setup_bridgeport_attrs()
1148 if (card->options.sbp.hostnotification) { in qeth_l2_setup_bridgeport_attrs()
1150 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
1155 * qeth_l2_detect_dev2br_support() -
1163 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
1171 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1176 priv->brport_hw_features |= BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1178 priv->brport_hw_features &= ~BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1183 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1186 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1187 if (priv->brport_hw_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1190 if (rc == -EAGAIN) { in qeth_l2_enable_brport_features()
1198 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1203 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1206 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1208 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1218 * qeth_bridge_emit_host_event() - bridgeport address change notification
1223 * object, 0 - addition of an object.
1224 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1229 * reported by the hardware, and also when notifications are enabled -
1250 addr_lnid->lnid); in qeth_bridge_emit_host_event()
1255 addr_lnid->mac); in qeth_bridge_emit_host_event()
1259 token->cssid, token->ssid, token->devnum); in qeth_bridge_emit_host_event()
1261 snprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid); in qeth_bridge_emit_host_event()
1264 token->chpid); in qeth_bridge_emit_host_event()
1266 snprintf(str[i], sizeof(str[i]), "NTOK_CHID=%04x", token->chid); in qeth_bridge_emit_host_event()
1279 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1305 (data->role == QETH_SBP_ROLE_NONE) ? "none" : in qeth_bridge_state_change_worker()
1306 (data->role == QETH_SBP_ROLE_PRIMARY) ? "primary" : in qeth_bridge_state_change_worker()
1307 (data->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" : in qeth_bridge_state_change_worker()
1310 (data->state == QETH_SBP_STATE_INACTIVE) ? "inactive" : in qeth_bridge_state_change_worker()
1311 (data->state == QETH_SBP_STATE_STANDBY) ? "standby" : in qeth_bridge_state_change_worker()
1312 (data->state == QETH_SBP_STATE_ACTIVE) ? "active" : in qeth_bridge_state_change_worker()
1314 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1322 struct qeth_sbp_port_data *qports = &cmd->data.sbp.data.port_data; in qeth_bridge_state_change()
1326 if (qports->num_entries == 0) { in qeth_bridge_state_change()
1330 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridge_state_change()
1331 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1340 INIT_WORK(&data->worker, qeth_bridge_state_change_worker); in qeth_bridge_state_change()
1341 data->card = card; in qeth_bridge_state_change()
1343 data->role = qports->entry[0].role; in qeth_bridge_state_change()
1344 data->state = qports->entry[0].state; in qeth_bridge_state_change()
1346 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1365 card = data->card; in qeth_l2_dev2br_worker()
1366 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1370 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1373 if (data->ac_event.lost_event_mask) { in qeth_l2_dev2br_worker()
1374 /* Potential re-config in progress, try again later: */ in qeth_l2_dev2br_worker()
1376 queue_delayed_work(card->event_wq, dwork, in qeth_l2_dev2br_worker()
1381 if (!netif_device_present(card->dev)) { in qeth_l2_dev2br_worker()
1397 /* TODO: if we want to retry after -EAGAIN, be in qeth_l2_dev2br_worker()
1402 netdev_err(card->dev, in qeth_l2_dev2br_worker()
1405 WRITE_ONCE(card->info.pnso_mode, in qeth_l2_dev2br_worker()
1409 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_dev2br_worker()
1418 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_l2_dev2br_worker()
1420 &data->ac_event.entry[i]; in qeth_l2_dev2br_worker()
1422 entry->change_code, in qeth_l2_dev2br_worker()
1423 &entry->token, in qeth_l2_dev2br_worker()
1424 &entry->addr_lnid); in qeth_l2_dev2br_worker()
1440 card = data->card; in qeth_addr_change_event_worker()
1442 QETH_CARD_TEXT(data->card, 4, "adrchgew"); in qeth_addr_change_event_worker()
1444 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_addr_change_event_worker()
1447 if (data->ac_event.lost_event_mask) { in qeth_addr_change_event_worker()
1448 /* Potential re-config in progress, try again later: */ in qeth_addr_change_event_worker()
1449 if (!mutex_trylock(&card->sbp_lock)) { in qeth_addr_change_event_worker()
1450 queue_delayed_work(card->event_wq, dwork, in qeth_addr_change_event_worker()
1455 dev_info(&data->card->gdev->dev, in qeth_addr_change_event_worker()
1457 netdev_name(card->dev), in qeth_addr_change_event_worker()
1458 (data->ac_event.lost_event_mask == 0x01) in qeth_addr_change_event_worker()
1460 : (data->ac_event.lost_event_mask == 0x02) in qeth_addr_change_event_worker()
1464 data->card->options.sbp.hostnotification = 0; in qeth_addr_change_event_worker()
1465 card->info.pnso_mode = QETH_PNSO_NONE; in qeth_addr_change_event_worker()
1466 mutex_unlock(&data->card->sbp_lock); in qeth_addr_change_event_worker()
1467 qeth_bridge_emit_host_event(data->card, anev_abort, in qeth_addr_change_event_worker()
1470 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_addr_change_event_worker()
1472 &data->ac_event.entry[i]; in qeth_addr_change_event_worker()
1473 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1475 entry->change_code, in qeth_addr_change_event_worker()
1476 &entry->token, in qeth_addr_change_event_worker()
1477 &entry->addr_lnid); in qeth_addr_change_event_worker()
1488 &cmd->data.addrchange; in qeth_addr_change_event()
1492 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1496 if (cmd->hdr.return_code != 0x0000) { in qeth_addr_change_event()
1497 if (cmd->hdr.return_code == 0x0010) { in qeth_addr_change_event()
1498 if (hostevs->lost_event_mask == 0x00) in qeth_addr_change_event()
1499 hostevs->lost_event_mask = 0xff; in qeth_addr_change_event()
1502 cmd->hdr.return_code); in qeth_addr_change_event()
1507 hostevs->num_entries; in qeth_addr_change_event()
1514 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1515 INIT_DELAYED_WORK(&data->dwork, qeth_addr_change_event_worker); in qeth_addr_change_event()
1517 INIT_DELAYED_WORK(&data->dwork, qeth_l2_dev2br_worker); in qeth_addr_change_event()
1518 data->card = card; in qeth_addr_change_event()
1519 memcpy(&data->ac_event, hostevs, in qeth_addr_change_event()
1521 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1539 struct qeth_ipacmd_setbridgeport *sbp = &cmd->data.sbp; in qeth_bridgeport_makerc()
1540 enum qeth_ipa_sbp_cmd setcmd = sbp->hdr.command_code; in qeth_bridgeport_makerc()
1541 u16 ipa_rc = cmd->hdr.return_code; in qeth_bridgeport_makerc()
1542 u16 sbp_rc = sbp->hdr.return_code; in qeth_bridgeport_makerc()
1556 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1560 rc = -ENODEV; /* maybe not the best code here? */ in qeth_bridgeport_makerc()
1561 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1566 rc = -EPERM; in qeth_bridgeport_makerc()
1567 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1574 rc = -EEXIST; in qeth_bridgeport_makerc()
1575 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1579 rc = -EBUSY; in qeth_bridgeport_makerc()
1580 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1584 rc = -EIO; in qeth_bridgeport_makerc()
1589 rc = -EBUSY; in qeth_bridgeport_makerc()
1590 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1595 rc = -EEXIST; in qeth_bridgeport_makerc()
1596 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1601 rc = -EBUSY; in qeth_bridgeport_makerc()
1602 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1607 rc = -EACCES; in qeth_bridgeport_makerc()
1608 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1612 rc = -EIO; in qeth_bridgeport_makerc()
1617 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1620 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1623 rc = -EIO; in qeth_bridgeport_makerc()
1650 hdr = &__ipa_cmd(iob)->data.sbp.hdr; in qeth_sbp_build_cmd()
1651 hdr->cmdlength = sizeof(*hdr) + data_length; in qeth_sbp_build_cmd()
1652 hdr->command_code = sbp_cmd; in qeth_sbp_build_cmd()
1653 hdr->used_total = 1; in qeth_sbp_build_cmd()
1654 hdr->seq_no = 1; in qeth_sbp_build_cmd()
1662 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_support_cb()
1670 cbctl->data.supported = in qeth_bridgeport_query_support_cb()
1671 cmd->data.sbp.data.query_cmds_supp.supported_cmds; in qeth_bridgeport_query_support_cb()
1676 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1680 * strucutre: card->options.sbp.supported_funcs.
1695 card->options.sbp.role = QETH_SBP_ROLE_NONE; in qeth_bridgeport_query_support()
1696 card->options.sbp.supported_funcs = 0; in qeth_bridgeport_query_support()
1699 card->options.sbp.supported_funcs = cbctl.data.supported; in qeth_bridgeport_query_support()
1706 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_ports_cb()
1715 qports = &cmd->data.sbp.data.port_data; in qeth_bridgeport_query_ports_cb()
1716 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridgeport_query_ports_cb()
1717 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1718 return -EINVAL; in qeth_bridgeport_query_ports_cb()
1721 if (qports->num_entries > 0) { in qeth_bridgeport_query_ports_cb()
1722 if (cbctl->data.qports.role) in qeth_bridgeport_query_ports_cb()
1723 *cbctl->data.qports.role = qports->entry[0].role; in qeth_bridgeport_query_ports_cb()
1724 if (cbctl->data.qports.state) in qeth_bridgeport_query_ports_cb()
1725 *cbctl->data.qports.state = qports->entry[0].state; in qeth_bridgeport_query_ports_cb()
1731 * qeth_bridgeport_query_ports() - query local bridgeport status.
1733 * @role: Role of the port: 0-none, 1-primary, 2-secondary.
1734 * @state: State of the port: 0-inactive, 1-standby, 2-active.
1736 * Returns negative errno-compatible error indication or 0 on success.
1754 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1755 return -EOPNOTSUPP; in qeth_bridgeport_query_ports()
1758 return -ENOMEM; in qeth_bridgeport_query_ports()
1774 * qeth_bridgeport_setrole() - Assign primary role to the port.
1778 * Returns negative errno-compatible error indication or 0 on success.
1799 return -EINVAL; in qeth_bridgeport_setrole()
1801 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1802 return -EOPNOTSUPP; in qeth_bridgeport_setrole()
1805 return -ENOMEM; in qeth_bridgeport_setrole()
1817 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_bridgeport_an_set_cb()
1820 (struct net_if_token *)&entry->nit, in qeth_bridgeport_an_set_cb()
1821 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_bridgeport_an_set_cb()
1825 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1827 * @enable: 0 - disable, non-zero - enable notifications
1829 * Returns negative errno-compatible error indication or 0 on success.
1838 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1839 return -EOPNOTSUPP; in qeth_bridgeport_an_set()
1867 rc = -EOPNOTSUPP; in qeth_l2_vnicc_makerc()
1870 rc = -EALREADY; in qeth_l2_vnicc_makerc()
1873 rc = -EBUSY; in qeth_l2_vnicc_makerc()
1876 rc = -ENOSPC; in qeth_l2_vnicc_makerc()
1879 rc = -EACCES; in qeth_l2_vnicc_makerc()
1882 rc = -EIO; in qeth_l2_vnicc_makerc()
1895 struct qeth_ipacmd_vnicc *rep = &cmd->data.vnicc; in qeth_l2_vnicc_request_cb()
1896 u32 sub_cmd = cmd->data.vnicc.hdr.sub_command; in qeth_l2_vnicc_request_cb()
1899 if (cmd->hdr.return_code) in qeth_l2_vnicc_request_cb()
1900 return qeth_l2_vnicc_makerc(card, cmd->hdr.return_code); in qeth_l2_vnicc_request_cb()
1902 card->options.vnicc.sup_chars = rep->vnicc_cmds.supported; in qeth_l2_vnicc_request_cb()
1903 card->options.vnicc.cur_chars = rep->vnicc_cmds.enabled; in qeth_l2_vnicc_request_cb()
1906 *(u32 *)reply->param = rep->data.query_cmds.sup_cmds; in qeth_l2_vnicc_request_cb()
1908 *(u32 *)reply->param = rep->data.getset_timeout.timeout; in qeth_l2_vnicc_request_cb()
1926 hdr = &__ipa_cmd(iob)->data.vnicc.hdr; in qeth_l2_vnicc_build_cmd()
1927 hdr->data_length = sizeof(*hdr) + data_length; in qeth_l2_vnicc_build_cmd()
1928 hdr->sub_command = vnicc_cmd; in qeth_l2_vnicc_build_cmd()
1940 return -ENOMEM; in qeth_l2_vnicc_query_chars()
1955 return -ENOMEM; in qeth_l2_vnicc_query_cmds()
1957 __ipa_cmd(iob)->data.vnicc.data.query_cmds.vnic_char = vnic_char; in qeth_l2_vnicc_query_cmds()
1971 return -ENOMEM; in qeth_l2_vnicc_set_char()
1973 __ipa_cmd(iob)->data.vnicc.data.set_char.vnic_char = vnic_char; in qeth_l2_vnicc_set_char()
1989 return -ENOMEM; in qeth_l2_vnicc_getset_timeout()
1991 getset_timeout = &__ipa_cmd(iob)->data.vnicc.data.getset_timeout; in qeth_l2_vnicc_getset_timeout()
1992 getset_timeout->vnic_char = vnicc; in qeth_l2_vnicc_getset_timeout()
1995 getset_timeout->timeout = *timeout; in qeth_l2_vnicc_getset_timeout()
2004 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_timeout()
2005 card->options.vnicc.getset_timeout_sup & vnicc && in qeth_l2_vnicc_recover_timeout()
2022 if (!(card->options.vnicc.sup_chars & vnicc) || in qeth_l2_vnicc_set_state()
2023 !(card->options.vnicc.set_char_sup & vnicc)) in qeth_l2_vnicc_set_state()
2024 return -EOPNOTSUPP; in qeth_l2_vnicc_set_state()
2027 return -EBUSY; in qeth_l2_vnicc_set_state()
2032 card->options.vnicc.wanted_chars |= vnicc; in qeth_l2_vnicc_set_state()
2035 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2039 if (card->options.vnicc.cur_chars == card->options.vnicc.wanted_chars) in qeth_l2_vnicc_set_state()
2045 card->options.vnicc.cur_chars |= vnicc; in qeth_l2_vnicc_set_state()
2047 card->options.vnicc.cur_chars &= ~vnicc; in qeth_l2_vnicc_set_state()
2053 card->options.vnicc.wanted_chars = in qeth_l2_vnicc_set_state()
2054 card->options.vnicc.cur_chars; in qeth_l2_vnicc_set_state()
2058 card->options.vnicc.rx_bcast_enabled = true; in qeth_l2_vnicc_set_state()
2061 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
2075 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
2076 return -EOPNOTSUPP; in qeth_l2_vnicc_get_state()
2079 return -EBUSY; in qeth_l2_vnicc_get_state()
2085 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
2099 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_set_timeout()
2100 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_set_timeout()
2101 return -EOPNOTSUPP; in qeth_l2_vnicc_set_timeout()
2104 return -EBUSY; in qeth_l2_vnicc_set_timeout()
2107 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2112 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2120 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2135 if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || in qeth_l2_vnicc_get_timeout()
2136 !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) in qeth_l2_vnicc_get_timeout()
2137 return -EOPNOTSUPP; in qeth_l2_vnicc_get_timeout()
2140 return -EBUSY; in qeth_l2_vnicc_get_timeout()
2143 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2155 if (!card->options.vnicc.sup_chars) in _qeth_l2_vnicc_is_in_use()
2160 if (card->options.vnicc.cur_chars == QETH_VNICC_DEFAULT) { in _qeth_l2_vnicc_is_in_use()
2161 if (!card->options.vnicc.rx_bcast_enabled || in _qeth_l2_vnicc_is_in_use()
2169 * qeth_bridgeport_allowed - are any qeth_bridgeport functions allowed?
2177 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2180 !(priv->brport_features & BR_LEARNING_SYNC)); in qeth_bridgeport_allowed()
2189 if (card->options.vnicc.sup_chars & vnicc && in qeth_l2_vnicc_recover_char()
2190 card->options.vnicc.set_char_sup & vnicc && in qeth_l2_vnicc_recover_char()
2193 card->options.vnicc.wanted_chars &= ~vnicc; in qeth_l2_vnicc_recover_char()
2194 card->options.vnicc.wanted_chars |= QETH_VNICC_DEFAULT & vnicc; in qeth_l2_vnicc_recover_char()
2198 /* (re-)initialize VNICC */
2201 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2209 card->options.vnicc.rx_bcast_enabled = 0; in qeth_l2_vnicc_init()
2212 if (card->options.vnicc.wanted_chars != QETH_VNICC_DEFAULT || in qeth_l2_vnicc_init()
2214 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2216 card->options.vnicc.sup_chars = 0; in qeth_l2_vnicc_init()
2217 card->options.vnicc.cur_chars = 0; in qeth_l2_vnicc_init()
2218 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_init()
2222 chars_tmp = card->options.vnicc.sup_chars; in qeth_l2_vnicc_init()
2223 chars_len = sizeof(card->options.vnicc.sup_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2232 card->options.vnicc.getset_timeout_sup |= vnicc; in qeth_l2_vnicc_init()
2234 card->options.vnicc.getset_timeout_sup &= ~vnicc; in qeth_l2_vnicc_init()
2237 card->options.vnicc.set_char_sup |= vnicc; in qeth_l2_vnicc_init()
2239 card->options.vnicc.set_char_sup &= ~vnicc; in qeth_l2_vnicc_init()
2245 chars_tmp = card->options.vnicc.wanted_chars ^ in qeth_l2_vnicc_init()
2246 card->options.vnicc.cur_chars; in qeth_l2_vnicc_init()
2247 chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; in qeth_l2_vnicc_init()
2250 enable = card->options.vnicc.wanted_chars & vnicc; in qeth_l2_vnicc_init()
2254 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
2261 card->options.vnicc.sup_chars = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2262 card->options.vnicc.cur_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2263 card->options.vnicc.learning_timeout = QETH_VNICC_DEFAULT_TIMEOUT; in qeth_l2_vnicc_set_defaults()
2265 card->options.vnicc.set_char_sup = QETH_VNICC_ALL; in qeth_l2_vnicc_set_defaults()
2266 card->options.vnicc.getset_timeout_sup = QETH_VNICC_LEARNING; in qeth_l2_vnicc_set_defaults()
2268 card->options.vnicc.wanted_chars = QETH_VNICC_DEFAULT; in qeth_l2_vnicc_set_defaults()
2278 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_probe_device()
2282 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2284 if (gdev->dev.type) { in qeth_l2_probe_device()
2285 rc = device_add_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_probe_device()
2289 gdev->dev.type = &qeth_l2_devtype; in qeth_l2_probe_device()
2292 INIT_WORK(&card->rx_mode_work, qeth_l2_rx_mode_work); in qeth_l2_probe_device()
2298 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l2_remove_device()
2301 if (gdev->dev.type != &qeth_l2_devtype) in qeth_l2_remove_device()
2302 device_remove_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_remove_device()
2305 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2307 if (gdev->state == CCWGROUP_ONLINE) in qeth_l2_remove_device()
2308 qeth_set_offline(card, card->discipline, false); in qeth_l2_remove_device()
2310 if (card->dev->reg_state == NETREG_REGISTERED) { in qeth_l2_remove_device()
2311 priv = netdev_priv(card->dev); in qeth_l2_remove_device()
2312 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_remove_device()
2317 unregister_netdev(card->dev); in qeth_l2_remove_device()
2323 struct net_device *dev = card->dev; in qeth_l2_set_online()
2328 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2330 if (card->options.sbp.supported_funcs) { in qeth_l2_set_online()
2332 dev_info(&card->gdev->dev, in qeth_l2_set_online()
2335 mutex_unlock(&card->sbp_lock); in qeth_l2_set_online()
2347 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2351 if (dev->reg_state != NETREG_REGISTERED) { in qeth_l2_set_online()
2376 if (card->info.open_when_online) { in qeth_l2_set_online()
2377 card->info.open_when_online = 0; in qeth_l2_set_online()
2387 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2393 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_set_offline()
2398 if (card->state == CARD_STATE_SOFTSETUP) in qeth_l2_set_offline()
2399 card->state = CARD_STATE_DOWN; in qeth_l2_set_offline()
2402 if (priv->brport_features & BR_LEARNING_SYNC) in qeth_l2_set_offline()
2410 switch (cmd->hdr.command) { in qeth_l2_control_event()
2413 if (cmd->data.sbp.hdr.command_code == in qeth_l2_control_event()