Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
   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
   4 *
   5 * Copyright 2021 Analog Devices Inc.
   6 */
   7
   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>
  26
  27#include <net/switchdev.h>
  28
  29#include <asm/unaligned.h>
  30
  31#define ADIN1110_PHY_ID				0x1
  32
  33#define ADIN1110_RESET				0x03
  34#define   ADIN1110_SWRESET			BIT(0)
  35
  36#define ADIN1110_CONFIG1			0x04
  37#define   ADIN1110_CONFIG1_SYNC			BIT(15)
  38
  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)
  44
  45#define ADIN1110_STATUS0			0x08
  46
  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)
  51
  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)
  57
  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)
  65
  66#define ADIN1110_TX_FSIZE			0x30
  67#define ADIN1110_TX				0x31
  68#define ADIN1110_TX_SPACE			0x32
  69
  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)
  75
  76#define ADIN1110_MAC_ADDR_FILTER_LWR		0x51
  77
  78#define ADIN1110_MAC_ADDR_MASK_UPR		0x70
  79#define ADIN1110_MAC_ADDR_MASK_LWR		0x71
  80
  81#define ADIN1110_RX_FSIZE			0x90
  82#define ADIN1110_RX				0x91
  83
  84#define ADIN2111_RX_P2_FSIZE			0xC0
  85#define ADIN2111_RX_P2				0xC1
  86
  87#define ADIN1110_CLEAR_STATUS0			0xFFF
  88
  89/* MDIO_OP codes */
  90#define ADIN1110_MDIO_OP_WR			0x1
  91#define ADIN1110_MDIO_OP_RD			0x3
  92
  93#define ADIN1110_CD				BIT(7)
  94#define ADIN1110_WRITE				BIT(5)
  95
  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
 104
 105#define ADIN1110_PHY_ID_VAL			0x0283BC91
 106#define ADIN2111_PHY_ID_VAL			0x0283BCA1
 107
 108#define ADIN_MAC_MAX_PORTS			2
 109#define ADIN_MAC_MAX_ADDR_SLOTS			16
 110
 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
 116
 117DECLARE_CRC8_TABLE(adin1110_crc_table);
 118
 119enum adin1110_chips_id {
 120	ADIN1110_MAC = 0,
 121	ADIN2111_MAC,
 122};
 123
 124struct adin1110_cfg {
 125	enum adin1110_chips_id	id;
 126	char			name[MDIO_NAME_SIZE];
 127	u32			phy_ids[PHY_MAX_ADDR];
 128	u32			ports_nr;
 129	u32			phy_id_val;
 130};
 131
 132struct 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;
 138	u64				rx_packets;
 139	u64				tx_packets;
 140	u64				rx_bytes;
 141	u64				tx_bytes;
 142	struct work_struct		rx_mode_work;
 143	u32				flags;
 144	struct sk_buff_head		txq;
 145	u32				nr;
 146	u32				state;
 147	struct adin1110_cfg		*cfg;
 148};
 149
 150struct 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;
 155	bool				append_crc;
 156	struct adin1110_cfg		*cfg;
 157	u32				tx_space;
 158	u32				irq_mask;
 159	bool				forwarding;
 160	int				irq;
 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;
 164};
 165
 166struct adin1110_switchdev_event_work {
 167	struct work_struct work;
 168	struct switchdev_notifier_fdb_info fdb_info;
 169	struct adin1110_port_priv *port_priv;
 170	unsigned long event;
 171};
 172
 173static struct adin1110_cfg adin1110_cfgs[] = {
 174	{
 175		.id = ADIN1110_MAC,
 176		.name = "adin1110",
 177		.phy_ids = {1},
 178		.ports_nr = 1,
 179		.phy_id_val = ADIN1110_PHY_ID_VAL,
 180	},
 181	{
 182		.id = ADIN2111_MAC,
 183		.name = "adin2111",
 184		.phy_ids = {1, 2},
 185		.ports_nr = 2,
 186		.phy_id_val = ADIN2111_PHY_ID_VAL,
 187	},
 188};
 189
 190static u8 adin1110_crc_data(u8 *data, u32 len)
 191{
 192	return crc8(adin1110_crc_table, data, len, 0);
 193}
 194
 195static int adin1110_read_reg(struct adin1110_priv *priv, u16 reg, u32 *val)
 196{
 197	u32 header_len = ADIN1110_RD_HEADER_LEN;
 198	u32 read_len = ADIN1110_REG_LEN;
 199	struct spi_transfer t = {0};
 200	int ret;
 201
 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;
 205
 206	if (priv->append_crc) {
 207		priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
 208		priv->data[3] = 0x00;
 209		header_len++;
 210	}
 211
 212	if (priv->append_crc)
 213		read_len++;
 214
 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;
 219
 220	ret = spi_sync_transfer(priv->spidev, &t, 1);
 221	if (ret)
 222		return ret;
 223
 224	if (priv->append_crc) {
 225		u8 recv_crc;
 226		u8 crc;
 227
 228		crc = adin1110_crc_data(&priv->data[header_len],
 229					ADIN1110_REG_LEN);
 230		recv_crc = priv->data[header_len + ADIN1110_REG_LEN];
 231
 232		if (crc != recv_crc) {
 233			dev_err_ratelimited(&priv->spidev->dev, "CRC error.");
 234			return -EBADMSG;
 235		}
 236	}
 237
 238	*val = get_unaligned_be32(&priv->data[header_len]);
 239
 240	return ret;
 241}
 242
 243static int adin1110_write_reg(struct adin1110_priv *priv, u16 reg, u32 val)
 244{
 245	u32 header_len = ADIN1110_WR_HEADER_LEN;
 246	u32 write_len = ADIN1110_REG_LEN;
 247
 248	priv->data[0] = ADIN1110_CD | ADIN1110_WRITE | FIELD_GET(GENMASK(12, 8), reg);
 249	priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
 250
 251	if (priv->append_crc) {
 252		priv->data[2] = adin1110_crc_data(&priv->data[0], header_len);
 253		header_len++;
 254	}
 255
 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],
 259								       write_len);
 260		write_len++;
 261	}
 262
 263	return spi_write(priv->spidev, &priv->data[0], header_len + write_len);
 264}
 265
 266static int adin1110_set_bits(struct adin1110_priv *priv, u16 reg,
 267			     unsigned long mask, unsigned long val)
 268{
 269	u32 write_val;
 270	int ret;
 271
 272	ret = adin1110_read_reg(priv, reg, &write_val);
 273	if (ret < 0)
 274		return ret;
 275
 276	set_mask_bits(&write_val, mask, val);
 277
 278	return adin1110_write_reg(priv, reg, write_val);
 279}
 280
 281static int adin1110_round_len(int len)
 282{
 283	/* can read/write only mutiples of 4 bytes of payload */
 284	len = ALIGN(len, 4);
 285
 286	/* NOTE: ADIN1110_WR_HEADER_LEN should be used for write ops. */
 287	if (len + ADIN1110_RD_HEADER_LEN > ADIN1110_MAX_BUFF)
 288		return -EINVAL;
 289
 290	return len;
 291}
 292
 293static int adin1110_read_fifo(struct adin1110_port_priv *port_priv)
 294{
 295	struct adin1110_priv *priv = port_priv->priv;
 296	u32 header_len = ADIN1110_RD_HEADER_LEN;
 297	struct spi_transfer t = {0};
 298	u32 frame_size_no_fcs;
 299	struct sk_buff *rxb;
 300	u32 frame_size;
 301	int round_len;
 302	u16 reg;
 303	int ret;
 304
 305	if (!port_priv->nr) {
 306		reg = ADIN1110_RX;
 307		ret = adin1110_read_reg(priv, ADIN1110_RX_FSIZE, &frame_size);
 308	} else {
 309		reg = ADIN2111_RX_P2;
 310		ret = adin1110_read_reg(priv, ADIN2111_RX_P2_FSIZE,
 311					&frame_size);
 312	}
 313
 314	if (ret < 0)
 315		return ret;
 316
 317	/* The read frame size includes the extra 2 bytes
 318	 * from the  ADIN1110 frame header.
 319	 */
 320	if (frame_size < ADIN1110_FRAME_HEADER_LEN + ADIN1110_FEC_LEN)
 321		return ret;
 322
 323	round_len = adin1110_round_len(frame_size);
 324	if (round_len < 0)
 325		return ret;
 326
 327	frame_size_no_fcs = frame_size - ADIN1110_FRAME_HEADER_LEN - ADIN1110_FEC_LEN;
 328	memset(priv->data, 0, ADIN1110_RD_HEADER_LEN);
 329
 330	priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg);
 331	priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
 332
 333	if (priv->append_crc) {
 334		priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
 335		header_len++;
 336	}
 337
 338	rxb = netdev_alloc_skb(port_priv->netdev, round_len + header_len);
 339	if (!rxb)
 340		return -ENOMEM;
 341
 342	skb_put(rxb, frame_size_no_fcs + header_len + ADIN1110_FRAME_HEADER_LEN);
 343
 344	t.tx_buf = &priv->data[0];
 345	t.rx_buf = &rxb->data[0];
 346	t.len = header_len + round_len;
 347
 348	ret = spi_sync_transfer(priv->spidev, &t, 1);
 349	if (ret) {
 350		kfree_skb(rxb);
 351		return ret;
 352	}
 353
 354	skb_pull(rxb, header_len + ADIN1110_FRAME_HEADER_LEN);
 355	rxb->protocol = eth_type_trans(rxb, port_priv->netdev);
 356
 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 = port_priv->priv->forwarding;
 360
 361	netif_rx(rxb);
 362
 363	port_priv->rx_bytes += frame_size - ADIN1110_FRAME_HEADER_LEN;
 364	port_priv->rx_packets++;
 365
 366	return 0;
 367}
 368
 369static int adin1110_write_fifo(struct adin1110_port_priv *port_priv,
 370			       struct sk_buff *txb)
 371{
 372	struct adin1110_priv *priv = port_priv->priv;
 373	u32 header_len = ADIN1110_WR_HEADER_LEN;
 374	__be16 frame_header;
 375	int padding = 0;
 376	int padded_len;
 377	int round_len;
 378	int ret;
 379
 380	/* Pad frame to 64 byte length,
 381	 * MAC nor PHY will otherwise add the
 382	 * required padding.
 383	 * The FEC will be added by the MAC internally.
 384	 */
 385	if (txb->len + ADIN1110_FEC_LEN < 64)
 386		padding = 64 - (txb->len + ADIN1110_FEC_LEN);
 387
 388	padded_len = txb->len + padding + ADIN1110_FRAME_HEADER_LEN;
 389
 390	round_len = adin1110_round_len(padded_len);
 391	if (round_len < 0)
 392		return round_len;
 393
 394	ret = adin1110_write_reg(priv, ADIN1110_TX_FSIZE, padded_len);
 395	if (ret < 0)
 396		return ret;
 397
 398	memset(priv->data, 0, round_len + ADIN1110_WR_HEADER_LEN);
 399
 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);
 405		header_len++;
 406	}
 407
 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);
 412
 413	memcpy(&priv->data[header_len + ADIN1110_FRAME_HEADER_LEN],
 414	       txb->data, txb->len);
 415
 416	ret = spi_write(priv->spidev, &priv->data[0], round_len + header_len);
 417	if (ret < 0)
 418		return ret;
 419
 420	port_priv->tx_bytes += txb->len;
 421	port_priv->tx_packets++;
 422
 423	return 0;
 424}
 425
 426static int adin1110_read_mdio_acc(struct adin1110_priv *priv)
 427{
 428	u32 val;
 429	int ret;
 430
 431	mutex_lock(&priv->lock);
 432	ret = adin1110_read_reg(priv, ADIN1110_MDIOACC, &val);
 433	mutex_unlock(&priv->lock);
 434	if (ret < 0)
 435		return 0;
 436
 437	return val;
 438}
 439
 440static int adin1110_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 441{
 442	struct adin1110_priv *priv = bus->priv;
 443	u32 val = 0;
 444	int ret;
 445
 446	if (mdio_phy_id_is_c45(phy_id))
 447		return -EOPNOTSUPP;
 448
 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);
 453
 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);
 458	if (ret < 0)
 459		return ret;
 460
 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.
 466	 */
 467	ret = readx_poll_timeout(adin1110_read_mdio_acc, priv, val,
 468				 (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
 469	if (ret < 0)
 470		return ret;
 471
 472	return (val & ADIN1110_MDIO_DATA);
 473}
 474
 475static int adin1110_mdio_write(struct mii_bus *bus, int phy_id,
 476			       int reg, u16 reg_val)
 477{
 478	struct adin1110_priv *priv = bus->priv;
 479	u32 val = 0;
 480	int ret;
 481
 482	if (mdio_phy_id_is_c45(phy_id))
 483		return -EOPNOTSUPP;
 484
 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);
 490
 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);
 495	if (ret < 0)
 496		return ret;
 497
 498	return readx_poll_timeout(adin1110_read_mdio_acc, priv, val,
 499				  (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
 500}
 501
 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.
 506 */
 507static int adin1110_register_mdiobus(struct adin1110_priv *priv,
 508				     struct device *dev)
 509{
 510	struct mii_bus *mii_bus;
 511	int ret;
 512
 513	mii_bus = devm_mdiobus_alloc(dev);
 514	if (!mii_bus)
 515		return -ENOMEM;
 516
 517	snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u",
 518		 priv->cfg->name, spi_get_chipselect(priv->spidev, 0));
 519
 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	snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
 527
 528	ret = devm_mdiobus_register(dev, mii_bus);
 529	if (ret)
 530		return ret;
 531
 532	priv->mii_bus = mii_bus;
 533
 534	return 0;
 535}
 536
 537static bool adin1110_port_rx_ready(struct adin1110_port_priv *port_priv,
 538				   u32 status)
 539{
 540	if (!netif_oper_up(port_priv->netdev))
 541		return false;
 542
 543	if (!port_priv->nr)
 544		return !!(status & ADIN1110_RX_RDY);
 545	else
 546		return !!(status & ADIN2111_P2_RX_RDY);
 547}
 548
 549static void adin1110_read_frames(struct adin1110_port_priv *port_priv,
 550				 unsigned int budget)
 551{
 552	struct adin1110_priv *priv = port_priv->priv;
 553	u32 status1;
 554	int ret;
 555
 556	while (budget) {
 557		ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
 558		if (ret < 0)
 559			return;
 560
 561		if (!adin1110_port_rx_ready(port_priv, status1))
 562			break;
 563
 564		ret = adin1110_read_fifo(port_priv);
 565		if (ret < 0)
 566			return;
 567
 568		budget--;
 569	}
 570}
 571
 572static void adin1110_wake_queues(struct adin1110_priv *priv)
 573{
 574	int i;
 575
 576	for (i = 0; i < priv->cfg->ports_nr; i++)
 577		netif_wake_queue(priv->ports[i]->netdev);
 578}
 579
 580static irqreturn_t adin1110_irq(int irq, void *p)
 581{
 582	struct adin1110_priv *priv = p;
 583	u32 status1;
 584	u32 val;
 585	int ret;
 586	int i;
 587
 588	mutex_lock(&priv->lock);
 589
 590	ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
 591	if (ret < 0)
 592		goto out;
 593
 594	if (priv->append_crc && (status1 & ADIN1110_SPI_ERR))
 595		dev_warn_ratelimited(&priv->spidev->dev,
 596				     "SPI CRC error on write.\n");
 597
 598	ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
 599	if (ret < 0)
 600		goto out;
 601
 602	/* TX FIFO space is expressed in half-words */
 603	priv->tx_space = 2 * val;
 604
 605	for (i = 0; i < priv->cfg->ports_nr; i++) {
 606		if (adin1110_port_rx_ready(priv->ports[i], status1))
 607			adin1110_read_frames(priv->ports[i],
 608					     ADIN1110_MAX_FRAMES_READ);
 609	}
 610
 611	/* clear IRQ sources */
 612	adin1110_write_reg(priv, ADIN1110_STATUS0, ADIN1110_CLEAR_STATUS0);
 613	adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask);
 614
 615out:
 616	mutex_unlock(&priv->lock);
 617
 618	if (priv->tx_space > 0 && ret >= 0)
 619		adin1110_wake_queues(priv);
 620
 621	return IRQ_HANDLED;
 622}
 623
 624/* ADIN1110 can filter up to 16 MAC addresses, mac_nr here is the slot used */
 625static int adin1110_write_mac_address(struct adin1110_port_priv *port_priv,
 626				      int mac_nr, const u8 *addr,
 627				      u8 *mask, u32 port_rules)
 628{
 629	struct adin1110_priv *priv = port_priv->priv;
 630	u32 offset = mac_nr * 2;
 631	u32 port_rules_mask;
 632	int ret;
 633	u32 val;
 634
 635	if (!port_priv->nr)
 636		port_rules_mask = ADIN1110_MAC_ADDR_APPLY2PORT;
 637	else
 638		port_rules_mask = ADIN2111_MAC_ADDR_APPLY2PORT2;
 639
 640	if (port_rules & port_rules_mask)
 641		port_rules_mask |= ADIN1110_MAC_ADDR_TO_HOST | ADIN2111_MAC_ADDR_TO_OTHER_PORT;
 642
 643	port_rules_mask |= GENMASK(15, 0);
 644	val = port_rules | get_unaligned_be16(&addr[0]);
 645	ret = adin1110_set_bits(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset,
 646				port_rules_mask, val);
 647	if (ret < 0)
 648		return ret;
 649
 650	val = get_unaligned_be32(&addr[2]);
 651	ret =  adin1110_write_reg(priv,
 652				  ADIN1110_MAC_ADDR_FILTER_LWR + offset, val);
 653	if (ret < 0)
 654		return ret;
 655
 656	/* Only the first two MAC address slots support masking. */
 657	if (mac_nr < ADIN_MAC_P1_ADDR_SLOT) {
 658		val = get_unaligned_be16(&mask[0]);
 659		ret = adin1110_write_reg(priv,
 660					 ADIN1110_MAC_ADDR_MASK_UPR + offset,
 661					 val);
 662		if (ret < 0)
 663			return ret;
 664
 665		val = get_unaligned_be32(&mask[2]);
 666		return adin1110_write_reg(priv,
 667					  ADIN1110_MAC_ADDR_MASK_LWR + offset,
 668					  val);
 669	}
 670
 671	return 0;
 672}
 673
 674static int adin1110_clear_mac_address(struct adin1110_priv *priv, int mac_nr)
 675{
 676	u32 offset = mac_nr * 2;
 677	int ret;
 678
 679	ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset, 0);
 680	if (ret < 0)
 681		return ret;
 682
 683	ret =  adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + offset, 0);
 684	if (ret < 0)
 685		return ret;
 686
 687	/* only the first two MAC address slots are maskable */
 688	if (mac_nr <= 1) {
 689		ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_UPR + offset, 0);
 690		if (ret < 0)
 691			return ret;
 692
 693		ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_LWR + offset, 0);
 694	}
 695
 696	return ret;
 697}
 698
 699static u32 adin1110_port_rules(struct adin1110_port_priv *port_priv,
 700			       bool fw_to_host,
 701			       bool fw_to_other_port)
 702{
 703	u32 port_rules = 0;
 704
 705	if (!port_priv->nr)
 706		port_rules |= ADIN1110_MAC_ADDR_APPLY2PORT;
 707	else
 708		port_rules |= ADIN2111_MAC_ADDR_APPLY2PORT2;
 709
 710	if (fw_to_host)
 711		port_rules |= ADIN1110_MAC_ADDR_TO_HOST;
 712
 713	if (fw_to_other_port && port_priv->priv->forwarding)
 714		port_rules |= ADIN2111_MAC_ADDR_TO_OTHER_PORT;
 715
 716	return port_rules;
 717}
 718
 719static int adin1110_multicast_filter(struct adin1110_port_priv *port_priv,
 720				     int mac_nr, bool accept_multicast)
 721{
 722	u8 mask[ETH_ALEN] = {0};
 723	u8 mac[ETH_ALEN] = {0};
 724	u32 port_rules = 0;
 725
 726	mask[0] = BIT(0);
 727	mac[0] = BIT(0);
 728
 729	if (accept_multicast && port_priv->state == BR_STATE_FORWARDING)
 730		port_rules = adin1110_port_rules(port_priv, true, true);
 731
 732	return adin1110_write_mac_address(port_priv, mac_nr, mac,
 733					  mask, port_rules);
 734}
 735
 736static int adin1110_broadcasts_filter(struct adin1110_port_priv *port_priv,
 737				      int mac_nr, bool accept_broadcast)
 738{
 739	u32 port_rules = 0;
 740	u8 mask[ETH_ALEN];
 741
 742	eth_broadcast_addr(mask);
 743
 744	if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING)
 745		port_rules = adin1110_port_rules(port_priv, true, true);
 746
 747	return adin1110_write_mac_address(port_priv, mac_nr, mask,
 748					  mask, port_rules);
 749}
 750
 751static int adin1110_set_mac_address(struct net_device *netdev,
 752				    const unsigned char *dev_addr)
 753{
 754	struct adin1110_port_priv *port_priv = netdev_priv(netdev);
 755	u8 mask[ETH_ALEN];
 756	u32 port_rules;
 757	u32 mac_slot;
 758
 759	if (!is_valid_ether_addr(dev_addr))
 760		return -EADDRNOTAVAIL;
 761
 762	eth_hw_addr_set(netdev, dev_addr);
 763	eth_broadcast_addr(mask);
 764
 765	mac_slot = (!port_priv->nr) ?  ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
 766	port_rules = adin1110_port_rules(port_priv, true, false);
 767
 768	return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr,
 769					  mask, port_rules);
 770}
 771
 772static int adin1110_ndo_set_mac_address(struct net_device *netdev, void *addr)
 773{
 774	struct sockaddr *sa = addr;
 775	int ret;
 776
 777	ret = eth_prepare_mac_addr_change(netdev, addr);
 778	if (ret < 0)
 779		return ret;
 780
 781	return adin1110_set_mac_address(netdev, sa->sa_data);
 782}
 783
 784static int adin1110_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
 785{
 786	if (!netif_running(netdev))
 787		return -EINVAL;
 788
 789	return phy_do_ioctl(netdev, rq, cmd);
 790}
 791
 792static int adin1110_set_promisc_mode(struct adin1110_port_priv *port_priv,
 793				     bool promisc)
 794{
 795	struct adin1110_priv *priv = port_priv->priv;
 796	u32 mask;
 797
 798	if (port_priv->state != BR_STATE_FORWARDING)
 799		promisc = false;
 800
 801	if (!port_priv->nr)
 802		mask = ADIN1110_FWD_UNK2HOST;
 803	else
 804		mask = ADIN2111_P2_FWD_UNK2HOST;
 805
 806	return adin1110_set_bits(priv, ADIN1110_CONFIG2,
 807				 mask, promisc ? mask : 0);
 808}
 809
 810static int adin1110_setup_rx_mode(struct adin1110_port_priv *port_priv)
 811{
 812	int ret;
 813
 814	ret = adin1110_set_promisc_mode(port_priv,
 815					!!(port_priv->flags & IFF_PROMISC));
 816	if (ret < 0)
 817		return ret;
 818
 819	ret = adin1110_multicast_filter(port_priv, ADIN_MAC_MULTICAST_ADDR_SLOT,
 820					!!(port_priv->flags & IFF_ALLMULTI));
 821	if (ret < 0)
 822		return ret;
 823
 824	ret = adin1110_broadcasts_filter(port_priv,
 825					 ADIN_MAC_BROADCAST_ADDR_SLOT,
 826					 !!(port_priv->flags & IFF_BROADCAST));
 827	if (ret < 0)
 828		return ret;
 829
 830	return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1,
 831				 ADIN1110_CONFIG1_SYNC, ADIN1110_CONFIG1_SYNC);
 832}
 833
 834static bool adin1110_can_offload_forwarding(struct adin1110_priv *priv)
 835{
 836	int i;
 837
 838	if (priv->cfg->id != ADIN2111_MAC)
 839		return false;
 840
 841	/* Can't enable forwarding if ports do not belong to the same bridge */
 842	if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge)
 843		return false;
 844
 845	/* Can't enable forwarding if there is a port
 846	 * that has been blocked by STP.
 847	 */
 848	for (i = 0; i < priv->cfg->ports_nr; i++) {
 849		if (priv->ports[i]->state != BR_STATE_FORWARDING)
 850			return false;
 851	}
 852
 853	return true;
 854}
 855
 856static void adin1110_rx_mode_work(struct work_struct *work)
 857{
 858	struct adin1110_port_priv *port_priv;
 859	struct adin1110_priv *priv;
 860
 861	port_priv = container_of(work, struct adin1110_port_priv, rx_mode_work);
 862	priv = port_priv->priv;
 863
 864	mutex_lock(&priv->lock);
 865	adin1110_setup_rx_mode(port_priv);
 866	mutex_unlock(&priv->lock);
 867}
 868
 869static void adin1110_set_rx_mode(struct net_device *dev)
 870{
 871	struct adin1110_port_priv *port_priv = netdev_priv(dev);
 872	struct adin1110_priv *priv = port_priv->priv;
 873
 874	spin_lock(&priv->state_lock);
 875
 876	port_priv->flags = dev->flags;
 877	schedule_work(&port_priv->rx_mode_work);
 878
 879	spin_unlock(&priv->state_lock);
 880}
 881
 882static int adin1110_net_open(struct net_device *net_dev)
 883{
 884	struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
 885	struct adin1110_priv *priv = port_priv->priv;
 886	u32 val;
 887	int ret;
 888
 889	mutex_lock(&priv->lock);
 890
 891	/* Configure MAC to compute and append the FCS itself. */
 892	ret = adin1110_write_reg(priv, ADIN1110_CONFIG2, ADIN1110_CRC_APPEND);
 893	if (ret < 0)
 894		goto out;
 895
 896	val = ADIN1110_TX_RDY_IRQ | ADIN1110_RX_RDY_IRQ | ADIN1110_SPI_ERR_IRQ;
 897	if (priv->cfg->id == ADIN2111_MAC)
 898		val |= ADIN2111_RX_RDY_IRQ;
 899
 900	priv->irq_mask = val;
 901	ret = adin1110_write_reg(priv, ADIN1110_IMASK1, ~val);
 902	if (ret < 0) {
 903		netdev_err(net_dev, "Failed to enable chip IRQs: %d\n", ret);
 904		goto out;
 905	}
 906
 907	ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
 908	if (ret < 0) {
 909		netdev_err(net_dev, "Failed to read TX FIFO space: %d\n", ret);
 910		goto out;
 911	}
 912
 913	priv->tx_space = 2 * val;
 914
 915	port_priv->state = BR_STATE_FORWARDING;
 916	ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr);
 917	if (ret < 0) {
 918		netdev_err(net_dev, "Could not set MAC address: %pM, %d\n",
 919			   net_dev->dev_addr, ret);
 920		goto out;
 921	}
 922
 923	ret = adin1110_set_bits(priv, ADIN1110_CONFIG1, ADIN1110_CONFIG1_SYNC,
 924				ADIN1110_CONFIG1_SYNC);
 925
 926out:
 927	mutex_unlock(&priv->lock);
 928
 929	if (ret < 0)
 930		return ret;
 931
 932	phy_start(port_priv->phydev);
 933
 934	netif_start_queue(net_dev);
 935
 936	return 0;
 937}
 938
 939static int adin1110_net_stop(struct net_device *net_dev)
 940{
 941	struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
 942	struct adin1110_priv *priv = port_priv->priv;
 943	u32 mask;
 944	int ret;
 945
 946	mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ;
 947
 948	/* Disable RX RDY IRQs */
 949	mutex_lock(&priv->lock);
 950	ret = adin1110_set_bits(priv, ADIN1110_IMASK1, mask, mask);
 951	mutex_unlock(&priv->lock);
 952	if (ret < 0)
 953		return ret;
 954
 955	netif_stop_queue(port_priv->netdev);
 956	flush_work(&port_priv->tx_work);
 957	phy_stop(port_priv->phydev);
 958
 959	return 0;
 960}
 961
 962static void adin1110_tx_work(struct work_struct *work)
 963{
 964	struct adin1110_port_priv *port_priv;
 965	struct adin1110_priv *priv;
 966	struct sk_buff *txb;
 967	int ret;
 968
 969	port_priv = container_of(work, struct adin1110_port_priv, tx_work);
 970	priv = port_priv->priv;
 971
 972	mutex_lock(&priv->lock);
 973
 974	while ((txb = skb_dequeue(&port_priv->txq))) {
 975		ret = adin1110_write_fifo(port_priv, txb);
 976		if (ret < 0)
 977			dev_err_ratelimited(&priv->spidev->dev,
 978					    "Frame write error: %d\n", ret);
 979
 980		dev_kfree_skb(txb);
 981	}
 982
 983	mutex_unlock(&priv->lock);
 984}
 985
 986static netdev_tx_t adin1110_start_xmit(struct sk_buff *skb, struct net_device *dev)
 987{
 988	struct adin1110_port_priv *port_priv = netdev_priv(dev);
 989	struct adin1110_priv *priv = port_priv->priv;
 990	netdev_tx_t netdev_ret = NETDEV_TX_OK;
 991	u32 tx_space_needed;
 992
 993	tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN;
 994	if (tx_space_needed > priv->tx_space) {
 995		netif_stop_queue(dev);
 996		netdev_ret = NETDEV_TX_BUSY;
 997	} else {
 998		priv->tx_space -= tx_space_needed;
 999		skb_queue_tail(&port_priv->txq, skb);
1000	}
1001
1002	schedule_work(&port_priv->tx_work);
1003
1004	return netdev_ret;
1005}
1006
1007static void adin1110_ndo_get_stats64(struct net_device *dev,
1008				     struct rtnl_link_stats64 *storage)
1009{
1010	struct adin1110_port_priv *port_priv = netdev_priv(dev);
1011
1012	storage->rx_packets = port_priv->rx_packets;
1013	storage->tx_packets = port_priv->tx_packets;
1014
1015	storage->rx_bytes = port_priv->rx_bytes;
1016	storage->tx_bytes = port_priv->tx_bytes;
1017}
1018
1019static int adin1110_port_get_port_parent_id(struct net_device *dev,
1020					    struct netdev_phys_item_id *ppid)
1021{
1022	struct adin1110_port_priv *port_priv = netdev_priv(dev);
1023	struct adin1110_priv *priv = port_priv->priv;
1024
1025	ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN);
1026	memcpy(ppid->id, priv->mii_bus_name, ppid->id_len);
1027
1028	return 0;
1029}
1030
1031static int adin1110_ndo_get_phys_port_name(struct net_device *dev,
1032					   char *name, size_t len)
1033{
1034	struct adin1110_port_priv *port_priv = netdev_priv(dev);
1035	int err;
1036
1037	err = snprintf(name, len, "p%d", port_priv->nr);
1038	if (err >= len)
1039		return -EINVAL;
1040
1041	return 0;
1042}
1043
1044static const struct net_device_ops adin1110_netdev_ops = {
1045	.ndo_open		= adin1110_net_open,
1046	.ndo_stop		= adin1110_net_stop,
1047	.ndo_eth_ioctl		= adin1110_ioctl,
1048	.ndo_start_xmit		= adin1110_start_xmit,
1049	.ndo_set_mac_address	= adin1110_ndo_set_mac_address,
1050	.ndo_set_rx_mode	= adin1110_set_rx_mode,
1051	.ndo_validate_addr	= eth_validate_addr,
1052	.ndo_get_stats64	= adin1110_ndo_get_stats64,
1053	.ndo_get_port_parent_id	= adin1110_port_get_port_parent_id,
1054	.ndo_get_phys_port_name	= adin1110_ndo_get_phys_port_name,
1055};
1056
1057static void adin1110_get_drvinfo(struct net_device *dev,
1058				 struct ethtool_drvinfo *di)
1059{
1060	strscpy(di->driver, "ADIN1110", sizeof(di->driver));
1061	strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info));
1062}
1063
1064static const struct ethtool_ops adin1110_ethtool_ops = {
1065	.get_drvinfo		= adin1110_get_drvinfo,
1066	.get_link		= ethtool_op_get_link,
1067	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
1068	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
1069};
1070
1071static void adin1110_adjust_link(struct net_device *dev)
1072{
1073	struct phy_device *phydev = dev->phydev;
1074
1075	if (!phydev->link)
1076		phy_print_status(phydev);
1077}
1078
1079/* PHY ID is stored in the MAC registers too,
1080 * check spi connection by reading it.
1081 */
1082static int adin1110_check_spi(struct adin1110_priv *priv)
1083{
1084	struct gpio_desc *reset_gpio;
1085	int ret;
1086	u32 val;
1087
1088	reset_gpio = devm_gpiod_get_optional(&priv->spidev->dev, "reset",
1089					     GPIOD_OUT_LOW);
1090	if (reset_gpio) {
1091		/* MISO pin is used for internal configuration, can't have
1092		 * anyone else disturbing the SDO line.
1093		 */
1094		spi_bus_lock(priv->spidev->controller);
1095
1096		gpiod_set_value(reset_gpio, 1);
1097		fsleep(10000);
1098		gpiod_set_value(reset_gpio, 0);
1099
1100		/* Need to wait 90 ms before interacting with
1101		 * the MAC after a HW reset.
1102		 */
1103		fsleep(90000);
1104
1105		spi_bus_unlock(priv->spidev->controller);
1106	}
1107
1108	ret = adin1110_read_reg(priv, ADIN1110_PHY_ID, &val);
1109	if (ret < 0)
1110		return ret;
1111
1112	if (val != priv->cfg->phy_id_val) {
1113		dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n",
1114			priv->cfg->phy_id_val, val);
1115		return -EIO;
1116	}
1117
1118	return 0;
1119}
1120
1121static int adin1110_hw_forwarding(struct adin1110_priv *priv, bool enable)
1122{
1123	int ret;
1124	int i;
1125
1126	priv->forwarding = enable;
1127
1128	if (!priv->forwarding) {
1129		for (i = ADIN_MAC_FDB_ADDR_SLOT; i < ADIN_MAC_MAX_ADDR_SLOTS; i++) {
1130			ret = adin1110_clear_mac_address(priv, i);
1131			if (ret < 0)
1132				return ret;
1133		}
1134	}
1135
1136	/* Forwarding is optimised when MAC runs in Cut Through mode. */
1137	ret = adin1110_set_bits(priv, ADIN1110_CONFIG2,
1138				ADIN2111_PORT_CUT_THRU_EN,
1139				priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0);
1140	if (ret < 0)
1141		return ret;
1142
1143	for (i = 0; i < priv->cfg->ports_nr; i++) {
1144		ret = adin1110_setup_rx_mode(priv->ports[i]);
1145		if (ret < 0)
1146			return ret;
1147	}
1148
1149	return ret;
1150}
1151
1152static int adin1110_port_bridge_join(struct adin1110_port_priv *port_priv,
1153				     struct net_device *bridge)
1154{
1155	struct adin1110_priv *priv = port_priv->priv;
1156	int ret;
1157
1158	port_priv->bridge = bridge;
1159
1160	if (adin1110_can_offload_forwarding(priv)) {
1161		mutex_lock(&priv->lock);
1162		ret = adin1110_hw_forwarding(priv, true);
1163		mutex_unlock(&priv->lock);
1164
1165		if (ret < 0)
1166			return ret;
1167	}
1168
1169	return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr);
1170}
1171
1172static int adin1110_port_bridge_leave(struct adin1110_port_priv *port_priv,
1173				      struct net_device *bridge)
1174{
1175	struct adin1110_priv *priv = port_priv->priv;
1176	int ret;
1177
1178	port_priv->bridge = NULL;
1179
1180	mutex_lock(&priv->lock);
1181	ret = adin1110_hw_forwarding(priv, false);
1182	mutex_unlock(&priv->lock);
1183
1184	return ret;
1185}
1186
1187static bool adin1110_port_dev_check(const struct net_device *dev)
1188{
1189	return dev->netdev_ops == &adin1110_netdev_ops;
1190}
1191
1192static int adin1110_netdevice_event(struct notifier_block *unused,
1193				    unsigned long event, void *ptr)
1194{
1195	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1196	struct adin1110_port_priv *port_priv = netdev_priv(dev);
1197	struct netdev_notifier_changeupper_info *info = ptr;
1198	int ret = 0;
1199
1200	if (!adin1110_port_dev_check(dev))
1201		return NOTIFY_DONE;
1202
1203	switch (event) {
1204	case NETDEV_CHANGEUPPER:
1205		if (netif_is_bridge_master(info->upper_dev)) {
1206			if (info->linking)
1207				ret = adin1110_port_bridge_join(port_priv, info->upper_dev);
1208			else
1209				ret = adin1110_port_bridge_leave(port_priv, info->upper_dev);
1210		}
1211		break;
1212	default:
1213		break;
1214	}
1215
1216	return notifier_from_errno(ret);
1217}
1218
1219static struct notifier_block adin1110_netdevice_nb = {
1220	.notifier_call = adin1110_netdevice_event,
1221};
1222
1223static void adin1110_disconnect_phy(void *data)
1224{
1225	phy_disconnect(data);
1226}
1227
1228static int adin1110_port_set_forwarding_state(struct adin1110_port_priv *port_priv)
1229{
1230	struct adin1110_priv *priv = port_priv->priv;
1231	int ret;
1232
1233	port_priv->state = BR_STATE_FORWARDING;
1234
1235	mutex_lock(&priv->lock);
1236	ret = adin1110_set_mac_address(port_priv->netdev,
1237				       port_priv->netdev->dev_addr);
1238	if (ret < 0)
1239		goto out;
1240
1241	if (adin1110_can_offload_forwarding(priv))
1242		ret = adin1110_hw_forwarding(priv, true);
1243	else
1244		ret = adin1110_setup_rx_mode(port_priv);
1245out:
1246	mutex_unlock(&priv->lock);
1247
1248	return ret;
1249}
1250
1251static int adin1110_port_set_blocking_state(struct adin1110_port_priv *port_priv)
1252{
1253	u8 mac[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x00};
1254	struct adin1110_priv *priv = port_priv->priv;
1255	u8 mask[ETH_ALEN];
1256	u32 port_rules;
1257	int mac_slot;
1258	int ret;
1259
1260	port_priv->state = BR_STATE_BLOCKING;
1261
1262	mutex_lock(&priv->lock);
1263
1264	mac_slot = (!port_priv->nr) ?  ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
1265	ret = adin1110_clear_mac_address(priv, mac_slot);
1266	if (ret < 0)
1267		goto out;
1268
1269	ret = adin1110_hw_forwarding(priv, false);
1270	if (ret < 0)
1271		goto out;
1272
1273	/* Allow only BPDUs to be passed to the CPU */
1274	eth_broadcast_addr(mask);
1275	port_rules = adin1110_port_rules(port_priv, true, false);
1276	ret = adin1110_write_mac_address(port_priv, mac_slot, mac,
1277					 mask, port_rules);
1278out:
1279	mutex_unlock(&priv->lock);
1280
1281	return ret;
1282}
1283
1284/* ADIN1110/2111 does not have any native STP support.
1285 * Listen for bridge core state changes and
1286 * allow all frames to pass or only the BPDUs.
1287 */
1288static int adin1110_port_attr_stp_state_set(struct adin1110_port_priv *port_priv,
1289					    u8 state)
1290{
1291	switch (state) {
1292	case BR_STATE_FORWARDING:
1293		return adin1110_port_set_forwarding_state(port_priv);
1294	case BR_STATE_LEARNING:
1295	case BR_STATE_LISTENING:
1296	case BR_STATE_DISABLED:
1297	case BR_STATE_BLOCKING:
1298		return adin1110_port_set_blocking_state(port_priv);
1299	default:
1300		return -EINVAL;
1301	}
1302}
1303
1304static int adin1110_port_attr_set(struct net_device *dev, const void *ctx,
1305				  const struct switchdev_attr *attr,
1306				  struct netlink_ext_ack *extack)
1307{
1308	struct adin1110_port_priv *port_priv = netdev_priv(dev);
1309
1310	switch (attr->id) {
1311	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1312		return adin1110_port_attr_stp_state_set(port_priv,
1313							attr->u.stp_state);
1314	default:
1315		return -EOPNOTSUPP;
1316	}
1317}
1318
1319static int adin1110_switchdev_blocking_event(struct notifier_block *unused,
1320					     unsigned long event,
1321					     void *ptr)
1322{
1323	struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
1324	int ret;
1325
1326	if (event == SWITCHDEV_PORT_ATTR_SET) {
1327		ret = switchdev_handle_port_attr_set(netdev, ptr,
1328						     adin1110_port_dev_check,
1329						     adin1110_port_attr_set);
1330
1331		return notifier_from_errno(ret);
1332	}
1333
1334	return NOTIFY_DONE;
1335}
1336
1337static struct notifier_block adin1110_switchdev_blocking_notifier = {
1338	.notifier_call = adin1110_switchdev_blocking_event,
1339};
1340
1341static void adin1110_fdb_offload_notify(struct net_device *netdev,
1342					struct switchdev_notifier_fdb_info *rcv)
1343{
1344	struct switchdev_notifier_fdb_info info = {};
1345
1346	info.addr = rcv->addr;
1347	info.vid = rcv->vid;
1348	info.offloaded = true;
1349	call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
1350				 netdev, &info.info, NULL);
1351}
1352
1353static int adin1110_fdb_add(struct adin1110_port_priv *port_priv,
1354			    struct switchdev_notifier_fdb_info *fdb)
1355{
1356	struct adin1110_priv *priv = port_priv->priv;
1357	struct adin1110_port_priv *other_port;
1358	u8 mask[ETH_ALEN];
1359	u32 port_rules;
1360	int mac_nr;
1361	u32 val;
1362	int ret;
1363
1364	netdev_dbg(port_priv->netdev,
1365		   "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
1366		    __func__, fdb->addr, fdb->vid, fdb->added_by_user,
1367		    fdb->offloaded, port_priv->nr);
1368
1369	if (!priv->forwarding)
1370		return 0;
1371
1372	if (fdb->is_local)
1373		return -EINVAL;
1374
1375	/* Find free FDB slot on device. */
1376	for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
1377		ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
1378		if (ret < 0)
1379			return ret;
1380		if (!val)
1381			break;
1382	}
1383
1384	if (mac_nr == ADIN_MAC_MAX_ADDR_SLOTS)
1385		return -ENOMEM;
1386
1387	other_port = priv->ports[!port_priv->nr];
1388	port_rules = adin1110_port_rules(other_port, false, true);
1389	eth_broadcast_addr(mask);
1390
1391	return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr,
1392					  mask, port_rules);
1393}
1394
1395static int adin1110_read_mac(struct adin1110_priv *priv, int mac_nr, u8 *addr)
1396{
1397	u32 val;
1398	int ret;
1399
1400	ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
1401	if (ret < 0)
1402		return ret;
1403
1404	put_unaligned_be16(val, addr);
1405
1406	ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + (mac_nr * 2), &val);
1407	if (ret < 0)
1408		return ret;
1409
1410	put_unaligned_be32(val, addr + 2);
1411
1412	return 0;
1413}
1414
1415static int adin1110_fdb_del(struct adin1110_port_priv *port_priv,
1416			    struct switchdev_notifier_fdb_info *fdb)
1417{
1418	struct adin1110_priv *priv = port_priv->priv;
1419	u8 addr[ETH_ALEN];
1420	int mac_nr;
1421	int ret;
1422
1423	netdev_dbg(port_priv->netdev,
1424		   "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
1425		   __func__, fdb->addr, fdb->vid, fdb->added_by_user,
1426		   fdb->offloaded, port_priv->nr);
1427
1428	if (fdb->is_local)
1429		return -EINVAL;
1430
1431	for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
1432		ret = adin1110_read_mac(priv, mac_nr, addr);
1433		if (ret < 0)
1434			return ret;
1435
1436		if (ether_addr_equal(addr, fdb->addr)) {
1437			ret = adin1110_clear_mac_address(priv, mac_nr);
1438			if (ret < 0)
1439				return ret;
1440		}
1441	}
1442
1443	return 0;
1444}
1445
1446static void adin1110_switchdev_event_work(struct work_struct *work)
1447{
1448	struct adin1110_switchdev_event_work *switchdev_work;
1449	struct adin1110_port_priv *port_priv;
1450	int ret;
1451
1452	switchdev_work = container_of(work, struct adin1110_switchdev_event_work, work);
1453	port_priv = switchdev_work->port_priv;
1454
1455	mutex_lock(&port_priv->priv->lock);
1456
1457	switch (switchdev_work->event) {
1458	case SWITCHDEV_FDB_ADD_TO_DEVICE:
1459		ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info);
1460		if (!ret)
1461			adin1110_fdb_offload_notify(port_priv->netdev,
1462						    &switchdev_work->fdb_info);
1463		break;
1464	case SWITCHDEV_FDB_DEL_TO_DEVICE:
1465		adin1110_fdb_del(port_priv, &switchdev_work->fdb_info);
1466		break;
1467	default:
1468		break;
1469	}
1470
1471	mutex_unlock(&port_priv->priv->lock);
1472
1473	kfree(switchdev_work->fdb_info.addr);
1474	kfree(switchdev_work);
1475	dev_put(port_priv->netdev);
1476}
1477
1478/* called under rcu_read_lock() */
1479static int adin1110_switchdev_event(struct notifier_block *unused,
1480				    unsigned long event, void *ptr)
1481{
1482	struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
1483	struct adin1110_port_priv *port_priv = netdev_priv(netdev);
1484	struct adin1110_switchdev_event_work *switchdev_work;
1485	struct switchdev_notifier_fdb_info *fdb_info = ptr;
1486
1487	if (!adin1110_port_dev_check(netdev))
1488		return NOTIFY_DONE;
1489
1490	switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
1491	if (WARN_ON(!switchdev_work))
1492		return NOTIFY_BAD;
1493
1494	INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work);
1495	switchdev_work->port_priv = port_priv;
1496	switchdev_work->event = event;
1497
1498	switch (event) {
1499	case SWITCHDEV_FDB_ADD_TO_DEVICE:
1500	case SWITCHDEV_FDB_DEL_TO_DEVICE:
1501		memcpy(&switchdev_work->fdb_info, ptr,
1502		       sizeof(switchdev_work->fdb_info));
1503		switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1504
1505		if (!switchdev_work->fdb_info.addr)
1506			goto err_addr_alloc;
1507
1508		ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
1509				fdb_info->addr);
1510		dev_hold(netdev);
1511		break;
1512	default:
1513		kfree(switchdev_work);
1514		return NOTIFY_DONE;
1515	}
1516
1517	queue_work(system_long_wq, &switchdev_work->work);
1518
1519	return NOTIFY_DONE;
1520
1521err_addr_alloc:
1522	kfree(switchdev_work);
1523	return NOTIFY_BAD;
1524}
1525
1526static struct notifier_block adin1110_switchdev_notifier = {
1527	.notifier_call = adin1110_switchdev_event,
1528};
1529
1530static void adin1110_unregister_notifiers(void)
1531{
1532	unregister_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
1533	unregister_switchdev_notifier(&adin1110_switchdev_notifier);
1534	unregister_netdevice_notifier(&adin1110_netdevice_nb);
1535}
1536
1537static int adin1110_setup_notifiers(void)
1538{
1539	int ret;
1540
1541	ret = register_netdevice_notifier(&adin1110_netdevice_nb);
1542	if (ret < 0)
1543		return ret;
1544
1545	ret = register_switchdev_notifier(&adin1110_switchdev_notifier);
1546	if (ret < 0)
1547		goto err_netdev;
1548
1549	ret = register_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
1550	if (ret < 0)
1551		goto err_sdev;
1552
1553	return 0;
1554
1555err_sdev:
1556	unregister_switchdev_notifier(&adin1110_switchdev_notifier);
1557
1558err_netdev:
1559	unregister_netdevice_notifier(&adin1110_netdevice_nb);
1560
1561	return ret;
1562}
1563
1564static int adin1110_probe_netdevs(struct adin1110_priv *priv)
1565{
1566	struct device *dev = &priv->spidev->dev;
1567	struct adin1110_port_priv *port_priv;
1568	struct net_device *netdev;
1569	int ret;
1570	int i;
1571
1572	for (i = 0; i < priv->cfg->ports_nr; i++) {
1573		netdev = devm_alloc_etherdev(dev, sizeof(*port_priv));
1574		if (!netdev)
1575			return -ENOMEM;
1576
1577		port_priv = netdev_priv(netdev);
1578		port_priv->netdev = netdev;
1579		port_priv->priv = priv;
1580		port_priv->cfg = priv->cfg;
1581		port_priv->nr = i;
1582		priv->ports[i] = port_priv;
1583		SET_NETDEV_DEV(netdev, dev);
1584
1585		ret = device_get_ethdev_address(dev, netdev);
1586		if (ret < 0)
1587			return ret;
1588
1589		netdev->irq = priv->spidev->irq;
1590		INIT_WORK(&port_priv->tx_work, adin1110_tx_work);
1591		INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work);
1592		skb_queue_head_init(&port_priv->txq);
1593
1594		netif_carrier_off(netdev);
1595
1596		netdev->if_port = IF_PORT_10BASET;
1597		netdev->netdev_ops = &adin1110_netdev_ops;
1598		netdev->ethtool_ops = &adin1110_ethtool_ops;
1599		netdev->priv_flags |= IFF_UNICAST_FLT;
1600		netdev->features |= NETIF_F_NETNS_LOCAL;
1601
1602		port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
1603		if (IS_ERR(port_priv->phydev)) {
1604			netdev_err(netdev, "Could not find PHY with device address: %d.\n", i);
1605			return PTR_ERR(port_priv->phydev);
1606		}
1607
1608		port_priv->phydev = phy_connect(netdev,
1609						phydev_name(port_priv->phydev),
1610						adin1110_adjust_link,
1611						PHY_INTERFACE_MODE_INTERNAL);
1612		if (IS_ERR(port_priv->phydev)) {
1613			netdev_err(netdev, "Could not connect PHY with device address: %d.\n", i);
1614			return PTR_ERR(port_priv->phydev);
1615		}
1616
1617		ret = devm_add_action_or_reset(dev, adin1110_disconnect_phy,
1618					       port_priv->phydev);
1619		if (ret < 0)
1620			return ret;
1621	}
1622
1623	/* ADIN1110 INT_N pin will be used to signal the host */
1624	ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL,
1625					adin1110_irq,
1626					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
1627					dev_name(dev), priv);
1628	if (ret < 0)
1629		return ret;
1630
1631	for (i = 0; i < priv->cfg->ports_nr; i++) {
1632		ret = devm_register_netdev(dev, priv->ports[i]->netdev);
1633		if (ret < 0) {
1634			dev_err(dev, "Failed to register network device.\n");
1635			return ret;
1636		}
1637	}
1638
1639	return 0;
1640}
1641
1642static int adin1110_probe(struct spi_device *spi)
1643{
1644	const struct spi_device_id *dev_id = spi_get_device_id(spi);
1645	struct device *dev = &spi->dev;
1646	struct adin1110_priv *priv;
1647	int ret;
1648
1649	priv = devm_kzalloc(dev, sizeof(struct adin1110_priv), GFP_KERNEL);
1650	if (!priv)
1651		return -ENOMEM;
1652
1653	priv->spidev = spi;
1654	priv->cfg = &adin1110_cfgs[dev_id->driver_data];
1655	spi->bits_per_word = 8;
1656	spi->mode = SPI_MODE_0;
1657
1658	mutex_init(&priv->lock);
1659	spin_lock_init(&priv->state_lock);
1660
1661	/* use of CRC on control and data transactions is pin dependent */
1662	priv->append_crc = device_property_read_bool(dev, "adi,spi-crc");
1663	if (priv->append_crc)
1664		crc8_populate_msb(adin1110_crc_table, 0x7);
1665
1666	ret = adin1110_check_spi(priv);
1667	if (ret < 0) {
1668		dev_err(dev, "Probe SPI Read check failed: %d\n", ret);
1669		return ret;
1670	}
1671
1672	ret = adin1110_write_reg(priv, ADIN1110_RESET, ADIN1110_SWRESET);
1673	if (ret < 0)
1674		return ret;
1675
1676	ret = adin1110_register_mdiobus(priv, dev);
1677	if (ret < 0) {
1678		dev_err(dev, "Could not register MDIO bus %d\n", ret);
1679		return ret;
1680	}
1681
1682	return adin1110_probe_netdevs(priv);
1683}
1684
1685static const struct of_device_id adin1110_match_table[] = {
1686	{ .compatible = "adi,adin1110" },
1687	{ .compatible = "adi,adin2111" },
1688	{ }
1689};
1690MODULE_DEVICE_TABLE(of, adin1110_match_table);
1691
1692static const struct spi_device_id adin1110_spi_id[] = {
1693	{ .name = "adin1110", .driver_data = ADIN1110_MAC },
1694	{ .name = "adin2111", .driver_data = ADIN2111_MAC },
1695	{ }
1696};
1697MODULE_DEVICE_TABLE(spi, adin1110_spi_id);
1698
1699static struct spi_driver adin1110_driver = {
1700	.driver = {
1701		.name = "adin1110",
1702		.of_match_table = adin1110_match_table,
1703	},
1704	.probe = adin1110_probe,
1705	.id_table = adin1110_spi_id,
1706};
1707
1708static int __init adin1110_driver_init(void)
1709{
1710	int ret;
1711
1712	ret = adin1110_setup_notifiers();
1713	if (ret < 0)
1714		return ret;
1715
1716	ret = spi_register_driver(&adin1110_driver);
1717	if (ret < 0) {
1718		adin1110_unregister_notifiers();
1719		return ret;
1720	}
1721
1722	return 0;
1723}
1724
1725static void __exit adin1110_exit(void)
1726{
1727	adin1110_unregister_notifiers();
1728	spi_unregister_driver(&adin1110_driver);
1729}
1730module_init(adin1110_driver_init);
1731module_exit(adin1110_exit);
1732
1733MODULE_DESCRIPTION("ADIN1110 Network driver");
1734MODULE_AUTHOR("Alexandru Tachici <alexandru.tachici@analog.com>");
1735MODULE_LICENSE("Dual BSD/GPL");