Lines Matching refs:port_priv

169 	struct adin1110_port_priv *port_priv;  member
295 static int adin1110_read_fifo(struct adin1110_port_priv *port_priv) in adin1110_read_fifo() argument
297 struct adin1110_priv *priv = port_priv->priv; in adin1110_read_fifo()
307 if (!port_priv->nr) { in adin1110_read_fifo()
331 rxb = netdev_alloc_skb(port_priv->netdev, round_len); in adin1110_read_fifo()
360 rxb->protocol = eth_type_trans(rxb, port_priv->netdev); in adin1110_read_fifo()
362 if ((port_priv->flags & IFF_ALLMULTI && rxb->pkt_type == PACKET_MULTICAST) || in adin1110_read_fifo()
363 (port_priv->flags & IFF_BROADCAST && rxb->pkt_type == PACKET_BROADCAST)) in adin1110_read_fifo()
368 port_priv->rx_bytes += frame_size - ADIN1110_FRAME_HEADER_LEN; in adin1110_read_fifo()
369 port_priv->rx_packets++; in adin1110_read_fifo()
374 static int adin1110_write_fifo(struct adin1110_port_priv *port_priv, in adin1110_write_fifo() argument
377 struct adin1110_priv *priv = port_priv->priv; in adin1110_write_fifo()
414 frame_header = cpu_to_be16(port_priv->nr); in adin1110_write_fifo()
425 port_priv->tx_bytes += txb->len; in adin1110_write_fifo()
426 port_priv->tx_packets++; in adin1110_write_fifo()
543 static bool adin1110_port_rx_ready(struct adin1110_port_priv *port_priv, in adin1110_port_rx_ready() argument
546 if (!netif_oper_up(port_priv->netdev)) in adin1110_port_rx_ready()
549 if (!port_priv->nr) in adin1110_port_rx_ready()
555 static void adin1110_read_frames(struct adin1110_port_priv *port_priv, in adin1110_read_frames() argument
558 struct adin1110_priv *priv = port_priv->priv; in adin1110_read_frames()
567 if (!adin1110_port_rx_ready(port_priv, status1)) in adin1110_read_frames()
570 ret = adin1110_read_fifo(port_priv); in adin1110_read_frames()
631 static int adin1110_write_mac_address(struct adin1110_port_priv *port_priv, in adin1110_write_mac_address() argument
635 struct adin1110_priv *priv = port_priv->priv; in adin1110_write_mac_address()
641 if (!port_priv->nr) in adin1110_write_mac_address()
705 static u32 adin1110_port_rules(struct adin1110_port_priv *port_priv, in adin1110_port_rules() argument
711 if (!port_priv->nr) in adin1110_port_rules()
719 if (fw_to_other_port && port_priv->priv->forwarding) in adin1110_port_rules()
725 static int adin1110_multicast_filter(struct adin1110_port_priv *port_priv, in adin1110_multicast_filter() argument
735 if (accept_multicast && port_priv->state == BR_STATE_FORWARDING) in adin1110_multicast_filter()
736 port_rules = adin1110_port_rules(port_priv, true, true); in adin1110_multicast_filter()
738 return adin1110_write_mac_address(port_priv, mac_nr, mac, in adin1110_multicast_filter()
742 static int adin1110_broadcasts_filter(struct adin1110_port_priv *port_priv, in adin1110_broadcasts_filter() argument
750 if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING) in adin1110_broadcasts_filter()
751 port_rules = adin1110_port_rules(port_priv, true, true); in adin1110_broadcasts_filter()
753 return adin1110_write_mac_address(port_priv, mac_nr, mask, in adin1110_broadcasts_filter()
760 struct adin1110_port_priv *port_priv = netdev_priv(netdev); in adin1110_set_mac_address() local
771 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_set_mac_address()
772 port_rules = adin1110_port_rules(port_priv, true, false); in adin1110_set_mac_address()
774 return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr, in adin1110_set_mac_address()
798 static int adin1110_set_promisc_mode(struct adin1110_port_priv *port_priv, in adin1110_set_promisc_mode() argument
801 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_promisc_mode()
804 if (port_priv->state != BR_STATE_FORWARDING) in adin1110_set_promisc_mode()
807 if (!port_priv->nr) in adin1110_set_promisc_mode()
816 static int adin1110_setup_rx_mode(struct adin1110_port_priv *port_priv) in adin1110_setup_rx_mode() argument
820 ret = adin1110_set_promisc_mode(port_priv, in adin1110_setup_rx_mode()
821 !!(port_priv->flags & IFF_PROMISC)); in adin1110_setup_rx_mode()
825 ret = adin1110_multicast_filter(port_priv, ADIN_MAC_MULTICAST_ADDR_SLOT, in adin1110_setup_rx_mode()
826 !!(port_priv->flags & IFF_ALLMULTI)); in adin1110_setup_rx_mode()
830 ret = adin1110_broadcasts_filter(port_priv, in adin1110_setup_rx_mode()
832 !!(port_priv->flags & IFF_BROADCAST)); in adin1110_setup_rx_mode()
836 return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1, in adin1110_setup_rx_mode()
864 struct adin1110_port_priv *port_priv; in adin1110_rx_mode_work() local
867 port_priv = container_of(work, struct adin1110_port_priv, rx_mode_work); in adin1110_rx_mode_work()
868 priv = port_priv->priv; in adin1110_rx_mode_work()
871 adin1110_setup_rx_mode(port_priv); in adin1110_rx_mode_work()
877 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_set_rx_mode() local
878 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_rx_mode()
882 port_priv->flags = dev->flags; in adin1110_set_rx_mode()
883 schedule_work(&port_priv->rx_mode_work); in adin1110_set_rx_mode()
890 struct adin1110_port_priv *port_priv = netdev_priv(net_dev); in adin1110_net_open() local
891 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_open()
921 port_priv->state = BR_STATE_FORWARDING; in adin1110_net_open()
938 phy_start(port_priv->phydev); in adin1110_net_open()
947 struct adin1110_port_priv *port_priv = netdev_priv(net_dev); in adin1110_net_stop() local
948 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_stop()
952 mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ; in adin1110_net_stop()
961 netif_stop_queue(port_priv->netdev); in adin1110_net_stop()
962 flush_work(&port_priv->tx_work); in adin1110_net_stop()
963 phy_stop(port_priv->phydev); in adin1110_net_stop()
970 struct adin1110_port_priv *port_priv; in adin1110_tx_work() local
975 port_priv = container_of(work, struct adin1110_port_priv, tx_work); in adin1110_tx_work()
976 priv = port_priv->priv; in adin1110_tx_work()
980 while ((txb = skb_dequeue(&port_priv->txq))) { in adin1110_tx_work()
981 ret = adin1110_write_fifo(port_priv, txb); in adin1110_tx_work()
994 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_start_xmit() local
995 struct adin1110_priv *priv = port_priv->priv; in adin1110_start_xmit()
1005 skb_queue_tail(&port_priv->txq, skb); in adin1110_start_xmit()
1008 schedule_work(&port_priv->tx_work); in adin1110_start_xmit()
1016 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_ndo_get_stats64() local
1018 storage->rx_packets = port_priv->rx_packets; in adin1110_ndo_get_stats64()
1019 storage->tx_packets = port_priv->tx_packets; in adin1110_ndo_get_stats64()
1021 storage->rx_bytes = port_priv->rx_bytes; in adin1110_ndo_get_stats64()
1022 storage->tx_bytes = port_priv->tx_bytes; in adin1110_ndo_get_stats64()
1028 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_port_get_port_parent_id() local
1029 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_get_port_parent_id()
1040 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_ndo_get_phys_port_name() local
1043 err = snprintf(name, len, "p%d", port_priv->nr); in adin1110_ndo_get_phys_port_name()
1137 static int adin1110_port_bridge_join(struct adin1110_port_priv *port_priv, in adin1110_port_bridge_join() argument
1140 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_join()
1143 port_priv->bridge = bridge; in adin1110_port_bridge_join()
1154 return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr); in adin1110_port_bridge_join()
1157 static int adin1110_port_bridge_leave(struct adin1110_port_priv *port_priv, in adin1110_port_bridge_leave() argument
1160 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_leave()
1163 port_priv->bridge = NULL; in adin1110_port_bridge_leave()
1181 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_netdevice_event() local
1192 ret = adin1110_port_bridge_join(port_priv, info->upper_dev); in adin1110_netdevice_event()
1194 ret = adin1110_port_bridge_leave(port_priv, info->upper_dev); in adin1110_netdevice_event()
1213 static int adin1110_port_set_forwarding_state(struct adin1110_port_priv *port_priv) in adin1110_port_set_forwarding_state() argument
1215 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_forwarding_state()
1218 port_priv->state = BR_STATE_FORWARDING; in adin1110_port_set_forwarding_state()
1221 ret = adin1110_set_mac_address(port_priv->netdev, in adin1110_port_set_forwarding_state()
1222 port_priv->netdev->dev_addr); in adin1110_port_set_forwarding_state()
1229 ret = adin1110_setup_rx_mode(port_priv); in adin1110_port_set_forwarding_state()
1236 static int adin1110_port_set_blocking_state(struct adin1110_port_priv *port_priv) in adin1110_port_set_blocking_state() argument
1239 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_blocking_state()
1245 port_priv->state = BR_STATE_BLOCKING; in adin1110_port_set_blocking_state()
1249 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_port_set_blocking_state()
1260 port_rules = adin1110_port_rules(port_priv, true, false); in adin1110_port_set_blocking_state()
1261 ret = adin1110_write_mac_address(port_priv, mac_slot, mac, in adin1110_port_set_blocking_state()
1273 static int adin1110_port_attr_stp_state_set(struct adin1110_port_priv *port_priv, in adin1110_port_attr_stp_state_set() argument
1278 return adin1110_port_set_forwarding_state(port_priv); in adin1110_port_attr_stp_state_set()
1283 return adin1110_port_set_blocking_state(port_priv); in adin1110_port_attr_stp_state_set()
1293 struct adin1110_port_priv *port_priv = netdev_priv(dev); in adin1110_port_attr_set() local
1297 return adin1110_port_attr_stp_state_set(port_priv, in adin1110_port_attr_set()
1338 static int adin1110_fdb_add(struct adin1110_port_priv *port_priv, in adin1110_fdb_add() argument
1341 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_add()
1349 netdev_dbg(port_priv->netdev, in adin1110_fdb_add()
1352 fdb->offloaded, port_priv->nr); in adin1110_fdb_add()
1372 other_port = priv->ports[!port_priv->nr]; in adin1110_fdb_add()
1373 port_rules = adin1110_port_rules(port_priv, false, true); in adin1110_fdb_add()
1400 static int adin1110_fdb_del(struct adin1110_port_priv *port_priv, in adin1110_fdb_del() argument
1403 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_del()
1408 netdev_dbg(port_priv->netdev, in adin1110_fdb_del()
1411 fdb->offloaded, port_priv->nr); in adin1110_fdb_del()
1434 struct adin1110_port_priv *port_priv; in adin1110_switchdev_event_work() local
1438 port_priv = switchdev_work->port_priv; in adin1110_switchdev_event_work()
1440 mutex_lock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1444 ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1446 adin1110_fdb_offload_notify(port_priv->netdev, in adin1110_switchdev_event_work()
1450 adin1110_fdb_del(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1456 mutex_unlock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1460 dev_put(port_priv->netdev); in adin1110_switchdev_event_work()
1468 struct adin1110_port_priv *port_priv = netdev_priv(netdev); in adin1110_switchdev_event() local
1480 switchdev_work->port_priv = port_priv; in adin1110_switchdev_event()
1552 struct adin1110_port_priv *port_priv; in adin1110_probe_netdevs() local
1558 netdev = devm_alloc_etherdev(dev, sizeof(*port_priv)); in adin1110_probe_netdevs()
1562 port_priv = netdev_priv(netdev); in adin1110_probe_netdevs()
1563 port_priv->netdev = netdev; in adin1110_probe_netdevs()
1564 port_priv->priv = priv; in adin1110_probe_netdevs()
1565 port_priv->cfg = priv->cfg; in adin1110_probe_netdevs()
1566 port_priv->nr = i; in adin1110_probe_netdevs()
1567 priv->ports[i] = port_priv; in adin1110_probe_netdevs()
1575 INIT_WORK(&port_priv->tx_work, adin1110_tx_work); in adin1110_probe_netdevs()
1576 INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work); in adin1110_probe_netdevs()
1577 skb_queue_head_init(&port_priv->txq); in adin1110_probe_netdevs()
1587 port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false); in adin1110_probe_netdevs()
1588 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1590 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1593 port_priv->phydev = phy_connect(netdev, in adin1110_probe_netdevs()
1594 phydev_name(port_priv->phydev), in adin1110_probe_netdevs()
1597 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1599 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1603 port_priv->phydev); in adin1110_probe_netdevs()