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
5 * Copyright 2021 Analog Devices Inc.
8 #include <linux/bitfield.h>
9 #include <linux/bits.h>
10 #include <linux/cache.h>
11 #include <linux/crc8.h>
12 #include <linux/etherdevice.h>
13 #include <linux/ethtool.h>
14 #include <linux/if_bridge.h>
15 #include <linux/interrupt.h>
16 #include <linux/iopoll.h>
17 #include <linux/gpio.h>
18 #include <linux/kernel.h>
19 #include <linux/mii.h>
20 #include <linux/module.h>
21 #include <linux/netdevice.h>
22 #include <linux/regulator/consumer.h>
23 #include <linux/phy.h>
24 #include <linux/property.h>
25 #include <linux/spi/spi.h>
27 #include <net/switchdev.h>
29 #include <asm/unaligned.h>
31 #define ADIN1110_PHY_ID 0x1
33 #define ADIN1110_RESET 0x03
34 #define ADIN1110_SWRESET BIT(0)
36 #define ADIN1110_CONFIG1 0x04
37 #define ADIN1110_CONFIG1_SYNC BIT(15)
39 #define ADIN1110_CONFIG2 0x06
40 #define ADIN2111_P2_FWD_UNK2HOST BIT(12)
41 #define ADIN2111_PORT_CUT_THRU_EN BIT(11)
42 #define ADIN1110_CRC_APPEND BIT(5)
43 #define ADIN1110_FWD_UNK2HOST BIT(2)
45 #define ADIN1110_STATUS0 0x08
47 #define ADIN1110_STATUS1 0x09
48 #define ADIN2111_P2_RX_RDY BIT(17)
49 #define ADIN1110_SPI_ERR BIT(10)
50 #define ADIN1110_RX_RDY BIT(4)
52 #define ADIN1110_IMASK1 0x0D
53 #define ADIN2111_RX_RDY_IRQ BIT(17)
54 #define ADIN1110_SPI_ERR_IRQ BIT(10)
55 #define ADIN1110_RX_RDY_IRQ BIT(4)
56 #define ADIN1110_TX_RDY_IRQ BIT(3)
58 #define ADIN1110_MDIOACC 0x20
59 #define ADIN1110_MDIO_TRDONE BIT(31)
60 #define ADIN1110_MDIO_ST GENMASK(29, 28)
61 #define ADIN1110_MDIO_OP GENMASK(27, 26)
62 #define ADIN1110_MDIO_PRTAD GENMASK(25, 21)
63 #define ADIN1110_MDIO_DEVAD GENMASK(20, 16)
64 #define ADIN1110_MDIO_DATA GENMASK(15, 0)
66 #define ADIN1110_TX_FSIZE 0x30
67 #define ADIN1110_TX 0x31
68 #define ADIN1110_TX_SPACE 0x32
70 #define ADIN1110_MAC_ADDR_FILTER_UPR 0x50
71 #define ADIN2111_MAC_ADDR_APPLY2PORT2 BIT(31)
72 #define ADIN1110_MAC_ADDR_APPLY2PORT BIT(30)
73 #define ADIN2111_MAC_ADDR_TO_OTHER_PORT BIT(17)
74 #define ADIN1110_MAC_ADDR_TO_HOST BIT(16)
76 #define ADIN1110_MAC_ADDR_FILTER_LWR 0x51
78 #define ADIN1110_MAC_ADDR_MASK_UPR 0x70
79 #define ADIN1110_MAC_ADDR_MASK_LWR 0x71
81 #define ADIN1110_RX_FSIZE 0x90
82 #define ADIN1110_RX 0x91
84 #define ADIN2111_RX_P2_FSIZE 0xC0
85 #define ADIN2111_RX_P2 0xC1
87 #define ADIN1110_CLEAR_STATUS0 0xFFF
90 #define ADIN1110_MDIO_OP_WR 0x1
91 #define ADIN1110_MDIO_OP_RD 0x3
93 #define ADIN1110_CD BIT(7)
94 #define ADIN1110_WRITE BIT(5)
96 #define ADIN1110_MAX_BUFF 2048
97 #define ADIN1110_MAX_FRAMES_READ 64
98 #define ADIN1110_WR_HEADER_LEN 2
99 #define ADIN1110_FRAME_HEADER_LEN 2
100 #define ADIN1110_INTERNAL_SIZE_HEADER_LEN 2
101 #define ADIN1110_RD_HEADER_LEN 3
102 #define ADIN1110_REG_LEN 4
103 #define ADIN1110_FEC_LEN 4
105 #define ADIN1110_PHY_ID_VAL 0x0283BC91
106 #define ADIN2111_PHY_ID_VAL 0x0283BCA1
108 #define ADIN_MAC_MAX_PORTS 2
109 #define ADIN_MAC_MAX_ADDR_SLOTS 16
111 #define ADIN_MAC_MULTICAST_ADDR_SLOT 0
112 #define ADIN_MAC_BROADCAST_ADDR_SLOT 1
113 #define ADIN_MAC_P1_ADDR_SLOT 2
114 #define ADIN_MAC_P2_ADDR_SLOT 3
115 #define ADIN_MAC_FDB_ADDR_SLOT 4
117 DECLARE_CRC8_TABLE(adin1110_crc_table);
119 enum adin1110_chips_id {
124 struct adin1110_cfg {
125 enum adin1110_chips_id id;
126 char name[MDIO_NAME_SIZE];
127 u32 phy_ids[PHY_MAX_ADDR];
132 struct adin1110_port_priv {
133 struct adin1110_priv *priv;
134 struct net_device *netdev;
135 struct net_device *bridge;
136 struct phy_device *phydev;
137 struct work_struct tx_work;
142 struct work_struct rx_mode_work;
144 struct sk_buff_head txq;
147 struct adin1110_cfg *cfg;
150 struct adin1110_priv {
151 struct mutex lock; /* protect spi */
152 spinlock_t state_lock; /* protect RX mode */
153 struct mii_bus *mii_bus;
154 struct spi_device *spidev;
156 struct adin1110_cfg *cfg;
161 struct adin1110_port_priv *ports[ADIN_MAC_MAX_PORTS];
162 char mii_bus_name[MII_BUS_ID_SIZE];
163 u8 data[ADIN1110_MAX_BUFF] ____cacheline_aligned;
166 struct adin1110_switchdev_event_work {
167 struct work_struct work;
168 struct switchdev_notifier_fdb_info fdb_info;
169 struct adin1110_port_priv *port_priv;
173 static struct adin1110_cfg adin1110_cfgs[] = {
179 .phy_id_val = ADIN1110_PHY_ID_VAL,
186 .phy_id_val = ADIN2111_PHY_ID_VAL,
190 static u8 adin1110_crc_data(u8 *data, u32 len)
192 return crc8(adin1110_crc_table, data, len, 0);
195 static int adin1110_read_reg(struct adin1110_priv *priv, u16 reg, u32 *val)
197 u32 header_len = ADIN1110_RD_HEADER_LEN;
198 u32 read_len = ADIN1110_REG_LEN;
199 struct spi_transfer t = {0};
202 priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg);
203 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
204 priv->data[2] = 0x00;
206 if (priv->append_crc) {
207 priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
208 priv->data[3] = 0x00;
212 if (priv->append_crc)
215 memset(&priv->data[header_len], 0, read_len);
216 t.tx_buf = &priv->data[0];
217 t.rx_buf = &priv->data[0];
218 t.len = read_len + header_len;
220 ret = spi_sync_transfer(priv->spidev, &t, 1);
224 if (priv->append_crc) {
228 crc = adin1110_crc_data(&priv->data[header_len],
230 recv_crc = priv->data[header_len + ADIN1110_REG_LEN];
232 if (crc != recv_crc) {
233 dev_err_ratelimited(&priv->spidev->dev, "CRC error.");
238 *val = get_unaligned_be32(&priv->data[header_len]);
243 static int adin1110_write_reg(struct adin1110_priv *priv, u16 reg, u32 val)
245 u32 header_len = ADIN1110_WR_HEADER_LEN;
246 u32 write_len = ADIN1110_REG_LEN;
248 priv->data[0] = ADIN1110_CD | ADIN1110_WRITE | FIELD_GET(GENMASK(12, 8), reg);
249 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
251 if (priv->append_crc) {
252 priv->data[2] = adin1110_crc_data(&priv->data[0], header_len);
256 put_unaligned_be32(val, &priv->data[header_len]);
257 if (priv->append_crc) {
258 priv->data[header_len + write_len] = adin1110_crc_data(&priv->data[header_len],
263 return spi_write(priv->spidev, &priv->data[0], header_len + write_len);
266 static int adin1110_set_bits(struct adin1110_priv *priv, u16 reg,
267 unsigned long mask, unsigned long val)
272 ret = adin1110_read_reg(priv, reg, &write_val);
276 set_mask_bits(&write_val, mask, val);
278 return adin1110_write_reg(priv, reg, write_val);
281 static int adin1110_round_len(int len)
283 /* can read/write only mutiples of 4 bytes of payload */
286 /* NOTE: ADIN1110_WR_HEADER_LEN should be used for write ops. */
287 if (len + ADIN1110_RD_HEADER_LEN > ADIN1110_MAX_BUFF)
293 static int adin1110_read_fifo(struct adin1110_port_priv *port_priv)
295 struct adin1110_priv *priv = port_priv->priv;
296 u32 header_len = ADIN1110_RD_HEADER_LEN;
297 struct spi_transfer t;
298 u32 frame_size_no_fcs;
305 if (!port_priv->nr) {
307 ret = adin1110_read_reg(priv, ADIN1110_RX_FSIZE, &frame_size);
309 reg = ADIN2111_RX_P2;
310 ret = adin1110_read_reg(priv, ADIN2111_RX_P2_FSIZE,
317 /* The read frame size includes the extra 2 bytes
318 * from the ADIN1110 frame header.
320 if (frame_size < ADIN1110_FRAME_HEADER_LEN + ADIN1110_FEC_LEN)
323 round_len = adin1110_round_len(frame_size);
327 frame_size_no_fcs = frame_size - ADIN1110_FRAME_HEADER_LEN - ADIN1110_FEC_LEN;
328 memset(priv->data, 0, ADIN1110_RD_HEADER_LEN);
330 priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg);
331 priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
333 if (priv->append_crc) {
334 priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
338 rxb = netdev_alloc_skb(port_priv->netdev, round_len + header_len);
342 skb_put(rxb, frame_size_no_fcs + header_len + ADIN1110_FRAME_HEADER_LEN);
344 t.tx_buf = &priv->data[0];
345 t.rx_buf = &rxb->data[0];
346 t.len = header_len + round_len;
348 ret = spi_sync_transfer(priv->spidev, &t, 1);
354 skb_pull(rxb, header_len + ADIN1110_FRAME_HEADER_LEN);
355 rxb->protocol = eth_type_trans(rxb, port_priv->netdev);
357 if ((port_priv->flags & IFF_ALLMULTI && rxb->pkt_type == PACKET_MULTICAST) ||
358 (port_priv->flags & IFF_BROADCAST && rxb->pkt_type == PACKET_BROADCAST))
359 rxb->offload_fwd_mark = 1;
363 port_priv->rx_bytes += frame_size - ADIN1110_FRAME_HEADER_LEN;
364 port_priv->rx_packets++;
369 static int adin1110_write_fifo(struct adin1110_port_priv *port_priv,
372 struct adin1110_priv *priv = port_priv->priv;
373 u32 header_len = ADIN1110_WR_HEADER_LEN;
380 /* Pad frame to 64 byte length,
381 * MAC nor PHY will otherwise add the
383 * The FEC will be added by the MAC internally.
385 if (txb->len + ADIN1110_FEC_LEN < 64)
386 padding = 64 - (txb->len + ADIN1110_FEC_LEN);
388 padded_len = txb->len + padding + ADIN1110_FRAME_HEADER_LEN;
390 round_len = adin1110_round_len(padded_len);
394 ret = adin1110_write_reg(priv, ADIN1110_TX_FSIZE, padded_len);
398 memset(priv->data, 0, round_len + ADIN1110_WR_HEADER_LEN);
400 priv->data[0] = ADIN1110_CD | ADIN1110_WRITE;
401 priv->data[0] |= FIELD_GET(GENMASK(12, 8), ADIN1110_TX);
402 priv->data[1] = FIELD_GET(GENMASK(7, 0), ADIN1110_TX);
403 if (priv->append_crc) {
404 priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
408 /* mention the port on which to send the frame in the frame header */
409 frame_header = cpu_to_be16(port_priv->nr);
410 memcpy(&priv->data[header_len], &frame_header,
411 ADIN1110_FRAME_HEADER_LEN);
413 memcpy(&priv->data[header_len + ADIN1110_FRAME_HEADER_LEN],
414 txb->data, txb->len);
416 ret = spi_write(priv->spidev, &priv->data[0], round_len + header_len);
420 port_priv->tx_bytes += txb->len;
421 port_priv->tx_packets++;
426 static int adin1110_read_mdio_acc(struct adin1110_priv *priv)
431 mutex_lock(&priv->lock);
432 ret = adin1110_read_reg(priv, ADIN1110_MDIOACC, &val);
433 mutex_unlock(&priv->lock);
440 static int adin1110_mdio_read(struct mii_bus *bus, int phy_id, int reg)
442 struct adin1110_priv *priv = bus->priv;
446 if (mdio_phy_id_is_c45(phy_id))
449 val |= FIELD_PREP(ADIN1110_MDIO_OP, ADIN1110_MDIO_OP_RD);
450 val |= FIELD_PREP(ADIN1110_MDIO_ST, 0x1);
451 val |= FIELD_PREP(ADIN1110_MDIO_PRTAD, phy_id);
452 val |= FIELD_PREP(ADIN1110_MDIO_DEVAD, reg);
454 /* write the clause 22 read command to the chip */
455 mutex_lock(&priv->lock);
456 ret = adin1110_write_reg(priv, ADIN1110_MDIOACC, val);
457 mutex_unlock(&priv->lock);
461 /* ADIN1110_MDIO_TRDONE BIT of the ADIN1110_MDIOACC
462 * register is set when the read is done.
463 * After the transaction is done, ADIN1110_MDIO_DATA
464 * bitfield of ADIN1110_MDIOACC register will contain
465 * the requested register value.
467 ret = readx_poll_timeout(adin1110_read_mdio_acc, priv, val,
468 (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
472 return (val & ADIN1110_MDIO_DATA);
475 static int adin1110_mdio_write(struct mii_bus *bus, int phy_id,
476 int reg, u16 reg_val)
478 struct adin1110_priv *priv = bus->priv;
482 if (mdio_phy_id_is_c45(phy_id))
485 val |= FIELD_PREP(ADIN1110_MDIO_OP, ADIN1110_MDIO_OP_WR);
486 val |= FIELD_PREP(ADIN1110_MDIO_ST, 0x1);
487 val |= FIELD_PREP(ADIN1110_MDIO_PRTAD, phy_id);
488 val |= FIELD_PREP(ADIN1110_MDIO_DEVAD, reg);
489 val |= FIELD_PREP(ADIN1110_MDIO_DATA, reg_val);
491 /* write the clause 22 write command to the chip */
492 mutex_lock(&priv->lock);
493 ret = adin1110_write_reg(priv, ADIN1110_MDIOACC, val);
494 mutex_unlock(&priv->lock);
498 return readx_poll_timeout(adin1110_read_mdio_acc, priv, val,
499 (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
502 /* ADIN1110 MAC-PHY contains an ADIN1100 PHY.
503 * ADIN2111 MAC-PHY contains two ADIN1100 PHYs.
504 * By registering a new MDIO bus we allow the PAL to discover
505 * the encapsulated PHY and probe the ADIN1100 driver.
507 static int adin1110_register_mdiobus(struct adin1110_priv *priv,
510 struct mii_bus *mii_bus;
513 mii_bus = devm_mdiobus_alloc(dev);
517 snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u",
518 priv->cfg->name, priv->spidev->chip_select);
520 mii_bus->name = priv->mii_bus_name;
521 mii_bus->read = adin1110_mdio_read;
522 mii_bus->write = adin1110_mdio_write;
523 mii_bus->priv = priv;
524 mii_bus->parent = dev;
525 mii_bus->phy_mask = ~((u32)GENMASK(2, 0));
526 mii_bus->probe_capabilities = MDIOBUS_C22;
527 snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
529 ret = devm_mdiobus_register(dev, mii_bus);
533 priv->mii_bus = mii_bus;
538 static bool adin1110_port_rx_ready(struct adin1110_port_priv *port_priv,
541 if (!netif_oper_up(port_priv->netdev))
545 return !!(status & ADIN1110_RX_RDY);
547 return !!(status & ADIN2111_P2_RX_RDY);
550 static void adin1110_read_frames(struct adin1110_port_priv *port_priv,
553 struct adin1110_priv *priv = port_priv->priv;
558 ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
562 if (!adin1110_port_rx_ready(port_priv, status1))
565 ret = adin1110_read_fifo(port_priv);
573 static void adin1110_wake_queues(struct adin1110_priv *priv)
577 for (i = 0; i < priv->cfg->ports_nr; i++)
578 netif_wake_queue(priv->ports[i]->netdev);
581 static irqreturn_t adin1110_irq(int irq, void *p)
583 struct adin1110_priv *priv = p;
589 mutex_lock(&priv->lock);
591 ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
595 if (priv->append_crc && (status1 & ADIN1110_SPI_ERR))
596 dev_warn_ratelimited(&priv->spidev->dev,
597 "SPI CRC error on write.\n");
599 ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
603 /* TX FIFO space is expressed in half-words */
604 priv->tx_space = 2 * val;
606 for (i = 0; i < priv->cfg->ports_nr; i++) {
607 if (adin1110_port_rx_ready(priv->ports[i], status1))
608 adin1110_read_frames(priv->ports[i],
609 ADIN1110_MAX_FRAMES_READ);
612 /* clear IRQ sources */
613 adin1110_write_reg(priv, ADIN1110_STATUS0, ADIN1110_CLEAR_STATUS0);
614 adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask);
617 mutex_unlock(&priv->lock);
619 if (priv->tx_space > 0 && ret >= 0)
620 adin1110_wake_queues(priv);
625 /* ADIN1110 can filter up to 16 MAC addresses, mac_nr here is the slot used */
626 static int adin1110_write_mac_address(struct adin1110_port_priv *port_priv,
627 int mac_nr, const u8 *addr,
628 u8 *mask, u32 port_rules)
630 struct adin1110_priv *priv = port_priv->priv;
631 u32 offset = mac_nr * 2;
637 port_rules_mask = ADIN1110_MAC_ADDR_APPLY2PORT;
639 port_rules_mask = ADIN2111_MAC_ADDR_APPLY2PORT2;
641 if (port_rules & port_rules_mask)
642 port_rules_mask |= ADIN1110_MAC_ADDR_TO_HOST | ADIN2111_MAC_ADDR_TO_OTHER_PORT;
644 port_rules_mask |= GENMASK(15, 0);
645 val = port_rules | get_unaligned_be16(&addr[0]);
646 ret = adin1110_set_bits(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset,
647 port_rules_mask, val);
651 val = get_unaligned_be32(&addr[2]);
652 ret = adin1110_write_reg(priv,
653 ADIN1110_MAC_ADDR_FILTER_LWR + offset, val);
657 /* Only the first two MAC address slots support masking. */
658 if (mac_nr < ADIN_MAC_P1_ADDR_SLOT) {
659 val = get_unaligned_be16(&mask[0]);
660 ret = adin1110_write_reg(priv,
661 ADIN1110_MAC_ADDR_MASK_UPR + offset,
666 val = get_unaligned_be32(&mask[2]);
667 return adin1110_write_reg(priv,
668 ADIN1110_MAC_ADDR_MASK_LWR + offset,
675 static int adin1110_clear_mac_address(struct adin1110_priv *priv, int mac_nr)
677 u32 offset = mac_nr * 2;
680 ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset, 0);
684 ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + offset, 0);
688 /* only the first two MAC address slots are maskable */
690 ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_UPR + offset, 0);
694 ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_LWR + offset, 0);
700 static u32 adin1110_port_rules(struct adin1110_port_priv *port_priv,
702 bool fw_to_other_port)
707 port_rules |= ADIN1110_MAC_ADDR_APPLY2PORT;
709 port_rules |= ADIN2111_MAC_ADDR_APPLY2PORT2;
712 port_rules |= ADIN1110_MAC_ADDR_TO_HOST;
714 if (fw_to_other_port && port_priv->priv->forwarding)
715 port_rules |= ADIN2111_MAC_ADDR_TO_OTHER_PORT;
720 static int adin1110_multicast_filter(struct adin1110_port_priv *port_priv,
721 int mac_nr, bool accept_multicast)
723 u8 mask[ETH_ALEN] = {0};
724 u8 mac[ETH_ALEN] = {0};
730 if (accept_multicast && port_priv->state == BR_STATE_FORWARDING)
731 port_rules = adin1110_port_rules(port_priv, true, true);
733 return adin1110_write_mac_address(port_priv, mac_nr, mac,
737 static int adin1110_broadcasts_filter(struct adin1110_port_priv *port_priv,
738 int mac_nr, bool accept_broadcast)
743 memset(mask, 0xFF, ETH_ALEN);
745 if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING)
746 port_rules = adin1110_port_rules(port_priv, true, true);
748 return adin1110_write_mac_address(port_priv, mac_nr, mask,
752 static int adin1110_set_mac_address(struct net_device *netdev,
753 const unsigned char *dev_addr)
755 struct adin1110_port_priv *port_priv = netdev_priv(netdev);
760 if (!is_valid_ether_addr(dev_addr))
761 return -EADDRNOTAVAIL;
763 eth_hw_addr_set(netdev, dev_addr);
764 memset(mask, 0xFF, ETH_ALEN);
766 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
767 port_rules = adin1110_port_rules(port_priv, true, false);
769 return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr,
773 static int adin1110_ndo_set_mac_address(struct net_device *netdev, void *addr)
775 struct sockaddr *sa = addr;
778 ret = eth_prepare_mac_addr_change(netdev, addr);
782 return adin1110_set_mac_address(netdev, sa->sa_data);
785 static int adin1110_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
787 if (!netif_running(netdev))
790 return phy_do_ioctl(netdev, rq, cmd);
793 static int adin1110_set_promisc_mode(struct adin1110_port_priv *port_priv,
796 struct adin1110_priv *priv = port_priv->priv;
799 if (port_priv->state != BR_STATE_FORWARDING)
803 mask = ADIN1110_FWD_UNK2HOST;
805 mask = ADIN2111_P2_FWD_UNK2HOST;
807 return adin1110_set_bits(priv, ADIN1110_CONFIG2,
808 mask, promisc ? mask : 0);
811 static int adin1110_setup_rx_mode(struct adin1110_port_priv *port_priv)
815 ret = adin1110_set_promisc_mode(port_priv,
816 !!(port_priv->flags & IFF_PROMISC));
820 ret = adin1110_multicast_filter(port_priv, ADIN_MAC_MULTICAST_ADDR_SLOT,
821 !!(port_priv->flags & IFF_ALLMULTI));
825 ret = adin1110_broadcasts_filter(port_priv,
826 ADIN_MAC_BROADCAST_ADDR_SLOT,
827 !!(port_priv->flags & IFF_BROADCAST));
831 return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1,
832 ADIN1110_CONFIG1_SYNC, ADIN1110_CONFIG1_SYNC);
835 static bool adin1110_can_offload_forwarding(struct adin1110_priv *priv)
839 if (priv->cfg->id != ADIN2111_MAC)
842 /* Can't enable forwarding if ports do not belong to the same bridge */
843 if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge)
846 /* Can't enable forwarding if there is a port
847 * that has been blocked by STP.
849 for (i = 0; i < priv->cfg->ports_nr; i++) {
850 if (priv->ports[i]->state != BR_STATE_FORWARDING)
857 static void adin1110_rx_mode_work(struct work_struct *work)
859 struct adin1110_port_priv *port_priv;
860 struct adin1110_priv *priv;
862 port_priv = container_of(work, struct adin1110_port_priv, rx_mode_work);
863 priv = port_priv->priv;
865 mutex_lock(&priv->lock);
866 adin1110_setup_rx_mode(port_priv);
867 mutex_unlock(&priv->lock);
870 static void adin1110_set_rx_mode(struct net_device *dev)
872 struct adin1110_port_priv *port_priv = netdev_priv(dev);
873 struct adin1110_priv *priv = port_priv->priv;
875 spin_lock(&priv->state_lock);
877 port_priv->flags = dev->flags;
878 schedule_work(&port_priv->rx_mode_work);
880 spin_unlock(&priv->state_lock);
883 static int adin1110_net_open(struct net_device *net_dev)
885 struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
886 struct adin1110_priv *priv = port_priv->priv;
890 mutex_lock(&priv->lock);
892 /* Configure MAC to compute and append the FCS itself. */
893 ret = adin1110_write_reg(priv, ADIN1110_CONFIG2, ADIN1110_CRC_APPEND);
897 val = ADIN1110_TX_RDY_IRQ | ADIN1110_RX_RDY_IRQ | ADIN1110_SPI_ERR_IRQ;
898 if (priv->cfg->id == ADIN2111_MAC)
899 val |= ADIN2111_RX_RDY_IRQ;
901 priv->irq_mask = val;
902 ret = adin1110_write_reg(priv, ADIN1110_IMASK1, ~val);
904 netdev_err(net_dev, "Failed to enable chip IRQs: %d\n", ret);
908 ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
910 netdev_err(net_dev, "Failed to read TX FIFO space: %d\n", ret);
914 priv->tx_space = 2 * val;
916 port_priv->state = BR_STATE_FORWARDING;
917 ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr);
919 netdev_err(net_dev, "Could not set MAC address: %pM, %d\n",
920 net_dev->dev_addr, ret);
924 ret = adin1110_set_bits(priv, ADIN1110_CONFIG1, ADIN1110_CONFIG1_SYNC,
925 ADIN1110_CONFIG1_SYNC);
928 mutex_unlock(&priv->lock);
933 phy_start(port_priv->phydev);
935 netif_start_queue(net_dev);
940 static int adin1110_net_stop(struct net_device *net_dev)
942 struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
943 struct adin1110_priv *priv = port_priv->priv;
947 mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ;
949 /* Disable RX RDY IRQs */
950 mutex_lock(&priv->lock);
951 ret = adin1110_set_bits(priv, ADIN1110_IMASK1, mask, mask);
952 mutex_unlock(&priv->lock);
956 netif_stop_queue(port_priv->netdev);
957 flush_work(&port_priv->tx_work);
958 phy_stop(port_priv->phydev);
963 static void adin1110_tx_work(struct work_struct *work)
965 struct adin1110_port_priv *port_priv;
966 struct adin1110_priv *priv;
970 port_priv = container_of(work, struct adin1110_port_priv, tx_work);
971 priv = port_priv->priv;
973 mutex_lock(&priv->lock);
975 while ((txb = skb_dequeue(&port_priv->txq))) {
976 ret = adin1110_write_fifo(port_priv, txb);
978 dev_err_ratelimited(&priv->spidev->dev,
979 "Frame write error: %d\n", ret);
984 mutex_unlock(&priv->lock);
987 static netdev_tx_t adin1110_start_xmit(struct sk_buff *skb, struct net_device *dev)
989 struct adin1110_port_priv *port_priv = netdev_priv(dev);
990 struct adin1110_priv *priv = port_priv->priv;
991 netdev_tx_t netdev_ret = NETDEV_TX_OK;
994 tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN;
995 if (tx_space_needed > priv->tx_space) {
996 netif_stop_queue(dev);
997 netdev_ret = NETDEV_TX_BUSY;
999 priv->tx_space -= tx_space_needed;
1000 skb_queue_tail(&port_priv->txq, skb);
1003 schedule_work(&port_priv->tx_work);
1008 static void adin1110_ndo_get_stats64(struct net_device *dev,
1009 struct rtnl_link_stats64 *storage)
1011 struct adin1110_port_priv *port_priv = netdev_priv(dev);
1013 storage->rx_packets = port_priv->rx_packets;
1014 storage->tx_packets = port_priv->tx_packets;
1016 storage->rx_bytes = port_priv->rx_bytes;
1017 storage->tx_bytes = port_priv->tx_bytes;
1020 static int adin1110_port_get_port_parent_id(struct net_device *dev,
1021 struct netdev_phys_item_id *ppid)
1023 struct adin1110_port_priv *port_priv = netdev_priv(dev);
1024 struct adin1110_priv *priv = port_priv->priv;
1026 ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN);
1027 memcpy(ppid->id, priv->mii_bus_name, ppid->id_len);
1032 static int adin1110_ndo_get_phys_port_name(struct net_device *dev,
1033 char *name, size_t len)
1035 struct adin1110_port_priv *port_priv = netdev_priv(dev);
1038 err = snprintf(name, len, "p%d", port_priv->nr);
1045 static const struct net_device_ops adin1110_netdev_ops = {
1046 .ndo_open = adin1110_net_open,
1047 .ndo_stop = adin1110_net_stop,
1048 .ndo_eth_ioctl = adin1110_ioctl,
1049 .ndo_start_xmit = adin1110_start_xmit,
1050 .ndo_set_mac_address = adin1110_ndo_set_mac_address,
1051 .ndo_set_rx_mode = adin1110_set_rx_mode,
1052 .ndo_validate_addr = eth_validate_addr,
1053 .ndo_get_stats64 = adin1110_ndo_get_stats64,
1054 .ndo_get_port_parent_id = adin1110_port_get_port_parent_id,
1055 .ndo_get_phys_port_name = adin1110_ndo_get_phys_port_name,
1058 static void adin1110_get_drvinfo(struct net_device *dev,
1059 struct ethtool_drvinfo *di)
1061 strscpy(di->driver, "ADIN1110", sizeof(di->driver));
1062 strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info));
1065 static const struct ethtool_ops adin1110_ethtool_ops = {
1066 .get_drvinfo = adin1110_get_drvinfo,
1067 .get_link = ethtool_op_get_link,
1068 .get_link_ksettings = phy_ethtool_get_link_ksettings,
1069 .set_link_ksettings = phy_ethtool_set_link_ksettings,
1072 static void adin1110_adjust_link(struct net_device *dev)
1074 struct phy_device *phydev = dev->phydev;
1077 phy_print_status(phydev);
1080 /* PHY ID is stored in the MAC registers too,
1081 * check spi connection by reading it.
1083 static int adin1110_check_spi(struct adin1110_priv *priv)
1085 struct gpio_desc *reset_gpio;
1089 reset_gpio = devm_gpiod_get_optional(&priv->spidev->dev, "reset",
1092 /* MISO pin is used for internal configuration, can't have
1093 * anyone else disturbing the SDO line.
1095 spi_bus_lock(priv->spidev->controller);
1097 gpiod_set_value(reset_gpio, 1);
1099 gpiod_set_value(reset_gpio, 0);
1101 /* Need to wait 90 ms before interacting with
1102 * the MAC after a HW reset.
1106 spi_bus_unlock(priv->spidev->controller);
1109 ret = adin1110_read_reg(priv, ADIN1110_PHY_ID, &val);
1113 if (val != priv->cfg->phy_id_val) {
1114 dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n",
1115 priv->cfg->phy_id_val, val);
1122 static int adin1110_hw_forwarding(struct adin1110_priv *priv, bool enable)
1127 priv->forwarding = enable;
1129 if (!priv->forwarding) {
1130 for (i = ADIN_MAC_FDB_ADDR_SLOT; i < ADIN_MAC_MAX_ADDR_SLOTS; i++) {
1131 ret = adin1110_clear_mac_address(priv, i);
1137 /* Forwarding is optimised when MAC runs in Cut Through mode. */
1138 ret = adin1110_set_bits(priv, ADIN1110_CONFIG2,
1139 ADIN2111_PORT_CUT_THRU_EN,
1140 priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0);
1144 for (i = 0; i < priv->cfg->ports_nr; i++) {
1145 ret = adin1110_setup_rx_mode(priv->ports[i]);
1153 static int adin1110_port_bridge_join(struct adin1110_port_priv *port_priv,
1154 struct net_device *bridge)
1156 struct adin1110_priv *priv = port_priv->priv;
1159 port_priv->bridge = bridge;
1161 if (adin1110_can_offload_forwarding(priv)) {
1162 mutex_lock(&priv->lock);
1163 ret = adin1110_hw_forwarding(priv, true);
1164 mutex_unlock(&priv->lock);
1170 return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr);
1173 static int adin1110_port_bridge_leave(struct adin1110_port_priv *port_priv,
1174 struct net_device *bridge)
1176 struct adin1110_priv *priv = port_priv->priv;
1179 port_priv->bridge = NULL;
1181 mutex_lock(&priv->lock);
1182 ret = adin1110_hw_forwarding(priv, false);
1183 mutex_unlock(&priv->lock);
1188 static bool adin1110_port_dev_check(const struct net_device *dev)
1190 return dev->netdev_ops == &adin1110_netdev_ops;
1193 static int adin1110_netdevice_event(struct notifier_block *unused,
1194 unsigned long event, void *ptr)
1196 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1197 struct adin1110_port_priv *port_priv = netdev_priv(dev);
1198 struct netdev_notifier_changeupper_info *info = ptr;
1201 if (!adin1110_port_dev_check(dev))
1205 case NETDEV_CHANGEUPPER:
1206 if (netif_is_bridge_master(info->upper_dev)) {
1208 ret = adin1110_port_bridge_join(port_priv, info->upper_dev);
1210 ret = adin1110_port_bridge_leave(port_priv, info->upper_dev);
1217 return notifier_from_errno(ret);
1220 static struct notifier_block adin1110_netdevice_nb = {
1221 .notifier_call = adin1110_netdevice_event,
1224 static void adin1110_disconnect_phy(void *data)
1226 phy_disconnect(data);
1229 static int adin1110_port_set_forwarding_state(struct adin1110_port_priv *port_priv)
1231 struct adin1110_priv *priv = port_priv->priv;
1234 port_priv->state = BR_STATE_FORWARDING;
1236 mutex_lock(&priv->lock);
1237 ret = adin1110_set_mac_address(port_priv->netdev,
1238 port_priv->netdev->dev_addr);
1242 if (adin1110_can_offload_forwarding(priv))
1243 ret = adin1110_hw_forwarding(priv, true);
1245 ret = adin1110_setup_rx_mode(port_priv);
1247 mutex_unlock(&priv->lock);
1252 static int adin1110_port_set_blocking_state(struct adin1110_port_priv *port_priv)
1254 u8 mac[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x00};
1255 struct adin1110_priv *priv = port_priv->priv;
1261 port_priv->state = BR_STATE_BLOCKING;
1263 mutex_lock(&priv->lock);
1265 mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
1266 ret = adin1110_clear_mac_address(priv, mac_slot);
1270 ret = adin1110_hw_forwarding(priv, false);
1274 /* Allow only BPDUs to be passed to the CPU */
1275 memset(mask, 0xFF, ETH_ALEN);
1276 port_rules = adin1110_port_rules(port_priv, true, false);
1277 ret = adin1110_write_mac_address(port_priv, mac_slot, mac,
1280 mutex_unlock(&priv->lock);
1285 /* ADIN1110/2111 does not have any native STP support.
1286 * Listen for bridge core state changes and
1287 * allow all frames to pass or only the BPDUs.
1289 static int adin1110_port_attr_stp_state_set(struct adin1110_port_priv *port_priv,
1293 case BR_STATE_FORWARDING:
1294 return adin1110_port_set_forwarding_state(port_priv);
1295 case BR_STATE_LEARNING:
1296 case BR_STATE_LISTENING:
1297 case BR_STATE_DISABLED:
1298 case BR_STATE_BLOCKING:
1299 return adin1110_port_set_blocking_state(port_priv);
1305 static int adin1110_port_attr_set(struct net_device *dev, const void *ctx,
1306 const struct switchdev_attr *attr,
1307 struct netlink_ext_ack *extack)
1309 struct adin1110_port_priv *port_priv = netdev_priv(dev);
1312 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1313 return adin1110_port_attr_stp_state_set(port_priv,
1320 static int adin1110_switchdev_blocking_event(struct notifier_block *unused,
1321 unsigned long event,
1324 struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
1327 if (event == SWITCHDEV_PORT_ATTR_SET) {
1328 ret = switchdev_handle_port_attr_set(netdev, ptr,
1329 adin1110_port_dev_check,
1330 adin1110_port_attr_set);
1332 return notifier_from_errno(ret);
1338 static struct notifier_block adin1110_switchdev_blocking_notifier = {
1339 .notifier_call = adin1110_switchdev_blocking_event,
1342 static void adin1110_fdb_offload_notify(struct net_device *netdev,
1343 struct switchdev_notifier_fdb_info *rcv)
1345 struct switchdev_notifier_fdb_info info = {};
1347 info.addr = rcv->addr;
1348 info.vid = rcv->vid;
1349 info.offloaded = true;
1350 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
1351 netdev, &info.info, NULL);
1354 static int adin1110_fdb_add(struct adin1110_port_priv *port_priv,
1355 struct switchdev_notifier_fdb_info *fdb)
1357 struct adin1110_priv *priv = port_priv->priv;
1358 struct adin1110_port_priv *other_port;
1365 netdev_dbg(port_priv->netdev,
1366 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
1367 __func__, fdb->addr, fdb->vid, fdb->added_by_user,
1368 fdb->offloaded, port_priv->nr);
1370 if (!priv->forwarding)
1376 /* Find free FDB slot on device. */
1377 for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
1378 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
1385 if (mac_nr == ADIN_MAC_MAX_ADDR_SLOTS)
1388 other_port = priv->ports[!port_priv->nr];
1389 port_rules = adin1110_port_rules(port_priv, false, true);
1390 memset(mask, 0xFF, ETH_ALEN);
1392 return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr,
1396 static int adin1110_read_mac(struct adin1110_priv *priv, int mac_nr, u8 *addr)
1401 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
1405 put_unaligned_be16(val, addr);
1407 ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + (mac_nr * 2), &val);
1411 put_unaligned_be32(val, addr + 2);
1416 static int adin1110_fdb_del(struct adin1110_port_priv *port_priv,
1417 struct switchdev_notifier_fdb_info *fdb)
1419 struct adin1110_priv *priv = port_priv->priv;
1424 netdev_dbg(port_priv->netdev,
1425 "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
1426 __func__, fdb->addr, fdb->vid, fdb->added_by_user,
1427 fdb->offloaded, port_priv->nr);
1432 for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
1433 ret = adin1110_read_mac(priv, mac_nr, addr);
1437 if (ether_addr_equal(addr, fdb->addr)) {
1438 ret = adin1110_clear_mac_address(priv, mac_nr);
1447 static void adin1110_switchdev_event_work(struct work_struct *work)
1449 struct adin1110_switchdev_event_work *switchdev_work;
1450 struct adin1110_port_priv *port_priv;
1453 switchdev_work = container_of(work, struct adin1110_switchdev_event_work, work);
1454 port_priv = switchdev_work->port_priv;
1456 mutex_lock(&port_priv->priv->lock);
1458 switch (switchdev_work->event) {
1459 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1460 ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info);
1462 adin1110_fdb_offload_notify(port_priv->netdev,
1463 &switchdev_work->fdb_info);
1465 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1466 adin1110_fdb_del(port_priv, &switchdev_work->fdb_info);
1472 mutex_unlock(&port_priv->priv->lock);
1474 kfree(switchdev_work->fdb_info.addr);
1475 kfree(switchdev_work);
1476 dev_put(port_priv->netdev);
1479 /* called under rcu_read_lock() */
1480 static int adin1110_switchdev_event(struct notifier_block *unused,
1481 unsigned long event, void *ptr)
1483 struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
1484 struct adin1110_port_priv *port_priv = netdev_priv(netdev);
1485 struct adin1110_switchdev_event_work *switchdev_work;
1486 struct switchdev_notifier_fdb_info *fdb_info = ptr;
1488 if (!adin1110_port_dev_check(netdev))
1491 switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
1492 if (WARN_ON(!switchdev_work))
1495 INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work);
1496 switchdev_work->port_priv = port_priv;
1497 switchdev_work->event = event;
1500 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1501 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1502 memcpy(&switchdev_work->fdb_info, ptr,
1503 sizeof(switchdev_work->fdb_info));
1504 switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1506 if (!switchdev_work->fdb_info.addr)
1507 goto err_addr_alloc;
1509 ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
1514 kfree(switchdev_work);
1518 queue_work(system_long_wq, &switchdev_work->work);
1523 kfree(switchdev_work);
1527 static struct notifier_block adin1110_switchdev_notifier = {
1528 .notifier_call = adin1110_switchdev_event,
1531 static void adin1110_unregister_notifiers(void)
1533 unregister_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
1534 unregister_switchdev_notifier(&adin1110_switchdev_notifier);
1535 unregister_netdevice_notifier(&adin1110_netdevice_nb);
1538 static int adin1110_setup_notifiers(void)
1542 ret = register_netdevice_notifier(&adin1110_netdevice_nb);
1546 ret = register_switchdev_notifier(&adin1110_switchdev_notifier);
1550 ret = register_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
1557 unregister_switchdev_notifier(&adin1110_switchdev_notifier);
1560 unregister_netdevice_notifier(&adin1110_netdevice_nb);
1565 static int adin1110_probe_netdevs(struct adin1110_priv *priv)
1567 struct device *dev = &priv->spidev->dev;
1568 struct adin1110_port_priv *port_priv;
1569 struct net_device *netdev;
1573 for (i = 0; i < priv->cfg->ports_nr; i++) {
1574 netdev = devm_alloc_etherdev(dev, sizeof(*port_priv));
1578 port_priv = netdev_priv(netdev);
1579 port_priv->netdev = netdev;
1580 port_priv->priv = priv;
1581 port_priv->cfg = priv->cfg;
1583 priv->ports[i] = port_priv;
1584 SET_NETDEV_DEV(netdev, dev);
1586 ret = device_get_ethdev_address(dev, netdev);
1590 netdev->irq = priv->spidev->irq;
1591 INIT_WORK(&port_priv->tx_work, adin1110_tx_work);
1592 INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work);
1593 skb_queue_head_init(&port_priv->txq);
1595 netif_carrier_off(netdev);
1597 netdev->if_port = IF_PORT_10BASET;
1598 netdev->netdev_ops = &adin1110_netdev_ops;
1599 netdev->ethtool_ops = &adin1110_ethtool_ops;
1600 netdev->priv_flags |= IFF_UNICAST_FLT;
1601 netdev->features |= NETIF_F_NETNS_LOCAL;
1603 port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
1604 if (IS_ERR(port_priv->phydev)) {
1605 netdev_err(netdev, "Could not find PHY with device address: %d.\n", i);
1606 return PTR_ERR(port_priv->phydev);
1609 port_priv->phydev = phy_connect(netdev,
1610 phydev_name(port_priv->phydev),
1611 adin1110_adjust_link,
1612 PHY_INTERFACE_MODE_INTERNAL);
1613 if (IS_ERR(port_priv->phydev)) {
1614 netdev_err(netdev, "Could not connect PHY with device address: %d.\n", i);
1615 return PTR_ERR(port_priv->phydev);
1618 ret = devm_add_action_or_reset(dev, adin1110_disconnect_phy,
1624 /* ADIN1110 INT_N pin will be used to signal the host */
1625 ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL,
1627 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
1628 dev_name(dev), priv);
1632 for (i = 0; i < priv->cfg->ports_nr; i++) {
1633 ret = devm_register_netdev(dev, priv->ports[i]->netdev);
1635 dev_err(dev, "Failed to register network device.\n");
1643 static int adin1110_probe(struct spi_device *spi)
1645 const struct spi_device_id *dev_id = spi_get_device_id(spi);
1646 struct device *dev = &spi->dev;
1647 struct adin1110_priv *priv;
1650 priv = devm_kzalloc(dev, sizeof(struct adin1110_priv), GFP_KERNEL);
1655 priv->cfg = &adin1110_cfgs[dev_id->driver_data];
1656 spi->bits_per_word = 8;
1657 spi->mode = SPI_MODE_0;
1659 mutex_init(&priv->lock);
1660 spin_lock_init(&priv->state_lock);
1662 /* use of CRC on control and data transactions is pin dependent */
1663 priv->append_crc = device_property_read_bool(dev, "adi,spi-crc");
1664 if (priv->append_crc)
1665 crc8_populate_msb(adin1110_crc_table, 0x7);
1667 ret = adin1110_check_spi(priv);
1669 dev_err(dev, "Probe SPI Read check failed: %d\n", ret);
1673 ret = adin1110_write_reg(priv, ADIN1110_RESET, ADIN1110_SWRESET);
1677 ret = adin1110_register_mdiobus(priv, dev);
1679 dev_err(dev, "Could not register MDIO bus %d\n", ret);
1683 return adin1110_probe_netdevs(priv);
1686 static const struct of_device_id adin1110_match_table[] = {
1687 { .compatible = "adi,adin1110" },
1688 { .compatible = "adi,adin2111" },
1691 MODULE_DEVICE_TABLE(of, adin1110_match_table);
1693 static const struct spi_device_id adin1110_spi_id[] = {
1694 { .name = "adin1110", .driver_data = ADIN1110_MAC },
1695 { .name = "adin2111", .driver_data = ADIN2111_MAC },
1698 MODULE_DEVICE_TABLE(spi, adin1110_spi_id);
1700 static struct spi_driver adin1110_driver = {
1703 .of_match_table = adin1110_match_table,
1705 .probe = adin1110_probe,
1706 .id_table = adin1110_spi_id,
1709 static int __init adin1110_driver_init(void)
1713 ret = adin1110_setup_notifiers();
1717 ret = spi_register_driver(&adin1110_driver);
1719 adin1110_unregister_notifiers();
1726 static void __exit adin1110_exit(void)
1728 adin1110_unregister_notifiers();
1729 spi_unregister_driver(&adin1110_driver);
1731 module_init(adin1110_driver_init);
1732 module_exit(adin1110_exit);
1734 MODULE_DESCRIPTION("ADIN1110 Network driver");
1736 MODULE_LICENSE("Dual BSD/GPL");