Lines Matching +full:spurious +full:- +full:oc
1 // SPDX-License-Identifier: GPL-2.0
43 rc = -EOPNOTSUPP; in qeth_l2_setdelmac_makerc()
46 rc = -ENOSPC; in qeth_l2_setdelmac_makerc()
50 rc = -EADDRINUSE; in qeth_l2_setdelmac_makerc()
54 rc = -EADDRNOTAVAIL; in qeth_l2_setdelmac_makerc()
57 rc = -ENOENT; in qeth_l2_setdelmac_makerc()
60 rc = -EIO; in qeth_l2_setdelmac_makerc()
72 return qeth_l2_setdelmac_makerc(card, cmd->hdr.return_code); in qeth_l2_send_setdelmac_cb()
85 return -ENOMEM; in qeth_l2_send_setdelmac()
87 cmd->data.setdelmac.mac_length = ETH_ALEN; in qeth_l2_send_setdelmac()
88 ether_addr_copy(cmd->data.setdelmac.mac, mac); in qeth_l2_send_setdelmac()
99 dev_info(&card->gdev->dev, in qeth_l2_send_setmac()
103 case -EADDRINUSE: in qeth_l2_send_setmac()
104 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
107 case -EADDRNOTAVAIL: in qeth_l2_send_setmac()
108 dev_warn(&card->gdev->dev, in qeth_l2_send_setmac()
124 if (rc == -EADDRINUSE) in qeth_l2_write_mac()
153 hash_for_each_safe(card->rx_mode_addrs, i, tmp, mac, hnode) { in qeth_l2_drain_rx_mode_cache()
154 hash_del(&mac->hnode); in qeth_l2_drain_rx_mode_cache()
166 hdr->hdr.l2.pkt_length = data_len; in qeth_l2_fill_header()
169 hdr->hdr.l2.id = QETH_HEADER_TYPE_L2_TSO; in qeth_l2_fill_header()
171 hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2; in qeth_l2_fill_header()
172 if (skb->ip_summed == CHECKSUM_PARTIAL) in qeth_l2_fill_header()
173 qeth_tx_csum(skb, &hdr->hdr.l2.flags[1], proto); in qeth_l2_fill_header()
178 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; in qeth_l2_fill_header()
180 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; in qeth_l2_fill_header()
182 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; in qeth_l2_fill_header()
187 if (veth->h_vlan_proto == htons(ETH_P_8021Q)) { in qeth_l2_fill_header()
188 hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN; in qeth_l2_fill_header()
189 hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI); in qeth_l2_fill_header()
202 return -EINVAL; in qeth_l2_setdelvlan_makerc()
204 return -EEXIST; in qeth_l2_setdelvlan_makerc()
206 return -ENOENT; in qeth_l2_setdelvlan_makerc()
208 return -EPERM; in qeth_l2_setdelvlan_makerc()
210 return -EIO; in qeth_l2_setdelvlan_makerc()
221 if (cmd->hdr.return_code) { in qeth_l2_send_setdelvlan_cb()
223 cmd->data.setdelvlan.vlan_id, 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()
240 return -ENOMEM; in qeth_l2_send_setdelvlan()
242 cmd->data.setdelvlan.vlan_id = i; in qeth_l2_send_setdelvlan()
249 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_add_vid()
261 struct qeth_card *card = dev->ml_priv; in qeth_l2_vlan_rx_kill_vid()
274 WRITE_ONCE(card->info.pnso_mode, mode); in qeth_l2_set_pnso_mode()
278 drain_workqueue(card->event_wq); in qeth_l2_set_pnso_mode()
294 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_flush()
324 return (rc) ? rc : -EADDRNOTAVAIL; 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()
334 if (!is_valid_ether_addr(card->dev->dev_addr)) 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()
347 if (card->info.dev_addr_is_registered) in qeth_l2_validate_addr()
351 return -EPERM; in qeth_l2_validate_addr()
357 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_mac_address()
365 return -EOPNOTSUPP; in qeth_l2_set_mac_address()
367 QETH_CARD_HEX(card, 3, addr->sa_data, ETH_ALEN); in qeth_l2_set_mac_address()
368 if (!is_valid_ether_addr(addr->sa_data)) in qeth_l2_set_mac_address()
369 return -EADDRNOTAVAIL; in qeth_l2_set_mac_address()
372 if (ether_addr_equal_64bits(dev->dev_addr, addr->sa_data) && 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()
380 ether_addr_copy(old_addr, dev->dev_addr); in qeth_l2_set_mac_address()
381 eth_hw_addr_set(dev, addr->sa_data); in qeth_l2_set_mac_address()
383 if (card->info.dev_addr_is_registered) in qeth_l2_set_mac_address()
385 card->info.dev_addr_is_registered = 1; in qeth_l2_set_mac_address()
397 if (card->options.sbp.reflect_promisc_primary) 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()
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()
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()
425 mutex_unlock(&card->sbp_lock); in qeth_l2_set_promisc_mode()
435 u32 mac_hash = get_unaligned((u32 *)(&ha->addr[2])); in qeth_l2_add_mac()
438 hash_for_each_possible(card->rx_mode_addrs, mac, hnode, mac_hash) { in qeth_l2_add_mac()
439 if (ether_addr_equal_64bits(ha->addr, mac->mac_addr)) { in qeth_l2_add_mac()
440 mac->disp_flag = QETH_DISP_ADDR_DO_NOTHING; in qeth_l2_add_mac()
449 ether_addr_copy(mac->mac_addr, ha->addr); in qeth_l2_add_mac()
450 mac->disp_flag = QETH_DISP_ADDR_ADD; in qeth_l2_add_mac()
452 hash_add(card->rx_mode_addrs, &mac->hnode, mac_hash); in qeth_l2_add_mac()
459 struct net_device *dev = card->dev; 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()
476 switch (mac->disp_flag) { in qeth_l2_rx_mode_work()
478 qeth_l2_remove_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
479 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
483 rc = qeth_l2_write_mac(card, mac->mac_addr); in qeth_l2_rx_mode_work()
485 hash_del(&mac->hnode); in qeth_l2_rx_mode_work()
492 mac->disp_flag = QETH_DISP_ADDR_DELETE; in qeth_l2_rx_mode_work()
502 struct qeth_card *card = dev->ml_priv; in qeth_l2_hard_start_xmit()
508 qdisc_skb_cb(skb)->pkt_len = skb->len; in qeth_l2_hard_start_xmit()
511 queue = card->qdio.out_qs[txq]; in qeth_l2_hard_start_xmit()
532 struct qeth_card *card = dev->ml_priv; in qeth_l2_set_rx_mode()
534 schedule_work(&card->rx_mode_work); in qeth_l2_set_rx_mode()
538 * qeth_l2_pnso() - perform network subchannel operation
540 * @oc: Operation Code
541 * @cnc: Boolean Change-Notification Control
547 * callback function for every entry in the list. If "change-notification-
551 static int qeth_l2_pnso(struct qeth_card *card, u8 oc, int cnc, in qeth_l2_pnso() argument
564 return -ENOMEM; in qeth_l2_pnso()
568 rc = ccw_device_pnso(ddev, rr, oc, rr->naihdr.resume_token, in qeth_l2_pnso()
575 size = rr->naihdr.naids; in qeth_l2_pnso()
581 elems = (rr->response.length - sizeof(struct chsc_header) - in qeth_l2_pnso()
584 if (!isfirstblock && (rr->naihdr.instance != prev_instance)) { in qeth_l2_pnso()
587 rc = -EAGAIN; in qeth_l2_pnso()
591 prev_instance = rr->naihdr.instance; in qeth_l2_pnso()
593 (*cb)(priv, &rr->entries[i]); in qeth_l2_pnso()
594 } while ((rc == -EBUSY) || (!rc && /* list stored */ in qeth_l2_pnso()
595 /* resume token is non-zero => list incomplete */ in qeth_l2_pnso()
596 (rr->naihdr.resume_token.t1 || rr->naihdr.resume_token.t2))); in qeth_l2_pnso()
599 QETH_CARD_TEXT_(card, 2, "PNrp%04x", rr->response.code); in qeth_l2_pnso()
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()
617 * qeth_l2_dev2br_fdb_notify() - update fdb of master bridge
620 * 1 - removal of an object
621 * 0 - addition of an object
623 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC
635 ether_addr_copy(ntfy_mac, addr_lnid->mac); in qeth_l2_dev2br_fdb_notify()
654 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
660 card->dev, &info.info, NULL); in qeth_l2_dev2br_fdb_notify()
673 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_l2_dev2br_an_set_cb()
676 (struct net_if_token *)&entry->nit, in qeth_l2_dev2br_an_set_cb()
677 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_l2_dev2br_an_set_cb()
681 * qeth_l2_dev2br_an_set() -
686 * Returns negative errno-compatible error indication or 0 on success.
699 if (rc == -EAGAIN) in qeth_l2_dev2br_an_set()
701 * addresses reported -> disable address notification in qeth_l2_dev2br_an_set()
732 (priv->brport_features & BR_LEARNING_SYNC) && in qeth_l2_must_learn()
735 (netdev->netdev_ops == &qeth_l2_iqd_netdev_ops || in qeth_l2_must_learn()
736 netdev->netdev_ops == &qeth_l2_osa_netdev_ops)); in qeth_l2_must_learn()
740 * qeth_l2_br2dev_worker() - update local MACs
752 struct net_device *lsyncdev = br2dev_event_work->lsync_dev; in qeth_l2_br2dev_worker()
753 struct net_device *dstdev = br2dev_event_work->dst_dev; in qeth_l2_br2dev_worker()
754 struct net_device *brdev = br2dev_event_work->br_dev; in qeth_l2_br2dev_worker()
755 unsigned long event = br2dev_event_work->event; in qeth_l2_br2dev_worker()
756 unsigned char *addr = br2dev_event_work->addr; in qeth_l2_br2dev_worker()
757 struct qeth_card *card = lsyncdev->ml_priv; in qeth_l2_br2dev_worker()
775 iter = &brdev->adj_list.lower; in qeth_l2_br2dev_worker()
793 lowerdev->ifindex); in qeth_l2_br2dev_worker()
832 return -ENOMEM; in qeth_l2_br2dev_queue_work()
833 INIT_WORK(&worker_data->work, qeth_l2_br2dev_worker); in qeth_l2_br2dev_queue_work()
834 worker_data->br_dev = brdev; in qeth_l2_br2dev_queue_work()
835 worker_data->lsync_dev = lsyncdev; in qeth_l2_br2dev_queue_work()
836 worker_data->dst_dev = dstdev; in qeth_l2_br2dev_queue_work()
837 worker_data->event = event; in qeth_l2_br2dev_queue_work()
838 ether_addr_copy(worker_data->addr, addr); in qeth_l2_br2dev_queue_work()
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()
871 iter = &brdev->adj_list.lower; in qeth_l2_switchdev_event()
875 card = lowerdev->ml_priv; in qeth_l2_switchdev_event()
879 fdb_info->addr); in qeth_l2_switchdev_event()
932 QETH_DBF_TEXT_(SETUP, 2, "b2d-%04d", in qeth_l2_br2dev_put()
941 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_getlink()
945 if (!priv->brport_hw_features || !netif_device_present(dev) || in qeth_l2_bridge_getlink()
947 return -EOPNOTSUPP; in qeth_l2_bridge_getlink()
950 mode, priv->brport_features, in qeth_l2_bridge_getlink()
951 priv->brport_hw_features, in qeth_l2_bridge_getlink()
960 * qeth_l2_bridge_setlink() - set bridgeport attributes
973 struct qeth_card *card = dev->ml_priv; in qeth_l2_bridge_setlink()
980 return -ENODEV; in qeth_l2_bridge_setlink()
995 return -EINVAL; in qeth_l2_bridge_setlink()
999 return -EINVAL; in qeth_l2_bridge_setlink()
1005 return -EINVAL; in qeth_l2_bridge_setlink()
1006 if (!(priv->brport_hw_features & BR_LEARNING_SYNC)) { in qeth_l2_bridge_setlink()
1009 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1014 return -EOPNOTSUPP; in qeth_l2_bridge_setlink()
1018 if (enable == !!(priv->brport_features & BR_LEARNING_SYNC)) in qeth_l2_bridge_setlink()
1021 mutex_lock(&card->sbp_lock); in qeth_l2_bridge_setlink()
1025 rc = -EBUSY; in qeth_l2_bridge_setlink()
1032 priv->brport_features |= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1039 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_bridge_setlink()
1044 mutex_unlock(&card->sbp_lock); in qeth_l2_bridge_setlink()
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()
1097 card->dev->features |= NETIF_F_VLAN_CHALLENGED; 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()
1105 card->dev->features |= NETIF_F_SG; 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()
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()
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()
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()
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()
1134 PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1)); 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()
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()
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()
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()
1157 /* Conditional to avoid spurious error messages */ 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()
1165 card->options.sbp.hostnotification = 0; in qeth_l2_setup_bridgeport_attrs()
1170 * qeth_l2_detect_dev2br_support() -
1178 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_detect_dev2br_support()
1186 dev2br_supported = card->info.ids_valid && in qeth_l2_detect_dev2br_support()
1191 priv->brport_hw_features |= BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1193 priv->brport_hw_features &= ~BR_LEARNING_SYNC; in qeth_l2_detect_dev2br_support()
1198 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_l2_enable_brport_features()
1201 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1202 if (priv->brport_hw_features & BR_LEARNING_SYNC) { in qeth_l2_enable_brport_features()
1205 if (rc == -EAGAIN) { in qeth_l2_enable_brport_features()
1213 netdev_err(card->dev, in qeth_l2_enable_brport_features()
1218 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1221 dev_warn(&card->gdev->dev, in qeth_l2_enable_brport_features()
1223 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_enable_brport_features()
1233 * qeth_bridge_emit_host_event() - bridgeport address change notification
1238 * object, 0 - addition of an object.
1239 * 0x01 - VLAN, 0x02 - MAC, 0x03 - VLAN and MAC.
1244 * reported by the hardware, and also when notifications are enabled -
1265 addr_lnid->lnid); in qeth_bridge_emit_host_event()
1270 addr_lnid->mac); in qeth_bridge_emit_host_event()
1274 token->cssid, token->ssid, token->devnum); in qeth_bridge_emit_host_event()
1276 scnprintf(str[i], sizeof(str[i]), "NTOK_IID=%02x", token->iid); in qeth_bridge_emit_host_event()
1279 token->chpid); in qeth_bridge_emit_host_event()
1282 token->chid); in qeth_bridge_emit_host_event()
1295 kobject_uevent_env(&card->gdev->dev.kobj, KOBJ_CHANGE, env); in qeth_bridge_emit_host_event()
1321 (data->role == QETH_SBP_ROLE_NONE) ? "none" : in qeth_bridge_state_change_worker()
1322 (data->role == QETH_SBP_ROLE_PRIMARY) ? "primary" : in qeth_bridge_state_change_worker()
1323 (data->role == QETH_SBP_ROLE_SECONDARY) ? "secondary" : in qeth_bridge_state_change_worker()
1326 (data->state == QETH_SBP_STATE_INACTIVE) ? "inactive" : in qeth_bridge_state_change_worker()
1327 (data->state == QETH_SBP_STATE_STANDBY) ? "standby" : in qeth_bridge_state_change_worker()
1328 (data->state == QETH_SBP_STATE_ACTIVE) ? "active" : in qeth_bridge_state_change_worker()
1330 kobject_uevent_env(&data->card->gdev->dev.kobj, in qeth_bridge_state_change_worker()
1338 struct qeth_sbp_port_data *qports = &cmd->data.sbp.data.port_data; in qeth_bridge_state_change()
1342 if (qports->num_entries == 0) { in qeth_bridge_state_change()
1346 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridge_state_change()
1347 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length); in qeth_bridge_state_change()
1356 INIT_WORK(&data->worker, qeth_bridge_state_change_worker); in qeth_bridge_state_change()
1357 data->card = card; in qeth_bridge_state_change()
1359 data->role = qports->entry[0].role; in qeth_bridge_state_change()
1360 data->state = qports->entry[0].state; in qeth_bridge_state_change()
1362 queue_work(card->event_wq, &data->worker); in qeth_bridge_state_change()
1381 card = data->card; in qeth_l2_dev2br_worker()
1382 priv = netdev_priv(card->dev); in qeth_l2_dev2br_worker()
1386 if (READ_ONCE(card->info.pnso_mode) == QETH_PNSO_NONE) in qeth_l2_dev2br_worker()
1389 if (data->ac_event.lost_event_mask) { in qeth_l2_dev2br_worker()
1390 /* Potential re-config in progress, try again later: */ 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()
1413 /* TODO: if we want to retry after -EAGAIN, be 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()
1425 priv->brport_features ^= BR_LEARNING_SYNC; in qeth_l2_dev2br_worker()
1434 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_l2_dev2br_worker()
1436 &data->ac_event.entry[i]; in qeth_l2_dev2br_worker()
1438 entry->change_code, in qeth_l2_dev2br_worker()
1439 &entry->token, in qeth_l2_dev2br_worker()
1440 &entry->addr_lnid); in qeth_l2_dev2br_worker()
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()
1463 if (data->ac_event.lost_event_mask) { in qeth_addr_change_event_worker()
1464 /* Potential re-config in progress, try again later: */ 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()
1474 (data->ac_event.lost_event_mask == 0x01) in qeth_addr_change_event_worker()
1476 : (data->ac_event.lost_event_mask == 0x02) 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()
1486 for (i = 0; i < data->ac_event.num_entries; i++) { in qeth_addr_change_event_worker()
1488 &data->ac_event.entry[i]; in qeth_addr_change_event_worker()
1489 qeth_bridge_emit_host_event(data->card, in qeth_addr_change_event_worker()
1491 entry->change_code, in qeth_addr_change_event_worker()
1492 &entry->token, in qeth_addr_change_event_worker()
1493 &entry->addr_lnid); in qeth_addr_change_event_worker()
1504 &cmd->data.addrchange; in qeth_addr_change_event()
1508 if (card->info.pnso_mode == QETH_PNSO_NONE) in qeth_addr_change_event()
1512 if (cmd->hdr.return_code != 0x0000) { in qeth_addr_change_event()
1513 if (cmd->hdr.return_code == 0x0010) { in qeth_addr_change_event()
1514 if (hostevs->lost_event_mask == 0x00) in qeth_addr_change_event()
1515 hostevs->lost_event_mask = 0xff; in qeth_addr_change_event()
1518 cmd->hdr.return_code); in qeth_addr_change_event()
1523 hostevs->num_entries; in qeth_addr_change_event()
1530 if (card->info.pnso_mode == QETH_PNSO_BRIDGEPORT) in qeth_addr_change_event()
1531 INIT_DELAYED_WORK(&data->dwork, qeth_addr_change_event_worker); in qeth_addr_change_event()
1533 INIT_DELAYED_WORK(&data->dwork, qeth_l2_dev2br_worker); in qeth_addr_change_event()
1534 data->card = card; in qeth_addr_change_event()
1535 data->ac_event = *hostevs; in qeth_addr_change_event()
1536 memcpy(data->ac_event.entry, hostevs->entry, extrasize); in qeth_addr_change_event()
1537 queue_delayed_work(card->event_wq, &data->dwork, 0); in qeth_addr_change_event()
1555 struct qeth_ipacmd_setbridgeport *sbp = &cmd->data.sbp; in qeth_bridgeport_makerc()
1556 enum qeth_ipa_sbp_cmd setcmd = sbp->hdr.command_code; in qeth_bridgeport_makerc()
1557 u16 ipa_rc = cmd->hdr.return_code; in qeth_bridgeport_makerc()
1558 u16 sbp_rc = sbp->hdr.return_code; in qeth_bridgeport_makerc()
1572 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1576 rc = -ENODEV; /* maybe not the best code here? */ in qeth_bridgeport_makerc()
1577 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1582 rc = -EPERM; in qeth_bridgeport_makerc()
1583 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1590 rc = -EEXIST; in qeth_bridgeport_makerc()
1591 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1595 rc = -EBUSY; in qeth_bridgeport_makerc()
1596 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1600 rc = -EIO; in qeth_bridgeport_makerc()
1605 rc = -EBUSY; in qeth_bridgeport_makerc()
1606 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1611 rc = -EEXIST; in qeth_bridgeport_makerc()
1612 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1617 rc = -EBUSY; in qeth_bridgeport_makerc()
1618 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1623 rc = -EACCES; in qeth_bridgeport_makerc()
1624 dev_err(&card->gdev->dev, in qeth_bridgeport_makerc()
1628 rc = -EIO; in qeth_bridgeport_makerc()
1633 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1636 rc = -EOPNOTSUPP; in qeth_bridgeport_makerc()
1639 rc = -EIO; in qeth_bridgeport_makerc()
1666 hdr = &__ipa_cmd(iob)->data.sbp.hdr; in qeth_sbp_build_cmd()
1667 hdr->cmdlength = sizeof(*hdr) + data_length; in qeth_sbp_build_cmd()
1668 hdr->command_code = sbp_cmd; in qeth_sbp_build_cmd()
1669 hdr->used_total = 1; in qeth_sbp_build_cmd()
1670 hdr->seq_no = 1; in qeth_sbp_build_cmd()
1678 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_support_cb()
1686 cbctl->data.supported = in qeth_bridgeport_query_support_cb()
1687 cmd->data.sbp.data.query_cmds_supp.supported_cmds; in qeth_bridgeport_query_support_cb()
1692 * qeth_bridgeport_query_support() - store bitmask of supported subfunctions.
1696 * strucutre: card->options.sbp.supported_funcs.
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()
1722 struct _qeth_sbp_cbctl *cbctl = (struct _qeth_sbp_cbctl *)reply->param; in qeth_bridgeport_query_ports_cb()
1731 qports = &cmd->data.sbp.data.port_data; in qeth_bridgeport_query_ports_cb()
1732 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { in qeth_bridgeport_query_ports_cb()
1733 QETH_CARD_TEXT_(card, 2, "SBPs%04x", qports->entry_length); in qeth_bridgeport_query_ports_cb()
1734 return -EINVAL; in qeth_bridgeport_query_ports_cb()
1737 if (qports->num_entries > 0) { in qeth_bridgeport_query_ports_cb()
1738 if (cbctl->data.qports.role) in qeth_bridgeport_query_ports_cb()
1739 *cbctl->data.qports.role = qports->entry[0].role; in qeth_bridgeport_query_ports_cb()
1740 if (cbctl->data.qports.state) in qeth_bridgeport_query_ports_cb()
1741 *cbctl->data.qports.state = qports->entry[0].state; in qeth_bridgeport_query_ports_cb()
1747 * qeth_bridgeport_query_ports() - query local bridgeport status.
1749 * @role: Role of the port: 0-none, 1-primary, 2-secondary.
1750 * @state: State of the port: 0-inactive, 1-standby, 2-active.
1752 * Returns negative errno-compatible error indication or 0 on success.
1770 if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) in qeth_bridgeport_query_ports()
1771 return -EOPNOTSUPP; in qeth_bridgeport_query_ports()
1774 return -ENOMEM; in qeth_bridgeport_query_ports()
1790 * qeth_bridgeport_setrole() - Assign primary role to the port.
1794 * Returns negative errno-compatible error indication or 0 on success.
1815 return -EINVAL; in qeth_bridgeport_setrole()
1817 if (!(card->options.sbp.supported_funcs & setcmd)) in qeth_bridgeport_setrole()
1818 return -EOPNOTSUPP; in qeth_bridgeport_setrole()
1821 return -ENOMEM; in qeth_bridgeport_setrole()
1833 if (entry->addr_lnid.lnid < VLAN_N_VID) in qeth_bridgeport_an_set_cb()
1836 (struct net_if_token *)&entry->nit, in qeth_bridgeport_an_set_cb()
1837 (struct mac_addr_lnid *)&entry->addr_lnid); in qeth_bridgeport_an_set_cb()
1841 * qeth_bridgeport_an_set() - Enable or disable bridgeport address notification
1843 * @enable: 0 - disable, non-zero - enable notifications
1845 * Returns negative errno-compatible error indication or 0 on success.
1854 if (!card->options.sbp.supported_funcs) in qeth_bridgeport_an_set()
1855 return -EOPNOTSUPP; in qeth_bridgeport_an_set()
1883 rc = -EOPNOTSUPP; in qeth_l2_vnicc_makerc()
1886 rc = -EALREADY; in qeth_l2_vnicc_makerc()
1889 rc = -EBUSY; in qeth_l2_vnicc_makerc()
1892 rc = -ENOSPC; in qeth_l2_vnicc_makerc()
1895 rc = -EACCES; in qeth_l2_vnicc_makerc()
1898 rc = -EIO; in qeth_l2_vnicc_makerc()
1911 struct qeth_ipacmd_vnicc *rep = &cmd->data.vnicc; in qeth_l2_vnicc_request_cb()
1912 u32 sub_cmd = cmd->data.vnicc.hdr.sub_command; in qeth_l2_vnicc_request_cb()
1915 if (cmd->hdr.return_code) 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()
1922 *(u32 *)reply->param = rep->data.query_cmds.sup_cmds; in qeth_l2_vnicc_request_cb()
1924 *(u32 *)reply->param = rep->data.getset_timeout.timeout; in qeth_l2_vnicc_request_cb()
1942 hdr = &__ipa_cmd(iob)->data.vnicc.hdr; in qeth_l2_vnicc_build_cmd()
1943 hdr->data_length = sizeof(*hdr) + data_length; in qeth_l2_vnicc_build_cmd()
1944 hdr->sub_command = vnicc_cmd; in qeth_l2_vnicc_build_cmd()
1956 return -ENOMEM; in qeth_l2_vnicc_query_chars()
1971 return -ENOMEM; in qeth_l2_vnicc_query_cmds()
1973 __ipa_cmd(iob)->data.vnicc.data.query_cmds.vnic_char = vnic_char; in qeth_l2_vnicc_query_cmds()
1987 return -ENOMEM; in qeth_l2_vnicc_set_char()
1989 __ipa_cmd(iob)->data.vnicc.data.set_char.vnic_char = vnic_char; in qeth_l2_vnicc_set_char()
2005 return -ENOMEM; in qeth_l2_vnicc_getset_timeout()
2007 getset_timeout = &__ipa_cmd(iob)->data.vnicc.data.getset_timeout; in qeth_l2_vnicc_getset_timeout()
2008 getset_timeout->vnic_char = vnicc; in qeth_l2_vnicc_getset_timeout()
2011 getset_timeout->timeout = *timeout; in qeth_l2_vnicc_getset_timeout()
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()
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()
2040 return -EOPNOTSUPP; in qeth_l2_vnicc_set_state()
2043 return -EBUSY; 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()
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()
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()
2077 &card->options.vnicc.learning_timeout); in qeth_l2_vnicc_set_state()
2091 if (!(card->options.vnicc.sup_chars & vnicc)) in qeth_l2_vnicc_get_state()
2092 return -EOPNOTSUPP; in qeth_l2_vnicc_get_state()
2095 return -EBUSY; in qeth_l2_vnicc_get_state()
2101 *state = (card->options.vnicc.cur_chars & vnicc) ? true : false; in qeth_l2_vnicc_get_state()
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()
2117 return -EOPNOTSUPP; in qeth_l2_vnicc_set_timeout()
2120 return -EBUSY; in qeth_l2_vnicc_set_timeout()
2123 if (card->options.vnicc.learning_timeout == timeout) in qeth_l2_vnicc_set_timeout()
2128 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_timeout()
2136 card->options.vnicc.learning_timeout = timeout; in qeth_l2_vnicc_set_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()
2153 return -EOPNOTSUPP; in qeth_l2_vnicc_get_timeout()
2156 return -EBUSY; in qeth_l2_vnicc_get_timeout()
2159 *timeout = card->options.vnicc.learning_timeout; in qeth_l2_vnicc_get_timeout()
2171 if (!card->options.vnicc.sup_chars) 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()
2185 * qeth_bridgeport_allowed - are any qeth_bridgeport functions allowed?
2193 struct qeth_priv *priv = netdev_priv(card->dev); in qeth_bridgeport_allowed()
2196 !(priv->brport_features & BR_LEARNING_SYNC)); in qeth_bridgeport_allowed()
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()
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()
2214 /* (re-)initialize VNICC */
2217 u32 *timeout = &card->options.vnicc.learning_timeout; in qeth_l2_vnicc_init()
2225 card->options.vnicc.rx_bcast_enabled = 0; 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()
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()
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()
2270 dev_err(&card->gdev->dev, "Configuring the VNIC characteristics failed\n"); in qeth_l2_vnicc_init()
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()
2298 mutex_init(&card->sbp_lock); in qeth_l2_probe_device()
2300 if (gdev->dev.type) { in qeth_l2_probe_device()
2301 rc = device_add_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_probe_device()
2305 gdev->dev.type = &qeth_l2_devtype; 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()
2317 if (gdev->dev.type != &qeth_l2_devtype) in qeth_l2_remove_device()
2318 device_remove_groups(&gdev->dev, qeth_l2_attr_groups); in qeth_l2_remove_device()
2321 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l2_remove_device()
2323 if (gdev->state == CCWGROUP_ONLINE) 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()
2328 if (priv->brport_features & BR_LEARNING_SYNC) { in qeth_l2_remove_device()
2333 unregister_netdev(card->dev); in qeth_l2_remove_device()
2339 struct net_device *dev = card->dev; in qeth_l2_set_online()
2344 mutex_lock(&card->sbp_lock); in qeth_l2_set_online()
2346 if (card->options.sbp.supported_funcs) { 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()
2363 card->state = CARD_STATE_SOFTSETUP; in qeth_l2_set_online()
2367 if (dev->reg_state != NETREG_REGISTERED) { in qeth_l2_set_online()
2394 napi_schedule(&card->napi); in qeth_l2_set_online()
2395 /* kick-start the NAPI softirq: */ in qeth_l2_set_online()
2406 card->state = CARD_STATE_DOWN; in qeth_l2_set_online()
2412 struct qeth_priv *priv = netdev_priv(card->dev); 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()
2421 if (priv->brport_features & BR_LEARNING_SYNC) in qeth_l2_set_offline()
2429 switch (cmd->hdr.command) { in qeth_l2_control_event()
2432 if (cmd->data.sbp.hdr.command_code == in qeth_l2_control_event()