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