Lines Matching +full:phy +full:- +full:10 +full:base +full:- +full:t1l +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2 /* ADIN1110 Low Power 10BASE-T1L Ethernet MAC-PHY
3 * ADIN2111 2-Port Ethernet Switch with Integrated 10BASE-T1L PHY
23 #include <linux/phy.h>
43 #define ADIN1110_FWD_UNK2HOST BIT(2)
49 #define ADIN1110_SPI_ERR BIT(10)
54 #define ADIN1110_SPI_ERR_IRQ BIT(10)
98 #define ADIN1110_WR_HEADER_LEN 2
99 #define ADIN1110_FRAME_HEADER_LEN 2
100 #define ADIN1110_INTERNAL_SIZE_HEADER_LEN 2
108 #define ADIN_MAC_MAX_PORTS 2
113 #define ADIN_MAC_P1_ADDR_SLOT 2
184 .phy_ids = {1, 2},
185 .ports_nr = 2,
202 priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg); in adin1110_read_reg()
203 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg); in adin1110_read_reg()
204 priv->data[2] = 0x00; in adin1110_read_reg()
206 if (priv->append_crc) { in adin1110_read_reg()
207 priv->data[2] = adin1110_crc_data(&priv->data[0], 2); in adin1110_read_reg()
208 priv->data[3] = 0x00; in adin1110_read_reg()
212 if (priv->append_crc) in adin1110_read_reg()
215 memset(&priv->data[header_len], 0, read_len); in adin1110_read_reg()
216 t.tx_buf = &priv->data[0]; in adin1110_read_reg()
217 t.rx_buf = &priv->data[0]; in adin1110_read_reg()
220 ret = spi_sync_transfer(priv->spidev, &t, 1); in adin1110_read_reg()
224 if (priv->append_crc) { in adin1110_read_reg()
228 crc = adin1110_crc_data(&priv->data[header_len], in adin1110_read_reg()
230 recv_crc = priv->data[header_len + ADIN1110_REG_LEN]; in adin1110_read_reg()
233 dev_err_ratelimited(&priv->spidev->dev, "CRC error."); in adin1110_read_reg()
234 return -EBADMSG; in adin1110_read_reg()
238 *val = get_unaligned_be32(&priv->data[header_len]); in adin1110_read_reg()
248 priv->data[0] = ADIN1110_CD | ADIN1110_WRITE | FIELD_GET(GENMASK(12, 8), reg); in adin1110_write_reg()
249 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg); in adin1110_write_reg()
251 if (priv->append_crc) { in adin1110_write_reg()
252 priv->data[2] = adin1110_crc_data(&priv->data[0], header_len); in adin1110_write_reg()
256 put_unaligned_be32(val, &priv->data[header_len]); in adin1110_write_reg()
257 if (priv->append_crc) { in adin1110_write_reg()
258 priv->data[header_len + write_len] = adin1110_crc_data(&priv->data[header_len], in adin1110_write_reg()
263 return spi_write(priv->spidev, &priv->data[0], header_len + write_len); in adin1110_write_reg()
288 return -EINVAL; in adin1110_round_len()
295 struct adin1110_priv *priv = port_priv->priv; in adin1110_read_fifo()
305 if (!port_priv->nr) { in adin1110_read_fifo()
317 /* The read frame size includes the extra 2 bytes in adin1110_read_fifo()
321 return -EINVAL; in adin1110_read_fifo()
325 return -EINVAL; in adin1110_read_fifo()
327 frame_size_no_fcs = frame_size - ADIN1110_FRAME_HEADER_LEN - ADIN1110_FEC_LEN; in adin1110_read_fifo()
328 memset(priv->data, 0, ADIN1110_RD_HEADER_LEN); in adin1110_read_fifo()
330 priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg); in adin1110_read_fifo()
331 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg); in adin1110_read_fifo()
333 if (priv->append_crc) { in adin1110_read_fifo()
334 priv->data[2] = adin1110_crc_data(&priv->data[0], 2); in adin1110_read_fifo()
338 rxb = netdev_alloc_skb(port_priv->netdev, round_len + header_len); in adin1110_read_fifo()
340 return -ENOMEM; in adin1110_read_fifo()
344 t.tx_buf = &priv->data[0]; in adin1110_read_fifo()
345 t.rx_buf = &rxb->data[0]; in adin1110_read_fifo()
348 ret = spi_sync_transfer(priv->spidev, &t, 1); in adin1110_read_fifo()
355 rxb->protocol = eth_type_trans(rxb, port_priv->netdev); in adin1110_read_fifo()
357 if ((port_priv->flags & IFF_ALLMULTI && rxb->pkt_type == PACKET_MULTICAST) || in adin1110_read_fifo()
358 (port_priv->flags & IFF_BROADCAST && rxb->pkt_type == PACKET_BROADCAST)) in adin1110_read_fifo()
359 rxb->offload_fwd_mark = port_priv->priv->forwarding; in adin1110_read_fifo()
363 port_priv->rx_bytes += frame_size - ADIN1110_FRAME_HEADER_LEN; in adin1110_read_fifo()
364 port_priv->rx_packets++; in adin1110_read_fifo()
372 struct adin1110_priv *priv = port_priv->priv; in adin1110_write_fifo()
381 * MAC nor PHY will otherwise add the in adin1110_write_fifo()
385 if (txb->len + ADIN1110_FEC_LEN < 64) in adin1110_write_fifo()
386 padding = 64 - (txb->len + ADIN1110_FEC_LEN); in adin1110_write_fifo()
388 padded_len = txb->len + padding + ADIN1110_FRAME_HEADER_LEN; in adin1110_write_fifo()
398 memset(priv->data, 0, round_len + ADIN1110_WR_HEADER_LEN); in adin1110_write_fifo()
400 priv->data[0] = ADIN1110_CD | ADIN1110_WRITE; in adin1110_write_fifo()
401 priv->data[0] |= FIELD_GET(GENMASK(12, 8), ADIN1110_TX); in adin1110_write_fifo()
402 priv->data[1] = FIELD_GET(GENMASK(7, 0), ADIN1110_TX); in adin1110_write_fifo()
403 if (priv->append_crc) { in adin1110_write_fifo()
404 priv->data[2] = adin1110_crc_data(&priv->data[0], 2); in adin1110_write_fifo()
409 frame_header = cpu_to_be16(port_priv->nr); in adin1110_write_fifo()
410 memcpy(&priv->data[header_len], &frame_header, in adin1110_write_fifo()
413 memcpy(&priv->data[header_len + ADIN1110_FRAME_HEADER_LEN], in adin1110_write_fifo()
414 txb->data, txb->len); in adin1110_write_fifo()
416 ret = spi_write(priv->spidev, &priv->data[0], round_len + header_len); in adin1110_write_fifo()
420 port_priv->tx_bytes += txb->len; in adin1110_write_fifo()
421 port_priv->tx_packets++; in adin1110_write_fifo()
431 mutex_lock(&priv->lock); in adin1110_read_mdio_acc()
433 mutex_unlock(&priv->lock); in adin1110_read_mdio_acc()
442 struct adin1110_priv *priv = bus->priv; in adin1110_mdio_read()
447 return -EOPNOTSUPP; in adin1110_mdio_read()
455 mutex_lock(&priv->lock); in adin1110_mdio_read()
457 mutex_unlock(&priv->lock); in adin1110_mdio_read()
479 struct adin1110_priv *priv = bus->priv; in adin1110_mdio_write()
484 return -EOPNOTSUPP; in adin1110_mdio_write()
493 mutex_lock(&priv->lock); in adin1110_mdio_write()
495 mutex_unlock(&priv->lock); in adin1110_mdio_write()
504 /* ADIN1110 MAC-PHY contains an ADIN1100 PHY.
505 * ADIN2111 MAC-PHY contains two ADIN1100 PHYs.
507 * the encapsulated PHY and probe the ADIN1100 driver.
517 return -ENOMEM; in adin1110_register_mdiobus()
519 snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u", in adin1110_register_mdiobus()
520 priv->cfg->name, spi_get_chipselect(priv->spidev, 0)); in adin1110_register_mdiobus()
522 mii_bus->name = priv->mii_bus_name; in adin1110_register_mdiobus()
523 mii_bus->read = adin1110_mdio_read; in adin1110_register_mdiobus()
524 mii_bus->write = adin1110_mdio_write; in adin1110_register_mdiobus()
525 mii_bus->priv = priv; in adin1110_register_mdiobus()
526 mii_bus->parent = dev; in adin1110_register_mdiobus()
527 mii_bus->phy_mask = ~((u32)GENMASK(2, 0)); in adin1110_register_mdiobus()
528 snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); in adin1110_register_mdiobus()
534 priv->mii_bus = mii_bus; in adin1110_register_mdiobus()
542 if (!netif_oper_up(port_priv->netdev)) in adin1110_port_rx_ready()
545 if (!port_priv->nr) in adin1110_port_rx_ready()
554 struct adin1110_priv *priv = port_priv->priv; in adin1110_read_frames()
570 budget--; in adin1110_read_frames()
578 for (i = 0; i < priv->cfg->ports_nr; i++) in adin1110_wake_queues()
579 netif_wake_queue(priv->ports[i]->netdev); in adin1110_wake_queues()
590 mutex_lock(&priv->lock); in adin1110_irq()
596 if (priv->append_crc && (status1 & ADIN1110_SPI_ERR)) in adin1110_irq()
597 dev_warn_ratelimited(&priv->spidev->dev, in adin1110_irq()
604 /* TX FIFO space is expressed in half-words */ in adin1110_irq()
605 priv->tx_space = 2 * val; in adin1110_irq()
607 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_irq()
608 if (adin1110_port_rx_ready(priv->ports[i], status1)) in adin1110_irq()
609 adin1110_read_frames(priv->ports[i], in adin1110_irq()
615 adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask); in adin1110_irq()
618 mutex_unlock(&priv->lock); in adin1110_irq()
620 if (priv->tx_space > 0 && ret >= 0) in adin1110_irq()
631 struct adin1110_priv *priv = port_priv->priv; in adin1110_write_mac_address()
632 u32 offset = mac_nr * 2; in adin1110_write_mac_address()
637 if (!port_priv->nr) in adin1110_write_mac_address()
652 val = get_unaligned_be32(&addr[2]); in adin1110_write_mac_address()
667 val = get_unaligned_be32(&mask[2]); in adin1110_write_mac_address()
678 u32 offset = mac_nr * 2; in adin1110_clear_mac_address()
707 if (!port_priv->nr) in adin1110_port_rules()
715 if (fw_to_other_port && port_priv->priv->forwarding) in adin1110_port_rules()
731 if (accept_multicast && port_priv->state == BR_STATE_FORWARDING) in adin1110_multicast_filter()
746 if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING) in adin1110_broadcasts_filter()
762 return -EADDRNOTAVAIL; in adin1110_set_mac_address()
767 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_set_mac_address()
770 return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr, in adin1110_set_mac_address()
783 return adin1110_set_mac_address(netdev, sa->sa_data); in adin1110_ndo_set_mac_address()
789 return -EINVAL; in adin1110_ioctl()
797 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_promisc_mode()
800 if (port_priv->state != BR_STATE_FORWARDING) in adin1110_set_promisc_mode()
803 if (!port_priv->nr) in adin1110_set_promisc_mode()
817 !!(port_priv->flags & IFF_PROMISC)); in adin1110_setup_rx_mode()
822 !!(port_priv->flags & IFF_ALLMULTI)); in adin1110_setup_rx_mode()
828 !!(port_priv->flags & IFF_BROADCAST)); in adin1110_setup_rx_mode()
832 return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1, in adin1110_setup_rx_mode()
840 if (priv->cfg->id != ADIN2111_MAC) in adin1110_can_offload_forwarding()
844 if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge) in adin1110_can_offload_forwarding()
850 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_can_offload_forwarding()
851 if (priv->ports[i]->state != BR_STATE_FORWARDING) in adin1110_can_offload_forwarding()
864 priv = port_priv->priv; in adin1110_rx_mode_work()
866 mutex_lock(&priv->lock); in adin1110_rx_mode_work()
868 mutex_unlock(&priv->lock); in adin1110_rx_mode_work()
874 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_rx_mode()
876 spin_lock(&priv->state_lock); in adin1110_set_rx_mode()
878 port_priv->flags = dev->flags; in adin1110_set_rx_mode()
879 schedule_work(&port_priv->rx_mode_work); in adin1110_set_rx_mode()
881 spin_unlock(&priv->state_lock); in adin1110_set_rx_mode()
887 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_open()
891 mutex_lock(&priv->lock); in adin1110_net_open()
899 if (priv->cfg->id == ADIN2111_MAC) in adin1110_net_open()
902 priv->irq_mask = val; in adin1110_net_open()
915 priv->tx_space = 2 * val; in adin1110_net_open()
917 port_priv->state = BR_STATE_FORWARDING; in adin1110_net_open()
918 ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr); in adin1110_net_open()
921 net_dev->dev_addr, ret); in adin1110_net_open()
929 mutex_unlock(&priv->lock); in adin1110_net_open()
934 phy_start(port_priv->phydev); in adin1110_net_open()
944 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_stop()
948 mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ; in adin1110_net_stop()
951 mutex_lock(&priv->lock); in adin1110_net_stop()
953 mutex_unlock(&priv->lock); in adin1110_net_stop()
957 netif_stop_queue(port_priv->netdev); in adin1110_net_stop()
958 flush_work(&port_priv->tx_work); in adin1110_net_stop()
959 phy_stop(port_priv->phydev); in adin1110_net_stop()
972 priv = port_priv->priv; in adin1110_tx_work()
974 mutex_lock(&priv->lock); in adin1110_tx_work()
976 while ((txb = skb_dequeue(&port_priv->txq))) { in adin1110_tx_work()
979 dev_err_ratelimited(&priv->spidev->dev, in adin1110_tx_work()
985 mutex_unlock(&priv->lock); in adin1110_tx_work()
991 struct adin1110_priv *priv = port_priv->priv; in adin1110_start_xmit()
995 tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN; in adin1110_start_xmit()
996 if (tx_space_needed > priv->tx_space) { in adin1110_start_xmit()
1000 priv->tx_space -= tx_space_needed; in adin1110_start_xmit()
1001 skb_queue_tail(&port_priv->txq, skb); in adin1110_start_xmit()
1004 schedule_work(&port_priv->tx_work); in adin1110_start_xmit()
1014 storage->rx_packets = port_priv->rx_packets; in adin1110_ndo_get_stats64()
1015 storage->tx_packets = port_priv->tx_packets; in adin1110_ndo_get_stats64()
1017 storage->rx_bytes = port_priv->rx_bytes; in adin1110_ndo_get_stats64()
1018 storage->tx_bytes = port_priv->tx_bytes; in adin1110_ndo_get_stats64()
1025 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_get_port_parent_id()
1027 ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN); in adin1110_port_get_port_parent_id()
1028 memcpy(ppid->id, priv->mii_bus_name, ppid->id_len); in adin1110_port_get_port_parent_id()
1039 err = snprintf(name, len, "p%d", port_priv->nr); in adin1110_ndo_get_phys_port_name()
1041 return -EINVAL; in adin1110_ndo_get_phys_port_name()
1062 strscpy(di->driver, "ADIN1110", sizeof(di->driver)); in adin1110_get_drvinfo()
1063 strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info)); in adin1110_get_drvinfo()
1075 struct phy_device *phydev = dev->phydev; in adin1110_adjust_link()
1077 if (!phydev->link) in adin1110_adjust_link()
1081 /* PHY ID is stored in the MAC registers too,
1090 reset_gpio = devm_gpiod_get_optional(&priv->spidev->dev, "reset", in adin1110_check_spi()
1096 spi_bus_lock(priv->spidev->controller); in adin1110_check_spi()
1107 spi_bus_unlock(priv->spidev->controller); in adin1110_check_spi()
1114 if (val != priv->cfg->phy_id_val) { in adin1110_check_spi()
1115 dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n", in adin1110_check_spi()
1116 priv->cfg->phy_id_val, val); in adin1110_check_spi()
1117 return -EIO; in adin1110_check_spi()
1128 priv->forwarding = enable; in adin1110_hw_forwarding()
1130 if (!priv->forwarding) { in adin1110_hw_forwarding()
1141 priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0); in adin1110_hw_forwarding()
1145 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_hw_forwarding()
1146 ret = adin1110_setup_rx_mode(priv->ports[i]); in adin1110_hw_forwarding()
1157 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_join()
1160 port_priv->bridge = bridge; in adin1110_port_bridge_join()
1163 mutex_lock(&priv->lock); in adin1110_port_bridge_join()
1165 mutex_unlock(&priv->lock); in adin1110_port_bridge_join()
1171 return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr); in adin1110_port_bridge_join()
1177 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_leave()
1180 port_priv->bridge = NULL; in adin1110_port_bridge_leave()
1182 mutex_lock(&priv->lock); in adin1110_port_bridge_leave()
1184 mutex_unlock(&priv->lock); in adin1110_port_bridge_leave()
1191 return dev->netdev_ops == &adin1110_netdev_ops; in adin1110_port_dev_check()
1207 if (netif_is_bridge_master(info->upper_dev)) { in adin1110_netdevice_event()
1208 if (info->linking) in adin1110_netdevice_event()
1209 ret = adin1110_port_bridge_join(port_priv, info->upper_dev); in adin1110_netdevice_event()
1211 ret = adin1110_port_bridge_leave(port_priv, info->upper_dev); in adin1110_netdevice_event()
1232 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_forwarding_state()
1235 port_priv->state = BR_STATE_FORWARDING; in adin1110_port_set_forwarding_state()
1237 mutex_lock(&priv->lock); in adin1110_port_set_forwarding_state()
1238 ret = adin1110_set_mac_address(port_priv->netdev, in adin1110_port_set_forwarding_state()
1239 port_priv->netdev->dev_addr); in adin1110_port_set_forwarding_state()
1248 mutex_unlock(&priv->lock); in adin1110_port_set_forwarding_state()
1256 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_blocking_state()
1262 port_priv->state = BR_STATE_BLOCKING; in adin1110_port_set_blocking_state()
1264 mutex_lock(&priv->lock); in adin1110_port_set_blocking_state()
1266 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_port_set_blocking_state()
1281 mutex_unlock(&priv->lock); in adin1110_port_set_blocking_state()
1302 return -EINVAL; in adin1110_port_attr_stp_state_set()
1312 switch (attr->id) { in adin1110_port_attr_set()
1315 attr->u.stp_state); in adin1110_port_attr_set()
1317 return -EOPNOTSUPP; in adin1110_port_attr_set()
1348 info.addr = rcv->addr; in adin1110_fdb_offload_notify()
1349 info.vid = rcv->vid; in adin1110_fdb_offload_notify()
1358 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_add()
1366 netdev_dbg(port_priv->netdev, in adin1110_fdb_add()
1367 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n", in adin1110_fdb_add()
1368 __func__, fdb->addr, fdb->vid, fdb->added_by_user, in adin1110_fdb_add()
1369 fdb->offloaded, port_priv->nr); in adin1110_fdb_add()
1371 if (!priv->forwarding) in adin1110_fdb_add()
1374 if (fdb->is_local) in adin1110_fdb_add()
1375 return -EINVAL; in adin1110_fdb_add()
1379 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val); in adin1110_fdb_add()
1387 return -ENOMEM; in adin1110_fdb_add()
1389 other_port = priv->ports[!port_priv->nr]; in adin1110_fdb_add()
1393 return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr, in adin1110_fdb_add()
1402 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val); in adin1110_read_mac()
1408 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + (mac_nr * 2), &val); in adin1110_read_mac()
1412 put_unaligned_be32(val, addr + 2); in adin1110_read_mac()
1420 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_del()
1425 netdev_dbg(port_priv->netdev, in adin1110_fdb_del()
1426 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n", in adin1110_fdb_del()
1427 __func__, fdb->addr, fdb->vid, fdb->added_by_user, in adin1110_fdb_del()
1428 fdb->offloaded, port_priv->nr); in adin1110_fdb_del()
1430 if (fdb->is_local) in adin1110_fdb_del()
1431 return -EINVAL; in adin1110_fdb_del()
1438 if (ether_addr_equal(addr, fdb->addr)) { in adin1110_fdb_del()
1455 port_priv = switchdev_work->port_priv; in adin1110_switchdev_event_work()
1457 mutex_lock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1459 switch (switchdev_work->event) { in adin1110_switchdev_event_work()
1461 ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1463 adin1110_fdb_offload_notify(port_priv->netdev, in adin1110_switchdev_event_work()
1464 &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1467 adin1110_fdb_del(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1473 mutex_unlock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1475 kfree(switchdev_work->fdb_info.addr); in adin1110_switchdev_event_work()
1477 dev_put(port_priv->netdev); in adin1110_switchdev_event_work()
1496 INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work); in adin1110_switchdev_event()
1497 switchdev_work->port_priv = port_priv; in adin1110_switchdev_event()
1498 switchdev_work->event = event; in adin1110_switchdev_event()
1503 memcpy(&switchdev_work->fdb_info, ptr, in adin1110_switchdev_event()
1504 sizeof(switchdev_work->fdb_info)); in adin1110_switchdev_event()
1505 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC); in adin1110_switchdev_event()
1507 if (!switchdev_work->fdb_info.addr) in adin1110_switchdev_event()
1510 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, in adin1110_switchdev_event()
1511 fdb_info->addr); in adin1110_switchdev_event()
1519 queue_work(system_long_wq, &switchdev_work->work); in adin1110_switchdev_event()
1568 struct device *dev = &priv->spidev->dev; in adin1110_probe_netdevs()
1574 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_probe_netdevs()
1577 return -ENOMEM; in adin1110_probe_netdevs()
1580 port_priv->netdev = netdev; in adin1110_probe_netdevs()
1581 port_priv->priv = priv; in adin1110_probe_netdevs()
1582 port_priv->cfg = priv->cfg; in adin1110_probe_netdevs()
1583 port_priv->nr = i; in adin1110_probe_netdevs()
1584 priv->ports[i] = port_priv; in adin1110_probe_netdevs()
1591 netdev->irq = priv->spidev->irq; in adin1110_probe_netdevs()
1592 INIT_WORK(&port_priv->tx_work, adin1110_tx_work); in adin1110_probe_netdevs()
1593 INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work); in adin1110_probe_netdevs()
1594 skb_queue_head_init(&port_priv->txq); in adin1110_probe_netdevs()
1598 netdev->if_port = IF_PORT_10BASET; in adin1110_probe_netdevs()
1599 netdev->netdev_ops = &adin1110_netdev_ops; in adin1110_probe_netdevs()
1600 netdev->ethtool_ops = &adin1110_ethtool_ops; in adin1110_probe_netdevs()
1601 netdev->priv_flags |= IFF_UNICAST_FLT; in adin1110_probe_netdevs()
1602 netdev->netns_local = true; in adin1110_probe_netdevs()
1604 port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false); in adin1110_probe_netdevs()
1605 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1606 netdev_err(netdev, "Could not find PHY with device address: %d.\n", i); in adin1110_probe_netdevs()
1607 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1610 port_priv->phydev = phy_connect(netdev, in adin1110_probe_netdevs()
1611 phydev_name(port_priv->phydev), in adin1110_probe_netdevs()
1614 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1615 netdev_err(netdev, "Could not connect PHY with device address: %d.\n", i); in adin1110_probe_netdevs()
1616 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1620 port_priv->phydev); in adin1110_probe_netdevs()
1626 ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL, in adin1110_probe_netdevs()
1633 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_probe_netdevs()
1634 ret = devm_register_netdev(dev, priv->ports[i]->netdev); in adin1110_probe_netdevs()
1647 struct device *dev = &spi->dev; in adin1110_probe()
1653 return -ENOMEM; in adin1110_probe()
1655 priv->spidev = spi; in adin1110_probe()
1656 priv->cfg = &adin1110_cfgs[dev_id->driver_data]; in adin1110_probe()
1657 spi->bits_per_word = 8; in adin1110_probe()
1658 spi->mode = SPI_MODE_0; in adin1110_probe()
1660 mutex_init(&priv->lock); in adin1110_probe()
1661 spin_lock_init(&priv->state_lock); in adin1110_probe()
1664 priv->append_crc = device_property_read_bool(dev, "adi,spi-crc"); in adin1110_probe()
1665 if (priv->append_crc) in adin1110_probe()