Lines Matching +full:10 +full:base +full:- +full:t1l

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
49 #define ADIN1110_SPI_ERR BIT(10)
54 #define ADIN1110_SPI_ERR_IRQ BIT(10)
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()
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()
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()
478 struct adin1110_priv *priv = bus->priv; in adin1110_mdio_write()
483 return -EOPNOTSUPP; in adin1110_mdio_write()
492 mutex_lock(&priv->lock); in adin1110_mdio_write()
494 mutex_unlock(&priv->lock); in adin1110_mdio_write()
502 /* ADIN1110 MAC-PHY contains an ADIN1100 PHY.
503 * ADIN2111 MAC-PHY contains two ADIN1100 PHYs.
515 return -ENOMEM; in adin1110_register_mdiobus()
517 snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u", in adin1110_register_mdiobus()
518 priv->cfg->name, spi_get_chipselect(priv->spidev, 0)); in adin1110_register_mdiobus()
520 mii_bus->name = priv->mii_bus_name; in adin1110_register_mdiobus()
521 mii_bus->read = adin1110_mdio_read; in adin1110_register_mdiobus()
522 mii_bus->write = adin1110_mdio_write; in adin1110_register_mdiobus()
523 mii_bus->priv = priv; in adin1110_register_mdiobus()
524 mii_bus->parent = dev; in adin1110_register_mdiobus()
525 mii_bus->phy_mask = ~((u32)GENMASK(2, 0)); in adin1110_register_mdiobus()
526 snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); in adin1110_register_mdiobus()
532 priv->mii_bus = mii_bus; in adin1110_register_mdiobus()
540 if (!netif_oper_up(port_priv->netdev)) in adin1110_port_rx_ready()
543 if (!port_priv->nr) in adin1110_port_rx_ready()
552 struct adin1110_priv *priv = port_priv->priv; in adin1110_read_frames()
568 budget--; in adin1110_read_frames()
576 for (i = 0; i < priv->cfg->ports_nr; i++) in adin1110_wake_queues()
577 netif_wake_queue(priv->ports[i]->netdev); in adin1110_wake_queues()
588 mutex_lock(&priv->lock); in adin1110_irq()
594 if (priv->append_crc && (status1 & ADIN1110_SPI_ERR)) in adin1110_irq()
595 dev_warn_ratelimited(&priv->spidev->dev, in adin1110_irq()
602 /* TX FIFO space is expressed in half-words */ in adin1110_irq()
603 priv->tx_space = 2 * val; in adin1110_irq()
605 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_irq()
606 if (adin1110_port_rx_ready(priv->ports[i], status1)) in adin1110_irq()
607 adin1110_read_frames(priv->ports[i], in adin1110_irq()
613 adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask); in adin1110_irq()
616 mutex_unlock(&priv->lock); in adin1110_irq()
618 if (priv->tx_space > 0 && ret >= 0) in adin1110_irq()
629 struct adin1110_priv *priv = port_priv->priv; in adin1110_write_mac_address()
635 if (!port_priv->nr) in adin1110_write_mac_address()
705 if (!port_priv->nr) in adin1110_port_rules()
713 if (fw_to_other_port && port_priv->priv->forwarding) in adin1110_port_rules()
729 if (accept_multicast && port_priv->state == BR_STATE_FORWARDING) in adin1110_multicast_filter()
744 if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING) in adin1110_broadcasts_filter()
760 return -EADDRNOTAVAIL; in adin1110_set_mac_address()
765 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_set_mac_address()
768 return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr, in adin1110_set_mac_address()
781 return adin1110_set_mac_address(netdev, sa->sa_data); in adin1110_ndo_set_mac_address()
787 return -EINVAL; in adin1110_ioctl()
795 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_promisc_mode()
798 if (port_priv->state != BR_STATE_FORWARDING) in adin1110_set_promisc_mode()
801 if (!port_priv->nr) in adin1110_set_promisc_mode()
815 !!(port_priv->flags & IFF_PROMISC)); in adin1110_setup_rx_mode()
820 !!(port_priv->flags & IFF_ALLMULTI)); in adin1110_setup_rx_mode()
826 !!(port_priv->flags & IFF_BROADCAST)); in adin1110_setup_rx_mode()
830 return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1, in adin1110_setup_rx_mode()
838 if (priv->cfg->id != ADIN2111_MAC) in adin1110_can_offload_forwarding()
842 if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge) in adin1110_can_offload_forwarding()
848 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_can_offload_forwarding()
849 if (priv->ports[i]->state != BR_STATE_FORWARDING) in adin1110_can_offload_forwarding()
862 priv = port_priv->priv; in adin1110_rx_mode_work()
864 mutex_lock(&priv->lock); in adin1110_rx_mode_work()
866 mutex_unlock(&priv->lock); in adin1110_rx_mode_work()
872 struct adin1110_priv *priv = port_priv->priv; in adin1110_set_rx_mode()
874 spin_lock(&priv->state_lock); in adin1110_set_rx_mode()
876 port_priv->flags = dev->flags; in adin1110_set_rx_mode()
877 schedule_work(&port_priv->rx_mode_work); in adin1110_set_rx_mode()
879 spin_unlock(&priv->state_lock); in adin1110_set_rx_mode()
885 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_open()
889 mutex_lock(&priv->lock); in adin1110_net_open()
897 if (priv->cfg->id == ADIN2111_MAC) in adin1110_net_open()
900 priv->irq_mask = val; in adin1110_net_open()
913 priv->tx_space = 2 * val; in adin1110_net_open()
915 port_priv->state = BR_STATE_FORWARDING; in adin1110_net_open()
916 ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr); in adin1110_net_open()
919 net_dev->dev_addr, ret); in adin1110_net_open()
927 mutex_unlock(&priv->lock); in adin1110_net_open()
932 phy_start(port_priv->phydev); in adin1110_net_open()
942 struct adin1110_priv *priv = port_priv->priv; in adin1110_net_stop()
946 mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ; in adin1110_net_stop()
949 mutex_lock(&priv->lock); in adin1110_net_stop()
951 mutex_unlock(&priv->lock); in adin1110_net_stop()
955 netif_stop_queue(port_priv->netdev); in adin1110_net_stop()
956 flush_work(&port_priv->tx_work); in adin1110_net_stop()
957 phy_stop(port_priv->phydev); in adin1110_net_stop()
970 priv = port_priv->priv; in adin1110_tx_work()
972 mutex_lock(&priv->lock); in adin1110_tx_work()
974 while ((txb = skb_dequeue(&port_priv->txq))) { in adin1110_tx_work()
977 dev_err_ratelimited(&priv->spidev->dev, in adin1110_tx_work()
983 mutex_unlock(&priv->lock); in adin1110_tx_work()
989 struct adin1110_priv *priv = port_priv->priv; in adin1110_start_xmit()
993 tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN; in adin1110_start_xmit()
994 if (tx_space_needed > priv->tx_space) { in adin1110_start_xmit()
998 priv->tx_space -= tx_space_needed; in adin1110_start_xmit()
999 skb_queue_tail(&port_priv->txq, skb); in adin1110_start_xmit()
1002 schedule_work(&port_priv->tx_work); in adin1110_start_xmit()
1012 storage->rx_packets = port_priv->rx_packets; in adin1110_ndo_get_stats64()
1013 storage->tx_packets = port_priv->tx_packets; in adin1110_ndo_get_stats64()
1015 storage->rx_bytes = port_priv->rx_bytes; in adin1110_ndo_get_stats64()
1016 storage->tx_bytes = port_priv->tx_bytes; in adin1110_ndo_get_stats64()
1023 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_get_port_parent_id()
1025 ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN); in adin1110_port_get_port_parent_id()
1026 memcpy(ppid->id, priv->mii_bus_name, ppid->id_len); in adin1110_port_get_port_parent_id()
1037 err = snprintf(name, len, "p%d", port_priv->nr); in adin1110_ndo_get_phys_port_name()
1039 return -EINVAL; in adin1110_ndo_get_phys_port_name()
1060 strscpy(di->driver, "ADIN1110", sizeof(di->driver)); in adin1110_get_drvinfo()
1061 strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info)); in adin1110_get_drvinfo()
1073 struct phy_device *phydev = dev->phydev; in adin1110_adjust_link()
1075 if (!phydev->link) in adin1110_adjust_link()
1088 reset_gpio = devm_gpiod_get_optional(&priv->spidev->dev, "reset", in adin1110_check_spi()
1094 spi_bus_lock(priv->spidev->controller); in adin1110_check_spi()
1105 spi_bus_unlock(priv->spidev->controller); in adin1110_check_spi()
1112 if (val != priv->cfg->phy_id_val) { in adin1110_check_spi()
1113 dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n", in adin1110_check_spi()
1114 priv->cfg->phy_id_val, val); in adin1110_check_spi()
1115 return -EIO; in adin1110_check_spi()
1126 priv->forwarding = enable; in adin1110_hw_forwarding()
1128 if (!priv->forwarding) { in adin1110_hw_forwarding()
1139 priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0); in adin1110_hw_forwarding()
1143 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_hw_forwarding()
1144 ret = adin1110_setup_rx_mode(priv->ports[i]); in adin1110_hw_forwarding()
1155 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_join()
1158 port_priv->bridge = bridge; in adin1110_port_bridge_join()
1161 mutex_lock(&priv->lock); in adin1110_port_bridge_join()
1163 mutex_unlock(&priv->lock); in adin1110_port_bridge_join()
1169 return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr); in adin1110_port_bridge_join()
1175 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_bridge_leave()
1178 port_priv->bridge = NULL; in adin1110_port_bridge_leave()
1180 mutex_lock(&priv->lock); in adin1110_port_bridge_leave()
1182 mutex_unlock(&priv->lock); in adin1110_port_bridge_leave()
1189 return dev->netdev_ops == &adin1110_netdev_ops; in adin1110_port_dev_check()
1205 if (netif_is_bridge_master(info->upper_dev)) { in adin1110_netdevice_event()
1206 if (info->linking) in adin1110_netdevice_event()
1207 ret = adin1110_port_bridge_join(port_priv, info->upper_dev); in adin1110_netdevice_event()
1209 ret = adin1110_port_bridge_leave(port_priv, info->upper_dev); in adin1110_netdevice_event()
1230 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_forwarding_state()
1233 port_priv->state = BR_STATE_FORWARDING; in adin1110_port_set_forwarding_state()
1235 mutex_lock(&priv->lock); in adin1110_port_set_forwarding_state()
1236 ret = adin1110_set_mac_address(port_priv->netdev, in adin1110_port_set_forwarding_state()
1237 port_priv->netdev->dev_addr); in adin1110_port_set_forwarding_state()
1246 mutex_unlock(&priv->lock); in adin1110_port_set_forwarding_state()
1254 struct adin1110_priv *priv = port_priv->priv; in adin1110_port_set_blocking_state()
1260 port_priv->state = BR_STATE_BLOCKING; in adin1110_port_set_blocking_state()
1262 mutex_lock(&priv->lock); in adin1110_port_set_blocking_state()
1264 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT; in adin1110_port_set_blocking_state()
1279 mutex_unlock(&priv->lock); in adin1110_port_set_blocking_state()
1300 return -EINVAL; in adin1110_port_attr_stp_state_set()
1310 switch (attr->id) { in adin1110_port_attr_set()
1313 attr->u.stp_state); in adin1110_port_attr_set()
1315 return -EOPNOTSUPP; in adin1110_port_attr_set()
1346 info.addr = rcv->addr; in adin1110_fdb_offload_notify()
1347 info.vid = rcv->vid; in adin1110_fdb_offload_notify()
1356 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_add()
1364 netdev_dbg(port_priv->netdev, in adin1110_fdb_add()
1365 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n", in adin1110_fdb_add()
1366 __func__, fdb->addr, fdb->vid, fdb->added_by_user, in adin1110_fdb_add()
1367 fdb->offloaded, port_priv->nr); in adin1110_fdb_add()
1369 if (!priv->forwarding) in adin1110_fdb_add()
1372 if (fdb->is_local) in adin1110_fdb_add()
1373 return -EINVAL; in adin1110_fdb_add()
1385 return -ENOMEM; in adin1110_fdb_add()
1387 other_port = priv->ports[!port_priv->nr]; in adin1110_fdb_add()
1391 return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr, in adin1110_fdb_add()
1418 struct adin1110_priv *priv = port_priv->priv; in adin1110_fdb_del()
1423 netdev_dbg(port_priv->netdev, in adin1110_fdb_del()
1424 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n", in adin1110_fdb_del()
1425 __func__, fdb->addr, fdb->vid, fdb->added_by_user, in adin1110_fdb_del()
1426 fdb->offloaded, port_priv->nr); in adin1110_fdb_del()
1428 if (fdb->is_local) in adin1110_fdb_del()
1429 return -EINVAL; in adin1110_fdb_del()
1436 if (ether_addr_equal(addr, fdb->addr)) { in adin1110_fdb_del()
1453 port_priv = switchdev_work->port_priv; in adin1110_switchdev_event_work()
1455 mutex_lock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1457 switch (switchdev_work->event) { in adin1110_switchdev_event_work()
1459 ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1461 adin1110_fdb_offload_notify(port_priv->netdev, in adin1110_switchdev_event_work()
1462 &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1465 adin1110_fdb_del(port_priv, &switchdev_work->fdb_info); in adin1110_switchdev_event_work()
1471 mutex_unlock(&port_priv->priv->lock); in adin1110_switchdev_event_work()
1473 kfree(switchdev_work->fdb_info.addr); in adin1110_switchdev_event_work()
1475 dev_put(port_priv->netdev); in adin1110_switchdev_event_work()
1494 INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work); in adin1110_switchdev_event()
1495 switchdev_work->port_priv = port_priv; in adin1110_switchdev_event()
1496 switchdev_work->event = event; in adin1110_switchdev_event()
1501 memcpy(&switchdev_work->fdb_info, ptr, in adin1110_switchdev_event()
1502 sizeof(switchdev_work->fdb_info)); in adin1110_switchdev_event()
1503 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC); in adin1110_switchdev_event()
1505 if (!switchdev_work->fdb_info.addr) in adin1110_switchdev_event()
1508 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, in adin1110_switchdev_event()
1509 fdb_info->addr); in adin1110_switchdev_event()
1517 queue_work(system_long_wq, &switchdev_work->work); in adin1110_switchdev_event()
1566 struct device *dev = &priv->spidev->dev; in adin1110_probe_netdevs()
1572 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_probe_netdevs()
1575 return -ENOMEM; in adin1110_probe_netdevs()
1578 port_priv->netdev = netdev; in adin1110_probe_netdevs()
1579 port_priv->priv = priv; in adin1110_probe_netdevs()
1580 port_priv->cfg = priv->cfg; in adin1110_probe_netdevs()
1581 port_priv->nr = i; in adin1110_probe_netdevs()
1582 priv->ports[i] = port_priv; in adin1110_probe_netdevs()
1589 netdev->irq = priv->spidev->irq; in adin1110_probe_netdevs()
1590 INIT_WORK(&port_priv->tx_work, adin1110_tx_work); in adin1110_probe_netdevs()
1591 INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work); in adin1110_probe_netdevs()
1592 skb_queue_head_init(&port_priv->txq); in adin1110_probe_netdevs()
1596 netdev->if_port = IF_PORT_10BASET; in adin1110_probe_netdevs()
1597 netdev->netdev_ops = &adin1110_netdev_ops; in adin1110_probe_netdevs()
1598 netdev->ethtool_ops = &adin1110_ethtool_ops; in adin1110_probe_netdevs()
1599 netdev->priv_flags |= IFF_UNICAST_FLT; in adin1110_probe_netdevs()
1600 netdev->features |= NETIF_F_NETNS_LOCAL; in adin1110_probe_netdevs()
1602 port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false); in adin1110_probe_netdevs()
1603 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1605 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1608 port_priv->phydev = phy_connect(netdev, in adin1110_probe_netdevs()
1609 phydev_name(port_priv->phydev), in adin1110_probe_netdevs()
1612 if (IS_ERR(port_priv->phydev)) { in adin1110_probe_netdevs()
1614 return PTR_ERR(port_priv->phydev); in adin1110_probe_netdevs()
1618 port_priv->phydev); in adin1110_probe_netdevs()
1624 ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL, in adin1110_probe_netdevs()
1631 for (i = 0; i < priv->cfg->ports_nr; i++) { in adin1110_probe_netdevs()
1632 ret = devm_register_netdev(dev, priv->ports[i]->netdev); in adin1110_probe_netdevs()
1645 struct device *dev = &spi->dev; in adin1110_probe()
1651 return -ENOMEM; in adin1110_probe()
1653 priv->spidev = spi; in adin1110_probe()
1654 priv->cfg = &adin1110_cfgs[dev_id->driver_data]; in adin1110_probe()
1655 spi->bits_per_word = 8; in adin1110_probe()
1656 spi->mode = SPI_MODE_0; in adin1110_probe()
1658 mutex_init(&priv->lock); in adin1110_probe()
1659 spin_lock_init(&priv->state_lock); in adin1110_probe()
1662 priv->append_crc = device_property_read_bool(dev, "adi,spi-crc"); in adin1110_probe()
1663 if (priv->append_crc) in adin1110_probe()