qca8k.c (82110B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2009 Felix Fietkau <nbd@nbd.name> 4 * Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org> 5 * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved. 6 * Copyright (c) 2016 John Crispin <john@phrozen.org> 7 */ 8 9#include <linux/module.h> 10#include <linux/phy.h> 11#include <linux/netdevice.h> 12#include <linux/bitfield.h> 13#include <linux/regmap.h> 14#include <net/dsa.h> 15#include <linux/of_net.h> 16#include <linux/of_mdio.h> 17#include <linux/of_platform.h> 18#include <linux/if_bridge.h> 19#include <linux/mdio.h> 20#include <linux/phylink.h> 21#include <linux/gpio/consumer.h> 22#include <linux/etherdevice.h> 23#include <linux/dsa/tag_qca.h> 24 25#include "qca8k.h" 26 27#define MIB_DESC(_s, _o, _n) \ 28 { \ 29 .size = (_s), \ 30 .offset = (_o), \ 31 .name = (_n), \ 32 } 33 34static const struct qca8k_mib_desc ar8327_mib[] = { 35 MIB_DESC(1, 0x00, "RxBroad"), 36 MIB_DESC(1, 0x04, "RxPause"), 37 MIB_DESC(1, 0x08, "RxMulti"), 38 MIB_DESC(1, 0x0c, "RxFcsErr"), 39 MIB_DESC(1, 0x10, "RxAlignErr"), 40 MIB_DESC(1, 0x14, "RxRunt"), 41 MIB_DESC(1, 0x18, "RxFragment"), 42 MIB_DESC(1, 0x1c, "Rx64Byte"), 43 MIB_DESC(1, 0x20, "Rx128Byte"), 44 MIB_DESC(1, 0x24, "Rx256Byte"), 45 MIB_DESC(1, 0x28, "Rx512Byte"), 46 MIB_DESC(1, 0x2c, "Rx1024Byte"), 47 MIB_DESC(1, 0x30, "Rx1518Byte"), 48 MIB_DESC(1, 0x34, "RxMaxByte"), 49 MIB_DESC(1, 0x38, "RxTooLong"), 50 MIB_DESC(2, 0x3c, "RxGoodByte"), 51 MIB_DESC(2, 0x44, "RxBadByte"), 52 MIB_DESC(1, 0x4c, "RxOverFlow"), 53 MIB_DESC(1, 0x50, "Filtered"), 54 MIB_DESC(1, 0x54, "TxBroad"), 55 MIB_DESC(1, 0x58, "TxPause"), 56 MIB_DESC(1, 0x5c, "TxMulti"), 57 MIB_DESC(1, 0x60, "TxUnderRun"), 58 MIB_DESC(1, 0x64, "Tx64Byte"), 59 MIB_DESC(1, 0x68, "Tx128Byte"), 60 MIB_DESC(1, 0x6c, "Tx256Byte"), 61 MIB_DESC(1, 0x70, "Tx512Byte"), 62 MIB_DESC(1, 0x74, "Tx1024Byte"), 63 MIB_DESC(1, 0x78, "Tx1518Byte"), 64 MIB_DESC(1, 0x7c, "TxMaxByte"), 65 MIB_DESC(1, 0x80, "TxOverSize"), 66 MIB_DESC(2, 0x84, "TxByte"), 67 MIB_DESC(1, 0x8c, "TxCollision"), 68 MIB_DESC(1, 0x90, "TxAbortCol"), 69 MIB_DESC(1, 0x94, "TxMultiCol"), 70 MIB_DESC(1, 0x98, "TxSingleCol"), 71 MIB_DESC(1, 0x9c, "TxExcDefer"), 72 MIB_DESC(1, 0xa0, "TxDefer"), 73 MIB_DESC(1, 0xa4, "TxLateCol"), 74 MIB_DESC(1, 0xa8, "RXUnicast"), 75 MIB_DESC(1, 0xac, "TXUnicast"), 76}; 77 78static void 79qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) 80{ 81 regaddr >>= 1; 82 *r1 = regaddr & 0x1e; 83 84 regaddr >>= 5; 85 *r2 = regaddr & 0x7; 86 87 regaddr >>= 3; 88 *page = regaddr & 0x3ff; 89} 90 91static int 92qca8k_set_lo(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 lo) 93{ 94 u16 *cached_lo = &priv->mdio_cache.lo; 95 struct mii_bus *bus = priv->bus; 96 int ret; 97 98 if (lo == *cached_lo) 99 return 0; 100 101 ret = bus->write(bus, phy_id, regnum, lo); 102 if (ret < 0) 103 dev_err_ratelimited(&bus->dev, 104 "failed to write qca8k 32bit lo register\n"); 105 106 *cached_lo = lo; 107 return 0; 108} 109 110static int 111qca8k_set_hi(struct qca8k_priv *priv, int phy_id, u32 regnum, u16 hi) 112{ 113 u16 *cached_hi = &priv->mdio_cache.hi; 114 struct mii_bus *bus = priv->bus; 115 int ret; 116 117 if (hi == *cached_hi) 118 return 0; 119 120 ret = bus->write(bus, phy_id, regnum, hi); 121 if (ret < 0) 122 dev_err_ratelimited(&bus->dev, 123 "failed to write qca8k 32bit hi register\n"); 124 125 *cached_hi = hi; 126 return 0; 127} 128 129static int 130qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) 131{ 132 int ret; 133 134 ret = bus->read(bus, phy_id, regnum); 135 if (ret >= 0) { 136 *val = ret; 137 ret = bus->read(bus, phy_id, regnum + 1); 138 *val |= ret << 16; 139 } 140 141 if (ret < 0) { 142 dev_err_ratelimited(&bus->dev, 143 "failed to read qca8k 32bit register\n"); 144 *val = 0; 145 return ret; 146 } 147 148 return 0; 149} 150 151static void 152qca8k_mii_write32(struct qca8k_priv *priv, int phy_id, u32 regnum, u32 val) 153{ 154 u16 lo, hi; 155 int ret; 156 157 lo = val & 0xffff; 158 hi = (u16)(val >> 16); 159 160 ret = qca8k_set_lo(priv, phy_id, regnum, lo); 161 if (ret >= 0) 162 ret = qca8k_set_hi(priv, phy_id, regnum + 1, hi); 163} 164 165static int 166qca8k_set_page(struct qca8k_priv *priv, u16 page) 167{ 168 u16 *cached_page = &priv->mdio_cache.page; 169 struct mii_bus *bus = priv->bus; 170 int ret; 171 172 if (page == *cached_page) 173 return 0; 174 175 ret = bus->write(bus, 0x18, 0, page); 176 if (ret < 0) { 177 dev_err_ratelimited(&bus->dev, 178 "failed to set qca8k page\n"); 179 return ret; 180 } 181 182 *cached_page = page; 183 usleep_range(1000, 2000); 184 return 0; 185} 186 187static int 188qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val) 189{ 190 return regmap_read(priv->regmap, reg, val); 191} 192 193static int 194qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val) 195{ 196 return regmap_write(priv->regmap, reg, val); 197} 198 199static int 200qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) 201{ 202 return regmap_update_bits(priv->regmap, reg, mask, write_val); 203} 204 205static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb) 206{ 207 struct qca8k_mgmt_eth_data *mgmt_eth_data; 208 struct qca8k_priv *priv = ds->priv; 209 struct qca_mgmt_ethhdr *mgmt_ethhdr; 210 u8 len, cmd; 211 212 mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb); 213 mgmt_eth_data = &priv->mgmt_eth_data; 214 215 cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command); 216 len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command); 217 218 /* Make sure the seq match the requested packet */ 219 if (mgmt_ethhdr->seq == mgmt_eth_data->seq) 220 mgmt_eth_data->ack = true; 221 222 if (cmd == MDIO_READ) { 223 mgmt_eth_data->data[0] = mgmt_ethhdr->mdio_data; 224 225 /* Get the rest of the 12 byte of data. 226 * The read/write function will extract the requested data. 227 */ 228 if (len > QCA_HDR_MGMT_DATA1_LEN) 229 memcpy(mgmt_eth_data->data + 1, skb->data, 230 QCA_HDR_MGMT_DATA2_LEN); 231 } 232 233 complete(&mgmt_eth_data->rw_done); 234} 235 236static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, 237 int priority, unsigned int len) 238{ 239 struct qca_mgmt_ethhdr *mgmt_ethhdr; 240 unsigned int real_len; 241 struct sk_buff *skb; 242 u32 *data2; 243 u16 hdr; 244 245 skb = dev_alloc_skb(QCA_HDR_MGMT_PKT_LEN); 246 if (!skb) 247 return NULL; 248 249 /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte 250 * Actually for some reason the steps are: 251 * 0: nothing 252 * 1-4: first 4 byte 253 * 5-6: first 12 byte 254 * 7-15: all 16 byte 255 */ 256 if (len == 16) 257 real_len = 15; 258 else 259 real_len = len; 260 261 skb_reset_mac_header(skb); 262 skb_set_network_header(skb, skb->len); 263 264 mgmt_ethhdr = skb_push(skb, QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN); 265 266 hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); 267 hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); 268 hdr |= QCA_HDR_XMIT_FROM_CPU; 269 hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); 270 hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); 271 272 mgmt_ethhdr->command = FIELD_PREP(QCA_HDR_MGMT_ADDR, reg); 273 mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_LENGTH, real_len); 274 mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CMD, cmd); 275 mgmt_ethhdr->command |= FIELD_PREP(QCA_HDR_MGMT_CHECK_CODE, 276 QCA_HDR_MGMT_CHECK_CODE_VAL); 277 278 if (cmd == MDIO_WRITE) 279 mgmt_ethhdr->mdio_data = *val; 280 281 mgmt_ethhdr->hdr = htons(hdr); 282 283 data2 = skb_put_zero(skb, QCA_HDR_MGMT_DATA2_LEN + QCA_HDR_MGMT_PADDING_LEN); 284 if (cmd == MDIO_WRITE && len > QCA_HDR_MGMT_DATA1_LEN) 285 memcpy(data2, val + 1, len - QCA_HDR_MGMT_DATA1_LEN); 286 287 return skb; 288} 289 290static void qca8k_mdio_header_fill_seq_num(struct sk_buff *skb, u32 seq_num) 291{ 292 struct qca_mgmt_ethhdr *mgmt_ethhdr; 293 294 mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb->data; 295 mgmt_ethhdr->seq = FIELD_PREP(QCA_HDR_MGMT_SEQ_NUM, seq_num); 296} 297 298static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) 299{ 300 struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; 301 struct sk_buff *skb; 302 bool ack; 303 int ret; 304 305 skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, 306 QCA8K_ETHERNET_MDIO_PRIORITY, len); 307 if (!skb) 308 return -ENOMEM; 309 310 mutex_lock(&mgmt_eth_data->mutex); 311 312 /* Check mgmt_master if is operational */ 313 if (!priv->mgmt_master) { 314 kfree_skb(skb); 315 mutex_unlock(&mgmt_eth_data->mutex); 316 return -EINVAL; 317 } 318 319 skb->dev = priv->mgmt_master; 320 321 reinit_completion(&mgmt_eth_data->rw_done); 322 323 /* Increment seq_num and set it in the mdio pkt */ 324 mgmt_eth_data->seq++; 325 qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); 326 mgmt_eth_data->ack = false; 327 328 dev_queue_xmit(skb); 329 330 ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, 331 msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); 332 333 *val = mgmt_eth_data->data[0]; 334 if (len > QCA_HDR_MGMT_DATA1_LEN) 335 memcpy(val + 1, mgmt_eth_data->data + 1, len - QCA_HDR_MGMT_DATA1_LEN); 336 337 ack = mgmt_eth_data->ack; 338 339 mutex_unlock(&mgmt_eth_data->mutex); 340 341 if (ret <= 0) 342 return -ETIMEDOUT; 343 344 if (!ack) 345 return -EINVAL; 346 347 return 0; 348} 349 350static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 *val, int len) 351{ 352 struct qca8k_mgmt_eth_data *mgmt_eth_data = &priv->mgmt_eth_data; 353 struct sk_buff *skb; 354 bool ack; 355 int ret; 356 357 skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, val, 358 QCA8K_ETHERNET_MDIO_PRIORITY, len); 359 if (!skb) 360 return -ENOMEM; 361 362 mutex_lock(&mgmt_eth_data->mutex); 363 364 /* Check mgmt_master if is operational */ 365 if (!priv->mgmt_master) { 366 kfree_skb(skb); 367 mutex_unlock(&mgmt_eth_data->mutex); 368 return -EINVAL; 369 } 370 371 skb->dev = priv->mgmt_master; 372 373 reinit_completion(&mgmt_eth_data->rw_done); 374 375 /* Increment seq_num and set it in the mdio pkt */ 376 mgmt_eth_data->seq++; 377 qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); 378 mgmt_eth_data->ack = false; 379 380 dev_queue_xmit(skb); 381 382 ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, 383 msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); 384 385 ack = mgmt_eth_data->ack; 386 387 mutex_unlock(&mgmt_eth_data->mutex); 388 389 if (ret <= 0) 390 return -ETIMEDOUT; 391 392 if (!ack) 393 return -EINVAL; 394 395 return 0; 396} 397 398static int 399qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) 400{ 401 u32 val = 0; 402 int ret; 403 404 ret = qca8k_read_eth(priv, reg, &val, sizeof(val)); 405 if (ret) 406 return ret; 407 408 val &= ~mask; 409 val |= write_val; 410 411 return qca8k_write_eth(priv, reg, &val, sizeof(val)); 412} 413 414static int 415qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len) 416{ 417 int i, count = len / sizeof(u32), ret; 418 419 if (priv->mgmt_master && !qca8k_read_eth(priv, reg, val, len)) 420 return 0; 421 422 for (i = 0; i < count; i++) { 423 ret = regmap_read(priv->regmap, reg + (i * 4), val + i); 424 if (ret < 0) 425 return ret; 426 } 427 428 return 0; 429} 430 431static int 432qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len) 433{ 434 int i, count = len / sizeof(u32), ret; 435 u32 tmp; 436 437 if (priv->mgmt_master && !qca8k_write_eth(priv, reg, val, len)) 438 return 0; 439 440 for (i = 0; i < count; i++) { 441 tmp = val[i]; 442 443 ret = regmap_write(priv->regmap, reg + (i * 4), tmp); 444 if (ret < 0) 445 return ret; 446 } 447 448 return 0; 449} 450 451static int 452qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) 453{ 454 struct qca8k_priv *priv = (struct qca8k_priv *)ctx; 455 struct mii_bus *bus = priv->bus; 456 u16 r1, r2, page; 457 int ret; 458 459 if (!qca8k_read_eth(priv, reg, val, sizeof(*val))) 460 return 0; 461 462 qca8k_split_addr(reg, &r1, &r2, &page); 463 464 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 465 466 ret = qca8k_set_page(priv, page); 467 if (ret < 0) 468 goto exit; 469 470 ret = qca8k_mii_read32(bus, 0x10 | r2, r1, val); 471 472exit: 473 mutex_unlock(&bus->mdio_lock); 474 return ret; 475} 476 477static int 478qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) 479{ 480 struct qca8k_priv *priv = (struct qca8k_priv *)ctx; 481 struct mii_bus *bus = priv->bus; 482 u16 r1, r2, page; 483 int ret; 484 485 if (!qca8k_write_eth(priv, reg, &val, sizeof(val))) 486 return 0; 487 488 qca8k_split_addr(reg, &r1, &r2, &page); 489 490 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 491 492 ret = qca8k_set_page(priv, page); 493 if (ret < 0) 494 goto exit; 495 496 qca8k_mii_write32(priv, 0x10 | r2, r1, val); 497 498exit: 499 mutex_unlock(&bus->mdio_lock); 500 return ret; 501} 502 503static int 504qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) 505{ 506 struct qca8k_priv *priv = (struct qca8k_priv *)ctx; 507 struct mii_bus *bus = priv->bus; 508 u16 r1, r2, page; 509 u32 val; 510 int ret; 511 512 if (!qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) 513 return 0; 514 515 qca8k_split_addr(reg, &r1, &r2, &page); 516 517 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 518 519 ret = qca8k_set_page(priv, page); 520 if (ret < 0) 521 goto exit; 522 523 ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); 524 if (ret < 0) 525 goto exit; 526 527 val &= ~mask; 528 val |= write_val; 529 qca8k_mii_write32(priv, 0x10 | r2, r1, val); 530 531exit: 532 mutex_unlock(&bus->mdio_lock); 533 534 return ret; 535} 536 537static const struct regmap_range qca8k_readable_ranges[] = { 538 regmap_reg_range(0x0000, 0x00e4), /* Global control */ 539 regmap_reg_range(0x0100, 0x0168), /* EEE control */ 540 regmap_reg_range(0x0200, 0x0270), /* Parser control */ 541 regmap_reg_range(0x0400, 0x0454), /* ACL */ 542 regmap_reg_range(0x0600, 0x0718), /* Lookup */ 543 regmap_reg_range(0x0800, 0x0b70), /* QM */ 544 regmap_reg_range(0x0c00, 0x0c80), /* PKT */ 545 regmap_reg_range(0x0e00, 0x0e98), /* L3 */ 546 regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */ 547 regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */ 548 regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */ 549 regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */ 550 regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */ 551 regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */ 552 regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */ 553 554}; 555 556static const struct regmap_access_table qca8k_readable_table = { 557 .yes_ranges = qca8k_readable_ranges, 558 .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges), 559}; 560 561static struct regmap_config qca8k_regmap_config = { 562 .reg_bits = 16, 563 .val_bits = 32, 564 .reg_stride = 4, 565 .max_register = 0x16ac, /* end MIB - Port6 range */ 566 .reg_read = qca8k_regmap_read, 567 .reg_write = qca8k_regmap_write, 568 .reg_update_bits = qca8k_regmap_update_bits, 569 .rd_table = &qca8k_readable_table, 570 .disable_locking = true, /* Locking is handled by qca8k read/write */ 571 .cache_type = REGCACHE_NONE, /* Explicitly disable CACHE */ 572}; 573 574static int 575qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask) 576{ 577 u32 val; 578 579 return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0, 580 QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC); 581} 582 583static int 584qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb) 585{ 586 u32 reg[3]; 587 int ret; 588 589 /* load the ARL table into an array */ 590 ret = qca8k_bulk_read(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); 591 if (ret) 592 return ret; 593 594 /* vid - 83:72 */ 595 fdb->vid = FIELD_GET(QCA8K_ATU_VID_MASK, reg[2]); 596 /* aging - 67:64 */ 597 fdb->aging = FIELD_GET(QCA8K_ATU_STATUS_MASK, reg[2]); 598 /* portmask - 54:48 */ 599 fdb->port_mask = FIELD_GET(QCA8K_ATU_PORT_MASK, reg[1]); 600 /* mac - 47:0 */ 601 fdb->mac[0] = FIELD_GET(QCA8K_ATU_ADDR0_MASK, reg[1]); 602 fdb->mac[1] = FIELD_GET(QCA8K_ATU_ADDR1_MASK, reg[1]); 603 fdb->mac[2] = FIELD_GET(QCA8K_ATU_ADDR2_MASK, reg[0]); 604 fdb->mac[3] = FIELD_GET(QCA8K_ATU_ADDR3_MASK, reg[0]); 605 fdb->mac[4] = FIELD_GET(QCA8K_ATU_ADDR4_MASK, reg[0]); 606 fdb->mac[5] = FIELD_GET(QCA8K_ATU_ADDR5_MASK, reg[0]); 607 608 return 0; 609} 610 611static void 612qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac, 613 u8 aging) 614{ 615 u32 reg[3] = { 0 }; 616 617 /* vid - 83:72 */ 618 reg[2] = FIELD_PREP(QCA8K_ATU_VID_MASK, vid); 619 /* aging - 67:64 */ 620 reg[2] |= FIELD_PREP(QCA8K_ATU_STATUS_MASK, aging); 621 /* portmask - 54:48 */ 622 reg[1] = FIELD_PREP(QCA8K_ATU_PORT_MASK, port_mask); 623 /* mac - 47:0 */ 624 reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR0_MASK, mac[0]); 625 reg[1] |= FIELD_PREP(QCA8K_ATU_ADDR1_MASK, mac[1]); 626 reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR2_MASK, mac[2]); 627 reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR3_MASK, mac[3]); 628 reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR4_MASK, mac[4]); 629 reg[0] |= FIELD_PREP(QCA8K_ATU_ADDR5_MASK, mac[5]); 630 631 /* load the array into the ARL table */ 632 qca8k_bulk_write(priv, QCA8K_REG_ATU_DATA0, reg, sizeof(reg)); 633} 634 635static int 636qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port) 637{ 638 u32 reg; 639 int ret; 640 641 /* Set the command and FDB index */ 642 reg = QCA8K_ATU_FUNC_BUSY; 643 reg |= cmd; 644 if (port >= 0) { 645 reg |= QCA8K_ATU_FUNC_PORT_EN; 646 reg |= FIELD_PREP(QCA8K_ATU_FUNC_PORT_MASK, port); 647 } 648 649 /* Write the function register triggering the table access */ 650 ret = qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg); 651 if (ret) 652 return ret; 653 654 /* wait for completion */ 655 ret = qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY); 656 if (ret) 657 return ret; 658 659 /* Check for table full violation when adding an entry */ 660 if (cmd == QCA8K_FDB_LOAD) { 661 ret = qca8k_read(priv, QCA8K_REG_ATU_FUNC, ®); 662 if (ret < 0) 663 return ret; 664 if (reg & QCA8K_ATU_FUNC_FULL) 665 return -1; 666 } 667 668 return 0; 669} 670 671static int 672qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port) 673{ 674 int ret; 675 676 qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging); 677 ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port); 678 if (ret < 0) 679 return ret; 680 681 return qca8k_fdb_read(priv, fdb); 682} 683 684static int 685qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, 686 u16 vid, u8 aging) 687{ 688 int ret; 689 690 mutex_lock(&priv->reg_mutex); 691 qca8k_fdb_write(priv, vid, port_mask, mac, aging); 692 ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); 693 mutex_unlock(&priv->reg_mutex); 694 695 return ret; 696} 697 698static int 699qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid) 700{ 701 int ret; 702 703 mutex_lock(&priv->reg_mutex); 704 qca8k_fdb_write(priv, vid, port_mask, mac, 0); 705 ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); 706 mutex_unlock(&priv->reg_mutex); 707 708 return ret; 709} 710 711static void 712qca8k_fdb_flush(struct qca8k_priv *priv) 713{ 714 mutex_lock(&priv->reg_mutex); 715 qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1); 716 mutex_unlock(&priv->reg_mutex); 717} 718 719static int 720qca8k_fdb_search_and_insert(struct qca8k_priv *priv, u8 port_mask, 721 const u8 *mac, u16 vid) 722{ 723 struct qca8k_fdb fdb = { 0 }; 724 int ret; 725 726 mutex_lock(&priv->reg_mutex); 727 728 qca8k_fdb_write(priv, vid, 0, mac, 0); 729 ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); 730 if (ret < 0) 731 goto exit; 732 733 ret = qca8k_fdb_read(priv, &fdb); 734 if (ret < 0) 735 goto exit; 736 737 /* Rule exist. Delete first */ 738 if (!fdb.aging) { 739 ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); 740 if (ret) 741 goto exit; 742 } 743 744 /* Add port to fdb portmask */ 745 fdb.port_mask |= port_mask; 746 747 qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); 748 ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); 749 750exit: 751 mutex_unlock(&priv->reg_mutex); 752 return ret; 753} 754 755static int 756qca8k_fdb_search_and_del(struct qca8k_priv *priv, u8 port_mask, 757 const u8 *mac, u16 vid) 758{ 759 struct qca8k_fdb fdb = { 0 }; 760 int ret; 761 762 mutex_lock(&priv->reg_mutex); 763 764 qca8k_fdb_write(priv, vid, 0, mac, 0); 765 ret = qca8k_fdb_access(priv, QCA8K_FDB_SEARCH, -1); 766 if (ret < 0) 767 goto exit; 768 769 /* Rule doesn't exist. Why delete? */ 770 if (!fdb.aging) { 771 ret = -EINVAL; 772 goto exit; 773 } 774 775 ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1); 776 if (ret) 777 goto exit; 778 779 /* Only port in the rule is this port. Don't re insert */ 780 if (fdb.port_mask == port_mask) 781 goto exit; 782 783 /* Remove port from port mask */ 784 fdb.port_mask &= ~port_mask; 785 786 qca8k_fdb_write(priv, vid, fdb.port_mask, mac, fdb.aging); 787 ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1); 788 789exit: 790 mutex_unlock(&priv->reg_mutex); 791 return ret; 792} 793 794static int 795qca8k_vlan_access(struct qca8k_priv *priv, enum qca8k_vlan_cmd cmd, u16 vid) 796{ 797 u32 reg; 798 int ret; 799 800 /* Set the command and VLAN index */ 801 reg = QCA8K_VTU_FUNC1_BUSY; 802 reg |= cmd; 803 reg |= FIELD_PREP(QCA8K_VTU_FUNC1_VID_MASK, vid); 804 805 /* Write the function register triggering the table access */ 806 ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC1, reg); 807 if (ret) 808 return ret; 809 810 /* wait for completion */ 811 ret = qca8k_busy_wait(priv, QCA8K_REG_VTU_FUNC1, QCA8K_VTU_FUNC1_BUSY); 812 if (ret) 813 return ret; 814 815 /* Check for table full violation when adding an entry */ 816 if (cmd == QCA8K_VLAN_LOAD) { 817 ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC1, ®); 818 if (ret < 0) 819 return ret; 820 if (reg & QCA8K_VTU_FUNC1_FULL) 821 return -ENOMEM; 822 } 823 824 return 0; 825} 826 827static int 828qca8k_vlan_add(struct qca8k_priv *priv, u8 port, u16 vid, bool untagged) 829{ 830 u32 reg; 831 int ret; 832 833 /* 834 We do the right thing with VLAN 0 and treat it as untagged while 835 preserving the tag on egress. 836 */ 837 if (vid == 0) 838 return 0; 839 840 mutex_lock(&priv->reg_mutex); 841 ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); 842 if (ret < 0) 843 goto out; 844 845 ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); 846 if (ret < 0) 847 goto out; 848 reg |= QCA8K_VTU_FUNC0_VALID | QCA8K_VTU_FUNC0_IVL_EN; 849 reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); 850 if (untagged) 851 reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_UNTAG(port); 852 else 853 reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_TAG(port); 854 855 ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); 856 if (ret) 857 goto out; 858 ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); 859 860out: 861 mutex_unlock(&priv->reg_mutex); 862 863 return ret; 864} 865 866static int 867qca8k_vlan_del(struct qca8k_priv *priv, u8 port, u16 vid) 868{ 869 u32 reg, mask; 870 int ret, i; 871 bool del; 872 873 mutex_lock(&priv->reg_mutex); 874 ret = qca8k_vlan_access(priv, QCA8K_VLAN_READ, vid); 875 if (ret < 0) 876 goto out; 877 878 ret = qca8k_read(priv, QCA8K_REG_VTU_FUNC0, ®); 879 if (ret < 0) 880 goto out; 881 reg &= ~QCA8K_VTU_FUNC0_EG_MODE_PORT_MASK(port); 882 reg |= QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(port); 883 884 /* Check if we're the last member to be removed */ 885 del = true; 886 for (i = 0; i < QCA8K_NUM_PORTS; i++) { 887 mask = QCA8K_VTU_FUNC0_EG_MODE_PORT_NOT(i); 888 889 if ((reg & mask) != mask) { 890 del = false; 891 break; 892 } 893 } 894 895 if (del) { 896 ret = qca8k_vlan_access(priv, QCA8K_VLAN_PURGE, vid); 897 } else { 898 ret = qca8k_write(priv, QCA8K_REG_VTU_FUNC0, reg); 899 if (ret) 900 goto out; 901 ret = qca8k_vlan_access(priv, QCA8K_VLAN_LOAD, vid); 902 } 903 904out: 905 mutex_unlock(&priv->reg_mutex); 906 907 return ret; 908} 909 910static int 911qca8k_mib_init(struct qca8k_priv *priv) 912{ 913 int ret; 914 915 mutex_lock(&priv->reg_mutex); 916 ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, 917 QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, 918 FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | 919 QCA8K_MIB_BUSY); 920 if (ret) 921 goto exit; 922 923 ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY); 924 if (ret) 925 goto exit; 926 927 ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP); 928 if (ret) 929 goto exit; 930 931 ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB); 932 933exit: 934 mutex_unlock(&priv->reg_mutex); 935 return ret; 936} 937 938static void 939qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) 940{ 941 u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; 942 943 /* Port 0 and 6 have no internal PHY */ 944 if (port > 0 && port < 6) 945 mask |= QCA8K_PORT_STATUS_LINK_AUTO; 946 947 if (enable) 948 regmap_set_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); 949 else 950 regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); 951} 952 953static int 954qca8k_phy_eth_busy_wait(struct qca8k_mgmt_eth_data *mgmt_eth_data, 955 struct sk_buff *read_skb, u32 *val) 956{ 957 struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); 958 bool ack; 959 int ret; 960 961 reinit_completion(&mgmt_eth_data->rw_done); 962 963 /* Increment seq_num and set it in the copy pkt */ 964 mgmt_eth_data->seq++; 965 qca8k_mdio_header_fill_seq_num(skb, mgmt_eth_data->seq); 966 mgmt_eth_data->ack = false; 967 968 dev_queue_xmit(skb); 969 970 ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, 971 QCA8K_ETHERNET_TIMEOUT); 972 973 ack = mgmt_eth_data->ack; 974 975 if (ret <= 0) 976 return -ETIMEDOUT; 977 978 if (!ack) 979 return -EINVAL; 980 981 *val = mgmt_eth_data->data[0]; 982 983 return 0; 984} 985 986static int 987qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy, 988 int regnum, u16 data) 989{ 990 struct sk_buff *write_skb, *clear_skb, *read_skb; 991 struct qca8k_mgmt_eth_data *mgmt_eth_data; 992 u32 write_val, clear_val = 0, val; 993 struct net_device *mgmt_master; 994 int ret, ret1; 995 bool ack; 996 997 if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) 998 return -EINVAL; 999 1000 mgmt_eth_data = &priv->mgmt_eth_data; 1001 1002 write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | 1003 QCA8K_MDIO_MASTER_PHY_ADDR(phy) | 1004 QCA8K_MDIO_MASTER_REG_ADDR(regnum); 1005 1006 if (read) { 1007 write_val |= QCA8K_MDIO_MASTER_READ; 1008 } else { 1009 write_val |= QCA8K_MDIO_MASTER_WRITE; 1010 write_val |= QCA8K_MDIO_MASTER_DATA(data); 1011 } 1012 1013 /* Prealloc all the needed skb before the lock */ 1014 write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &write_val, 1015 QCA8K_ETHERNET_PHY_PRIORITY, sizeof(write_val)); 1016 if (!write_skb) 1017 return -ENOMEM; 1018 1019 clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, &clear_val, 1020 QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); 1021 if (!clear_skb) { 1022 ret = -ENOMEM; 1023 goto err_clear_skb; 1024 } 1025 1026 read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, &clear_val, 1027 QCA8K_ETHERNET_PHY_PRIORITY, sizeof(clear_val)); 1028 if (!read_skb) { 1029 ret = -ENOMEM; 1030 goto err_read_skb; 1031 } 1032 1033 /* Actually start the request: 1034 * 1. Send mdio master packet 1035 * 2. Busy Wait for mdio master command 1036 * 3. Get the data if we are reading 1037 * 4. Reset the mdio master (even with error) 1038 */ 1039 mutex_lock(&mgmt_eth_data->mutex); 1040 1041 /* Check if mgmt_master is operational */ 1042 mgmt_master = priv->mgmt_master; 1043 if (!mgmt_master) { 1044 mutex_unlock(&mgmt_eth_data->mutex); 1045 ret = -EINVAL; 1046 goto err_mgmt_master; 1047 } 1048 1049 read_skb->dev = mgmt_master; 1050 clear_skb->dev = mgmt_master; 1051 write_skb->dev = mgmt_master; 1052 1053 reinit_completion(&mgmt_eth_data->rw_done); 1054 1055 /* Increment seq_num and set it in the write pkt */ 1056 mgmt_eth_data->seq++; 1057 qca8k_mdio_header_fill_seq_num(write_skb, mgmt_eth_data->seq); 1058 mgmt_eth_data->ack = false; 1059 1060 dev_queue_xmit(write_skb); 1061 1062 ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, 1063 QCA8K_ETHERNET_TIMEOUT); 1064 1065 ack = mgmt_eth_data->ack; 1066 1067 if (ret <= 0) { 1068 ret = -ETIMEDOUT; 1069 kfree_skb(read_skb); 1070 goto exit; 1071 } 1072 1073 if (!ack) { 1074 ret = -EINVAL; 1075 kfree_skb(read_skb); 1076 goto exit; 1077 } 1078 1079 ret = read_poll_timeout(qca8k_phy_eth_busy_wait, ret1, 1080 !(val & QCA8K_MDIO_MASTER_BUSY), 0, 1081 QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, 1082 mgmt_eth_data, read_skb, &val); 1083 1084 if (ret < 0 && ret1 < 0) { 1085 ret = ret1; 1086 goto exit; 1087 } 1088 1089 if (read) { 1090 reinit_completion(&mgmt_eth_data->rw_done); 1091 1092 /* Increment seq_num and set it in the read pkt */ 1093 mgmt_eth_data->seq++; 1094 qca8k_mdio_header_fill_seq_num(read_skb, mgmt_eth_data->seq); 1095 mgmt_eth_data->ack = false; 1096 1097 dev_queue_xmit(read_skb); 1098 1099 ret = wait_for_completion_timeout(&mgmt_eth_data->rw_done, 1100 QCA8K_ETHERNET_TIMEOUT); 1101 1102 ack = mgmt_eth_data->ack; 1103 1104 if (ret <= 0) { 1105 ret = -ETIMEDOUT; 1106 goto exit; 1107 } 1108 1109 if (!ack) { 1110 ret = -EINVAL; 1111 goto exit; 1112 } 1113 1114 ret = mgmt_eth_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; 1115 } else { 1116 kfree_skb(read_skb); 1117 } 1118exit: 1119 reinit_completion(&mgmt_eth_data->rw_done); 1120 1121 /* Increment seq_num and set it in the clear pkt */ 1122 mgmt_eth_data->seq++; 1123 qca8k_mdio_header_fill_seq_num(clear_skb, mgmt_eth_data->seq); 1124 mgmt_eth_data->ack = false; 1125 1126 dev_queue_xmit(clear_skb); 1127 1128 wait_for_completion_timeout(&mgmt_eth_data->rw_done, 1129 QCA8K_ETHERNET_TIMEOUT); 1130 1131 mutex_unlock(&mgmt_eth_data->mutex); 1132 1133 return ret; 1134 1135 /* Error handling before lock */ 1136err_mgmt_master: 1137 kfree_skb(read_skb); 1138err_read_skb: 1139 kfree_skb(clear_skb); 1140err_clear_skb: 1141 kfree_skb(write_skb); 1142 1143 return ret; 1144} 1145 1146static u32 1147qca8k_port_to_phy(int port) 1148{ 1149 /* From Andrew Lunn: 1150 * Port 0 has no internal phy. 1151 * Port 1 has an internal PHY at MDIO address 0. 1152 * Port 2 has an internal PHY at MDIO address 1. 1153 * ... 1154 * Port 5 has an internal PHY at MDIO address 4. 1155 * Port 6 has no internal PHY. 1156 */ 1157 1158 return port - 1; 1159} 1160 1161static int 1162qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) 1163{ 1164 u16 r1, r2, page; 1165 u32 val; 1166 int ret, ret1; 1167 1168 qca8k_split_addr(reg, &r1, &r2, &page); 1169 1170 ret = read_poll_timeout(qca8k_mii_read32, ret1, !(val & mask), 0, 1171 QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, 1172 bus, 0x10 | r2, r1, &val); 1173 1174 /* Check if qca8k_read has failed for a different reason 1175 * before returnting -ETIMEDOUT 1176 */ 1177 if (ret < 0 && ret1 < 0) 1178 return ret1; 1179 1180 return ret; 1181} 1182 1183static int 1184qca8k_mdio_write(struct qca8k_priv *priv, int phy, int regnum, u16 data) 1185{ 1186 struct mii_bus *bus = priv->bus; 1187 u16 r1, r2, page; 1188 u32 val; 1189 int ret; 1190 1191 if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) 1192 return -EINVAL; 1193 1194 val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | 1195 QCA8K_MDIO_MASTER_WRITE | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | 1196 QCA8K_MDIO_MASTER_REG_ADDR(regnum) | 1197 QCA8K_MDIO_MASTER_DATA(data); 1198 1199 qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); 1200 1201 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 1202 1203 ret = qca8k_set_page(priv, page); 1204 if (ret) 1205 goto exit; 1206 1207 qca8k_mii_write32(priv, 0x10 | r2, r1, val); 1208 1209 ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, 1210 QCA8K_MDIO_MASTER_BUSY); 1211 1212exit: 1213 /* even if the busy_wait timeouts try to clear the MASTER_EN */ 1214 qca8k_mii_write32(priv, 0x10 | r2, r1, 0); 1215 1216 mutex_unlock(&bus->mdio_lock); 1217 1218 return ret; 1219} 1220 1221static int 1222qca8k_mdio_read(struct qca8k_priv *priv, int phy, int regnum) 1223{ 1224 struct mii_bus *bus = priv->bus; 1225 u16 r1, r2, page; 1226 u32 val; 1227 int ret; 1228 1229 if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) 1230 return -EINVAL; 1231 1232 val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | 1233 QCA8K_MDIO_MASTER_READ | QCA8K_MDIO_MASTER_PHY_ADDR(phy) | 1234 QCA8K_MDIO_MASTER_REG_ADDR(regnum); 1235 1236 qca8k_split_addr(QCA8K_MDIO_MASTER_CTRL, &r1, &r2, &page); 1237 1238 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 1239 1240 ret = qca8k_set_page(priv, page); 1241 if (ret) 1242 goto exit; 1243 1244 qca8k_mii_write32(priv, 0x10 | r2, r1, val); 1245 1246 ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, 1247 QCA8K_MDIO_MASTER_BUSY); 1248 if (ret) 1249 goto exit; 1250 1251 ret = qca8k_mii_read32(bus, 0x10 | r2, r1, &val); 1252 1253exit: 1254 /* even if the busy_wait timeouts try to clear the MASTER_EN */ 1255 qca8k_mii_write32(priv, 0x10 | r2, r1, 0); 1256 1257 mutex_unlock(&bus->mdio_lock); 1258 1259 if (ret >= 0) 1260 ret = val & QCA8K_MDIO_MASTER_DATA_MASK; 1261 1262 return ret; 1263} 1264 1265static int 1266qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) 1267{ 1268 struct qca8k_priv *priv = slave_bus->priv; 1269 int ret; 1270 1271 /* Use mdio Ethernet when available, fallback to legacy one on error */ 1272 ret = qca8k_phy_eth_command(priv, false, phy, regnum, data); 1273 if (!ret) 1274 return 0; 1275 1276 return qca8k_mdio_write(priv, phy, regnum, data); 1277} 1278 1279static int 1280qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) 1281{ 1282 struct qca8k_priv *priv = slave_bus->priv; 1283 int ret; 1284 1285 /* Use mdio Ethernet when available, fallback to legacy one on error */ 1286 ret = qca8k_phy_eth_command(priv, true, phy, regnum, 0); 1287 if (ret >= 0) 1288 return ret; 1289 1290 ret = qca8k_mdio_read(priv, phy, regnum); 1291 1292 if (ret < 0) 1293 return 0xffff; 1294 1295 return ret; 1296} 1297 1298static int 1299qca8k_legacy_mdio_write(struct mii_bus *slave_bus, int port, int regnum, u16 data) 1300{ 1301 port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; 1302 1303 return qca8k_internal_mdio_write(slave_bus, port, regnum, data); 1304} 1305 1306static int 1307qca8k_legacy_mdio_read(struct mii_bus *slave_bus, int port, int regnum) 1308{ 1309 port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; 1310 1311 return qca8k_internal_mdio_read(slave_bus, port, regnum); 1312} 1313 1314static int 1315qca8k_mdio_register(struct qca8k_priv *priv) 1316{ 1317 struct dsa_switch *ds = priv->ds; 1318 struct device_node *mdio; 1319 struct mii_bus *bus; 1320 1321 bus = devm_mdiobus_alloc(ds->dev); 1322 if (!bus) 1323 return -ENOMEM; 1324 1325 bus->priv = (void *)priv; 1326 snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d", 1327 ds->dst->index, ds->index); 1328 bus->parent = ds->dev; 1329 bus->phy_mask = ~ds->phys_mii_mask; 1330 ds->slave_mii_bus = bus; 1331 1332 /* Check if the devicetree declare the port:phy mapping */ 1333 mdio = of_get_child_by_name(priv->dev->of_node, "mdio"); 1334 if (of_device_is_available(mdio)) { 1335 bus->name = "qca8k slave mii"; 1336 bus->read = qca8k_internal_mdio_read; 1337 bus->write = qca8k_internal_mdio_write; 1338 return devm_of_mdiobus_register(priv->dev, bus, mdio); 1339 } 1340 1341 /* If a mapping can't be found the legacy mapping is used, 1342 * using the qca8k_port_to_phy function 1343 */ 1344 bus->name = "qca8k-legacy slave mii"; 1345 bus->read = qca8k_legacy_mdio_read; 1346 bus->write = qca8k_legacy_mdio_write; 1347 return devm_mdiobus_register(priv->dev, bus); 1348} 1349 1350static int 1351qca8k_setup_mdio_bus(struct qca8k_priv *priv) 1352{ 1353 u32 internal_mdio_mask = 0, external_mdio_mask = 0, reg; 1354 struct device_node *ports, *port; 1355 phy_interface_t mode; 1356 int err; 1357 1358 ports = of_get_child_by_name(priv->dev->of_node, "ports"); 1359 if (!ports) 1360 ports = of_get_child_by_name(priv->dev->of_node, "ethernet-ports"); 1361 1362 if (!ports) 1363 return -EINVAL; 1364 1365 for_each_available_child_of_node(ports, port) { 1366 err = of_property_read_u32(port, "reg", ®); 1367 if (err) { 1368 of_node_put(port); 1369 of_node_put(ports); 1370 return err; 1371 } 1372 1373 if (!dsa_is_user_port(priv->ds, reg)) 1374 continue; 1375 1376 of_get_phy_mode(port, &mode); 1377 1378 if (of_property_read_bool(port, "phy-handle") && 1379 mode != PHY_INTERFACE_MODE_INTERNAL) 1380 external_mdio_mask |= BIT(reg); 1381 else 1382 internal_mdio_mask |= BIT(reg); 1383 } 1384 1385 of_node_put(ports); 1386 if (!external_mdio_mask && !internal_mdio_mask) { 1387 dev_err(priv->dev, "no PHYs are defined.\n"); 1388 return -EINVAL; 1389 } 1390 1391 /* The QCA8K_MDIO_MASTER_EN Bit, which grants access to PHYs through 1392 * the MDIO_MASTER register also _disconnects_ the external MDC 1393 * passthrough to the internal PHYs. It's not possible to use both 1394 * configurations at the same time! 1395 * 1396 * Because this came up during the review process: 1397 * If the external mdio-bus driver is capable magically disabling 1398 * the QCA8K_MDIO_MASTER_EN and mutex/spin-locking out the qca8k's 1399 * accessors for the time being, it would be possible to pull this 1400 * off. 1401 */ 1402 if (!!external_mdio_mask && !!internal_mdio_mask) { 1403 dev_err(priv->dev, "either internal or external mdio bus configuration is supported.\n"); 1404 return -EINVAL; 1405 } 1406 1407 if (external_mdio_mask) { 1408 /* Make sure to disable the internal mdio bus in cases 1409 * a dt-overlay and driver reload changed the configuration 1410 */ 1411 1412 return regmap_clear_bits(priv->regmap, QCA8K_MDIO_MASTER_CTRL, 1413 QCA8K_MDIO_MASTER_EN); 1414 } 1415 1416 return qca8k_mdio_register(priv); 1417} 1418 1419static int 1420qca8k_setup_mac_pwr_sel(struct qca8k_priv *priv) 1421{ 1422 u32 mask = 0; 1423 int ret = 0; 1424 1425 /* SoC specific settings for ipq8064. 1426 * If more device require this consider adding 1427 * a dedicated binding. 1428 */ 1429 if (of_machine_is_compatible("qcom,ipq8064")) 1430 mask |= QCA8K_MAC_PWR_RGMII0_1_8V; 1431 1432 /* SoC specific settings for ipq8065 */ 1433 if (of_machine_is_compatible("qcom,ipq8065")) 1434 mask |= QCA8K_MAC_PWR_RGMII1_1_8V; 1435 1436 if (mask) { 1437 ret = qca8k_rmw(priv, QCA8K_REG_MAC_PWR_SEL, 1438 QCA8K_MAC_PWR_RGMII0_1_8V | 1439 QCA8K_MAC_PWR_RGMII1_1_8V, 1440 mask); 1441 } 1442 1443 return ret; 1444} 1445 1446static int qca8k_find_cpu_port(struct dsa_switch *ds) 1447{ 1448 struct qca8k_priv *priv = ds->priv; 1449 1450 /* Find the connected cpu port. Valid port are 0 or 6 */ 1451 if (dsa_is_cpu_port(ds, 0)) 1452 return 0; 1453 1454 dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6"); 1455 1456 if (dsa_is_cpu_port(ds, 6)) 1457 return 6; 1458 1459 return -EINVAL; 1460} 1461 1462static int 1463qca8k_setup_of_pws_reg(struct qca8k_priv *priv) 1464{ 1465 struct device_node *node = priv->dev->of_node; 1466 const struct qca8k_match_data *data; 1467 u32 val = 0; 1468 int ret; 1469 1470 /* QCA8327 require to set to the correct mode. 1471 * His bigger brother QCA8328 have the 172 pin layout. 1472 * Should be applied by default but we set this just to make sure. 1473 */ 1474 if (priv->switch_id == QCA8K_ID_QCA8327) { 1475 data = of_device_get_match_data(priv->dev); 1476 1477 /* Set the correct package of 148 pin for QCA8327 */ 1478 if (data->reduced_package) 1479 val |= QCA8327_PWS_PACKAGE148_EN; 1480 1481 ret = qca8k_rmw(priv, QCA8K_REG_PWS, QCA8327_PWS_PACKAGE148_EN, 1482 val); 1483 if (ret) 1484 return ret; 1485 } 1486 1487 if (of_property_read_bool(node, "qca,ignore-power-on-sel")) 1488 val |= QCA8K_PWS_POWER_ON_SEL; 1489 1490 if (of_property_read_bool(node, "qca,led-open-drain")) { 1491 if (!(val & QCA8K_PWS_POWER_ON_SEL)) { 1492 dev_err(priv->dev, "qca,led-open-drain require qca,ignore-power-on-sel to be set."); 1493 return -EINVAL; 1494 } 1495 1496 val |= QCA8K_PWS_LED_OPEN_EN_CSR; 1497 } 1498 1499 return qca8k_rmw(priv, QCA8K_REG_PWS, 1500 QCA8K_PWS_LED_OPEN_EN_CSR | QCA8K_PWS_POWER_ON_SEL, 1501 val); 1502} 1503 1504static int 1505qca8k_parse_port_config(struct qca8k_priv *priv) 1506{ 1507 int port, cpu_port_index = -1, ret; 1508 struct device_node *port_dn; 1509 phy_interface_t mode; 1510 struct dsa_port *dp; 1511 u32 delay; 1512 1513 /* We have 2 CPU port. Check them */ 1514 for (port = 0; port < QCA8K_NUM_PORTS; port++) { 1515 /* Skip every other port */ 1516 if (port != 0 && port != 6) 1517 continue; 1518 1519 dp = dsa_to_port(priv->ds, port); 1520 port_dn = dp->dn; 1521 cpu_port_index++; 1522 1523 if (!of_device_is_available(port_dn)) 1524 continue; 1525 1526 ret = of_get_phy_mode(port_dn, &mode); 1527 if (ret) 1528 continue; 1529 1530 switch (mode) { 1531 case PHY_INTERFACE_MODE_RGMII: 1532 case PHY_INTERFACE_MODE_RGMII_ID: 1533 case PHY_INTERFACE_MODE_RGMII_TXID: 1534 case PHY_INTERFACE_MODE_RGMII_RXID: 1535 case PHY_INTERFACE_MODE_SGMII: 1536 delay = 0; 1537 1538 if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) 1539 /* Switch regs accept value in ns, convert ps to ns */ 1540 delay = delay / 1000; 1541 else if (mode == PHY_INTERFACE_MODE_RGMII_ID || 1542 mode == PHY_INTERFACE_MODE_RGMII_TXID) 1543 delay = 1; 1544 1545 if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK, delay)) { 1546 dev_err(priv->dev, "rgmii tx delay is limited to a max value of 3ns, setting to the max value"); 1547 delay = 3; 1548 } 1549 1550 priv->ports_config.rgmii_tx_delay[cpu_port_index] = delay; 1551 1552 delay = 0; 1553 1554 if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) 1555 /* Switch regs accept value in ns, convert ps to ns */ 1556 delay = delay / 1000; 1557 else if (mode == PHY_INTERFACE_MODE_RGMII_ID || 1558 mode == PHY_INTERFACE_MODE_RGMII_RXID) 1559 delay = 2; 1560 1561 if (!FIELD_FIT(QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK, delay)) { 1562 dev_err(priv->dev, "rgmii rx delay is limited to a max value of 3ns, setting to the max value"); 1563 delay = 3; 1564 } 1565 1566 priv->ports_config.rgmii_rx_delay[cpu_port_index] = delay; 1567 1568 /* Skip sgmii parsing for rgmii* mode */ 1569 if (mode == PHY_INTERFACE_MODE_RGMII || 1570 mode == PHY_INTERFACE_MODE_RGMII_ID || 1571 mode == PHY_INTERFACE_MODE_RGMII_TXID || 1572 mode == PHY_INTERFACE_MODE_RGMII_RXID) 1573 break; 1574 1575 if (of_property_read_bool(port_dn, "qca,sgmii-txclk-falling-edge")) 1576 priv->ports_config.sgmii_tx_clk_falling_edge = true; 1577 1578 if (of_property_read_bool(port_dn, "qca,sgmii-rxclk-falling-edge")) 1579 priv->ports_config.sgmii_rx_clk_falling_edge = true; 1580 1581 if (of_property_read_bool(port_dn, "qca,sgmii-enable-pll")) { 1582 priv->ports_config.sgmii_enable_pll = true; 1583 1584 if (priv->switch_id == QCA8K_ID_QCA8327) { 1585 dev_err(priv->dev, "SGMII PLL should NOT be enabled for qca8327. Aborting enabling"); 1586 priv->ports_config.sgmii_enable_pll = false; 1587 } 1588 1589 if (priv->switch_revision < 2) 1590 dev_warn(priv->dev, "SGMII PLL should NOT be enabled for qca8337 with revision 2 or more."); 1591 } 1592 1593 break; 1594 default: 1595 continue; 1596 } 1597 } 1598 1599 return 0; 1600} 1601 1602static void 1603qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_index, 1604 u32 reg) 1605{ 1606 u32 delay, val = 0; 1607 int ret; 1608 1609 /* Delay can be declared in 3 different way. 1610 * Mode to rgmii and internal-delay standard binding defined 1611 * rgmii-id or rgmii-tx/rx phy mode set. 1612 * The parse logic set a delay different than 0 only when one 1613 * of the 3 different way is used. In all other case delay is 1614 * not enabled. With ID or TX/RXID delay is enabled and set 1615 * to the default and recommended value. 1616 */ 1617 if (priv->ports_config.rgmii_tx_delay[cpu_port_index]) { 1618 delay = priv->ports_config.rgmii_tx_delay[cpu_port_index]; 1619 1620 val |= QCA8K_PORT_PAD_RGMII_TX_DELAY(delay) | 1621 QCA8K_PORT_PAD_RGMII_TX_DELAY_EN; 1622 } 1623 1624 if (priv->ports_config.rgmii_rx_delay[cpu_port_index]) { 1625 delay = priv->ports_config.rgmii_rx_delay[cpu_port_index]; 1626 1627 val |= QCA8K_PORT_PAD_RGMII_RX_DELAY(delay) | 1628 QCA8K_PORT_PAD_RGMII_RX_DELAY_EN; 1629 } 1630 1631 /* Set RGMII delay based on the selected values */ 1632 ret = qca8k_rmw(priv, reg, 1633 QCA8K_PORT_PAD_RGMII_TX_DELAY_MASK | 1634 QCA8K_PORT_PAD_RGMII_RX_DELAY_MASK | 1635 QCA8K_PORT_PAD_RGMII_TX_DELAY_EN | 1636 QCA8K_PORT_PAD_RGMII_RX_DELAY_EN, 1637 val); 1638 if (ret) 1639 dev_err(priv->dev, "Failed to set internal delay for CPU port%d", 1640 cpu_port_index == QCA8K_CPU_PORT0 ? 0 : 6); 1641} 1642 1643static struct phylink_pcs * 1644qca8k_phylink_mac_select_pcs(struct dsa_switch *ds, int port, 1645 phy_interface_t interface) 1646{ 1647 struct qca8k_priv *priv = ds->priv; 1648 struct phylink_pcs *pcs = NULL; 1649 1650 switch (interface) { 1651 case PHY_INTERFACE_MODE_SGMII: 1652 case PHY_INTERFACE_MODE_1000BASEX: 1653 switch (port) { 1654 case 0: 1655 pcs = &priv->pcs_port_0.pcs; 1656 break; 1657 1658 case 6: 1659 pcs = &priv->pcs_port_6.pcs; 1660 break; 1661 } 1662 break; 1663 1664 default: 1665 break; 1666 } 1667 1668 return pcs; 1669} 1670 1671static void 1672qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, 1673 const struct phylink_link_state *state) 1674{ 1675 struct qca8k_priv *priv = ds->priv; 1676 int cpu_port_index; 1677 u32 reg; 1678 1679 switch (port) { 1680 case 0: /* 1st CPU port */ 1681 if (state->interface != PHY_INTERFACE_MODE_RGMII && 1682 state->interface != PHY_INTERFACE_MODE_RGMII_ID && 1683 state->interface != PHY_INTERFACE_MODE_RGMII_TXID && 1684 state->interface != PHY_INTERFACE_MODE_RGMII_RXID && 1685 state->interface != PHY_INTERFACE_MODE_SGMII) 1686 return; 1687 1688 reg = QCA8K_REG_PORT0_PAD_CTRL; 1689 cpu_port_index = QCA8K_CPU_PORT0; 1690 break; 1691 case 1: 1692 case 2: 1693 case 3: 1694 case 4: 1695 case 5: 1696 /* Internal PHY, nothing to do */ 1697 return; 1698 case 6: /* 2nd CPU port / external PHY */ 1699 if (state->interface != PHY_INTERFACE_MODE_RGMII && 1700 state->interface != PHY_INTERFACE_MODE_RGMII_ID && 1701 state->interface != PHY_INTERFACE_MODE_RGMII_TXID && 1702 state->interface != PHY_INTERFACE_MODE_RGMII_RXID && 1703 state->interface != PHY_INTERFACE_MODE_SGMII && 1704 state->interface != PHY_INTERFACE_MODE_1000BASEX) 1705 return; 1706 1707 reg = QCA8K_REG_PORT6_PAD_CTRL; 1708 cpu_port_index = QCA8K_CPU_PORT6; 1709 break; 1710 default: 1711 dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); 1712 return; 1713 } 1714 1715 if (port != 6 && phylink_autoneg_inband(mode)) { 1716 dev_err(ds->dev, "%s: in-band negotiation unsupported\n", 1717 __func__); 1718 return; 1719 } 1720 1721 switch (state->interface) { 1722 case PHY_INTERFACE_MODE_RGMII: 1723 case PHY_INTERFACE_MODE_RGMII_ID: 1724 case PHY_INTERFACE_MODE_RGMII_TXID: 1725 case PHY_INTERFACE_MODE_RGMII_RXID: 1726 qca8k_write(priv, reg, QCA8K_PORT_PAD_RGMII_EN); 1727 1728 /* Configure rgmii delay */ 1729 qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); 1730 1731 /* QCA8337 requires to set rgmii rx delay for all ports. 1732 * This is enabled through PORT5_PAD_CTRL for all ports, 1733 * rather than individual port registers. 1734 */ 1735 if (priv->switch_id == QCA8K_ID_QCA8337) 1736 qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, 1737 QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); 1738 break; 1739 case PHY_INTERFACE_MODE_SGMII: 1740 case PHY_INTERFACE_MODE_1000BASEX: 1741 /* Enable SGMII on the port */ 1742 qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); 1743 break; 1744 default: 1745 dev_err(ds->dev, "xMII mode %s not supported for port %d\n", 1746 phy_modes(state->interface), port); 1747 return; 1748 } 1749} 1750 1751static void qca8k_phylink_get_caps(struct dsa_switch *ds, int port, 1752 struct phylink_config *config) 1753{ 1754 switch (port) { 1755 case 0: /* 1st CPU port */ 1756 phy_interface_set_rgmii(config->supported_interfaces); 1757 __set_bit(PHY_INTERFACE_MODE_SGMII, 1758 config->supported_interfaces); 1759 break; 1760 1761 case 1: 1762 case 2: 1763 case 3: 1764 case 4: 1765 case 5: 1766 /* Internal PHY */ 1767 __set_bit(PHY_INTERFACE_MODE_GMII, 1768 config->supported_interfaces); 1769 __set_bit(PHY_INTERFACE_MODE_INTERNAL, 1770 config->supported_interfaces); 1771 break; 1772 1773 case 6: /* 2nd CPU port / external PHY */ 1774 phy_interface_set_rgmii(config->supported_interfaces); 1775 __set_bit(PHY_INTERFACE_MODE_SGMII, 1776 config->supported_interfaces); 1777 __set_bit(PHY_INTERFACE_MODE_1000BASEX, 1778 config->supported_interfaces); 1779 break; 1780 } 1781 1782 config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | 1783 MAC_10 | MAC_100 | MAC_1000FD; 1784 1785 config->legacy_pre_march2020 = false; 1786} 1787 1788static void 1789qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode, 1790 phy_interface_t interface) 1791{ 1792 struct qca8k_priv *priv = ds->priv; 1793 1794 qca8k_port_set_status(priv, port, 0); 1795} 1796 1797static void 1798qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, 1799 phy_interface_t interface, struct phy_device *phydev, 1800 int speed, int duplex, bool tx_pause, bool rx_pause) 1801{ 1802 struct qca8k_priv *priv = ds->priv; 1803 u32 reg; 1804 1805 if (phylink_autoneg_inband(mode)) { 1806 reg = QCA8K_PORT_STATUS_LINK_AUTO; 1807 } else { 1808 switch (speed) { 1809 case SPEED_10: 1810 reg = QCA8K_PORT_STATUS_SPEED_10; 1811 break; 1812 case SPEED_100: 1813 reg = QCA8K_PORT_STATUS_SPEED_100; 1814 break; 1815 case SPEED_1000: 1816 reg = QCA8K_PORT_STATUS_SPEED_1000; 1817 break; 1818 default: 1819 reg = QCA8K_PORT_STATUS_LINK_AUTO; 1820 break; 1821 } 1822 1823 if (duplex == DUPLEX_FULL) 1824 reg |= QCA8K_PORT_STATUS_DUPLEX; 1825 1826 if (rx_pause || dsa_is_cpu_port(ds, port)) 1827 reg |= QCA8K_PORT_STATUS_RXFLOW; 1828 1829 if (tx_pause || dsa_is_cpu_port(ds, port)) 1830 reg |= QCA8K_PORT_STATUS_TXFLOW; 1831 } 1832 1833 reg |= QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; 1834 1835 qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); 1836} 1837 1838static struct qca8k_pcs *pcs_to_qca8k_pcs(struct phylink_pcs *pcs) 1839{ 1840 return container_of(pcs, struct qca8k_pcs, pcs); 1841} 1842 1843static void qca8k_pcs_get_state(struct phylink_pcs *pcs, 1844 struct phylink_link_state *state) 1845{ 1846 struct qca8k_priv *priv = pcs_to_qca8k_pcs(pcs)->priv; 1847 int port = pcs_to_qca8k_pcs(pcs)->port; 1848 u32 reg; 1849 int ret; 1850 1851 ret = qca8k_read(priv, QCA8K_REG_PORT_STATUS(port), ®); 1852 if (ret < 0) { 1853 state->link = false; 1854 return; 1855 } 1856 1857 state->link = !!(reg & QCA8K_PORT_STATUS_LINK_UP); 1858 state->an_complete = state->link; 1859 state->an_enabled = !!(reg & QCA8K_PORT_STATUS_LINK_AUTO); 1860 state->duplex = (reg & QCA8K_PORT_STATUS_DUPLEX) ? DUPLEX_FULL : 1861 DUPLEX_HALF; 1862 1863 switch (reg & QCA8K_PORT_STATUS_SPEED) { 1864 case QCA8K_PORT_STATUS_SPEED_10: 1865 state->speed = SPEED_10; 1866 break; 1867 case QCA8K_PORT_STATUS_SPEED_100: 1868 state->speed = SPEED_100; 1869 break; 1870 case QCA8K_PORT_STATUS_SPEED_1000: 1871 state->speed = SPEED_1000; 1872 break; 1873 default: 1874 state->speed = SPEED_UNKNOWN; 1875 break; 1876 } 1877 1878 if (reg & QCA8K_PORT_STATUS_RXFLOW) 1879 state->pause |= MLO_PAUSE_RX; 1880 if (reg & QCA8K_PORT_STATUS_TXFLOW) 1881 state->pause |= MLO_PAUSE_TX; 1882} 1883 1884static int qca8k_pcs_config(struct phylink_pcs *pcs, unsigned int mode, 1885 phy_interface_t interface, 1886 const unsigned long *advertising, 1887 bool permit_pause_to_mac) 1888{ 1889 struct qca8k_priv *priv = pcs_to_qca8k_pcs(pcs)->priv; 1890 int cpu_port_index, ret, port; 1891 u32 reg, val; 1892 1893 port = pcs_to_qca8k_pcs(pcs)->port; 1894 switch (port) { 1895 case 0: 1896 reg = QCA8K_REG_PORT0_PAD_CTRL; 1897 cpu_port_index = QCA8K_CPU_PORT0; 1898 break; 1899 1900 case 6: 1901 reg = QCA8K_REG_PORT6_PAD_CTRL; 1902 cpu_port_index = QCA8K_CPU_PORT6; 1903 break; 1904 1905 default: 1906 WARN_ON(1); 1907 return -EINVAL; 1908 } 1909 1910 /* Enable/disable SerDes auto-negotiation as necessary */ 1911 ret = qca8k_read(priv, QCA8K_REG_PWS, &val); 1912 if (ret) 1913 return ret; 1914 if (phylink_autoneg_inband(mode)) 1915 val &= ~QCA8K_PWS_SERDES_AEN_DIS; 1916 else 1917 val |= QCA8K_PWS_SERDES_AEN_DIS; 1918 qca8k_write(priv, QCA8K_REG_PWS, val); 1919 1920 /* Configure the SGMII parameters */ 1921 ret = qca8k_read(priv, QCA8K_REG_SGMII_CTRL, &val); 1922 if (ret) 1923 return ret; 1924 1925 val |= QCA8K_SGMII_EN_SD; 1926 1927 if (priv->ports_config.sgmii_enable_pll) 1928 val |= QCA8K_SGMII_EN_PLL | QCA8K_SGMII_EN_RX | 1929 QCA8K_SGMII_EN_TX; 1930 1931 if (dsa_is_cpu_port(priv->ds, port)) { 1932 /* CPU port, we're talking to the CPU MAC, be a PHY */ 1933 val &= ~QCA8K_SGMII_MODE_CTRL_MASK; 1934 val |= QCA8K_SGMII_MODE_CTRL_PHY; 1935 } else if (interface == PHY_INTERFACE_MODE_SGMII) { 1936 val &= ~QCA8K_SGMII_MODE_CTRL_MASK; 1937 val |= QCA8K_SGMII_MODE_CTRL_MAC; 1938 } else if (interface == PHY_INTERFACE_MODE_1000BASEX) { 1939 val &= ~QCA8K_SGMII_MODE_CTRL_MASK; 1940 val |= QCA8K_SGMII_MODE_CTRL_BASEX; 1941 } 1942 1943 qca8k_write(priv, QCA8K_REG_SGMII_CTRL, val); 1944 1945 /* From original code is reported port instability as SGMII also 1946 * require delay set. Apply advised values here or take them from DT. 1947 */ 1948 if (interface == PHY_INTERFACE_MODE_SGMII) 1949 qca8k_mac_config_setup_internal_delay(priv, cpu_port_index, reg); 1950 /* For qca8327/qca8328/qca8334/qca8338 sgmii is unique and 1951 * falling edge is set writing in the PORT0 PAD reg 1952 */ 1953 if (priv->switch_id == QCA8K_ID_QCA8327 || 1954 priv->switch_id == QCA8K_ID_QCA8337) 1955 reg = QCA8K_REG_PORT0_PAD_CTRL; 1956 1957 val = 0; 1958 1959 /* SGMII Clock phase configuration */ 1960 if (priv->ports_config.sgmii_rx_clk_falling_edge) 1961 val |= QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE; 1962 1963 if (priv->ports_config.sgmii_tx_clk_falling_edge) 1964 val |= QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE; 1965 1966 if (val) 1967 ret = qca8k_rmw(priv, reg, 1968 QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | 1969 QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE, 1970 val); 1971 1972 return 0; 1973} 1974 1975static void qca8k_pcs_an_restart(struct phylink_pcs *pcs) 1976{ 1977} 1978 1979static const struct phylink_pcs_ops qca8k_pcs_ops = { 1980 .pcs_get_state = qca8k_pcs_get_state, 1981 .pcs_config = qca8k_pcs_config, 1982 .pcs_an_restart = qca8k_pcs_an_restart, 1983}; 1984 1985static void qca8k_setup_pcs(struct qca8k_priv *priv, struct qca8k_pcs *qpcs, 1986 int port) 1987{ 1988 qpcs->pcs.ops = &qca8k_pcs_ops; 1989 1990 /* We don't have interrupts for link changes, so we need to poll */ 1991 qpcs->pcs.poll = true; 1992 qpcs->priv = priv; 1993 qpcs->port = port; 1994} 1995 1996static void 1997qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) 1998{ 1999 const struct qca8k_match_data *match_data; 2000 struct qca8k_priv *priv = ds->priv; 2001 int i; 2002 2003 if (stringset != ETH_SS_STATS) 2004 return; 2005 2006 match_data = of_device_get_match_data(priv->dev); 2007 2008 for (i = 0; i < match_data->mib_count; i++) 2009 strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name, 2010 ETH_GSTRING_LEN); 2011} 2012 2013static void qca8k_mib_autocast_handler(struct dsa_switch *ds, struct sk_buff *skb) 2014{ 2015 const struct qca8k_match_data *match_data; 2016 struct qca8k_mib_eth_data *mib_eth_data; 2017 struct qca8k_priv *priv = ds->priv; 2018 const struct qca8k_mib_desc *mib; 2019 struct mib_ethhdr *mib_ethhdr; 2020 int i, mib_len, offset = 0; 2021 u64 *data; 2022 u8 port; 2023 2024 mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); 2025 mib_eth_data = &priv->mib_eth_data; 2026 2027 /* The switch autocast every port. Ignore other packet and 2028 * parse only the requested one. 2029 */ 2030 port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); 2031 if (port != mib_eth_data->req_port) 2032 goto exit; 2033 2034 match_data = device_get_match_data(priv->dev); 2035 data = mib_eth_data->data; 2036 2037 for (i = 0; i < match_data->mib_count; i++) { 2038 mib = &ar8327_mib[i]; 2039 2040 /* First 3 mib are present in the skb head */ 2041 if (i < 3) { 2042 data[i] = mib_ethhdr->data[i]; 2043 continue; 2044 } 2045 2046 mib_len = sizeof(uint32_t); 2047 2048 /* Some mib are 64 bit wide */ 2049 if (mib->size == 2) 2050 mib_len = sizeof(uint64_t); 2051 2052 /* Copy the mib value from packet to the */ 2053 memcpy(data + i, skb->data + offset, mib_len); 2054 2055 /* Set the offset for the next mib */ 2056 offset += mib_len; 2057 } 2058 2059exit: 2060 /* Complete on receiving all the mib packet */ 2061 if (refcount_dec_and_test(&mib_eth_data->port_parsed)) 2062 complete(&mib_eth_data->rw_done); 2063} 2064 2065static int 2066qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) 2067{ 2068 struct dsa_port *dp = dsa_to_port(ds, port); 2069 struct qca8k_mib_eth_data *mib_eth_data; 2070 struct qca8k_priv *priv = ds->priv; 2071 int ret; 2072 2073 mib_eth_data = &priv->mib_eth_data; 2074 2075 mutex_lock(&mib_eth_data->mutex); 2076 2077 reinit_completion(&mib_eth_data->rw_done); 2078 2079 mib_eth_data->req_port = dp->index; 2080 mib_eth_data->data = data; 2081 refcount_set(&mib_eth_data->port_parsed, QCA8K_NUM_PORTS); 2082 2083 mutex_lock(&priv->reg_mutex); 2084 2085 /* Send mib autocast request */ 2086 ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, 2087 QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, 2088 FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | 2089 QCA8K_MIB_BUSY); 2090 2091 mutex_unlock(&priv->reg_mutex); 2092 2093 if (ret) 2094 goto exit; 2095 2096 ret = wait_for_completion_timeout(&mib_eth_data->rw_done, QCA8K_ETHERNET_TIMEOUT); 2097 2098exit: 2099 mutex_unlock(&mib_eth_data->mutex); 2100 2101 return ret; 2102} 2103 2104static void 2105qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, 2106 uint64_t *data) 2107{ 2108 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2109 const struct qca8k_match_data *match_data; 2110 const struct qca8k_mib_desc *mib; 2111 u32 reg, i, val; 2112 u32 hi = 0; 2113 int ret; 2114 2115 if (priv->mgmt_master && 2116 qca8k_get_ethtool_stats_eth(ds, port, data) > 0) 2117 return; 2118 2119 match_data = of_device_get_match_data(priv->dev); 2120 2121 for (i = 0; i < match_data->mib_count; i++) { 2122 mib = &ar8327_mib[i]; 2123 reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset; 2124 2125 ret = qca8k_read(priv, reg, &val); 2126 if (ret < 0) 2127 continue; 2128 2129 if (mib->size == 2) { 2130 ret = qca8k_read(priv, reg + 4, &hi); 2131 if (ret < 0) 2132 continue; 2133 } 2134 2135 data[i] = val; 2136 if (mib->size == 2) 2137 data[i] |= (u64)hi << 32; 2138 } 2139} 2140 2141static int 2142qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset) 2143{ 2144 const struct qca8k_match_data *match_data; 2145 struct qca8k_priv *priv = ds->priv; 2146 2147 if (sset != ETH_SS_STATS) 2148 return 0; 2149 2150 match_data = of_device_get_match_data(priv->dev); 2151 2152 return match_data->mib_count; 2153} 2154 2155static int 2156qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee) 2157{ 2158 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2159 u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port); 2160 u32 reg; 2161 int ret; 2162 2163 mutex_lock(&priv->reg_mutex); 2164 ret = qca8k_read(priv, QCA8K_REG_EEE_CTRL, ®); 2165 if (ret < 0) 2166 goto exit; 2167 2168 if (eee->eee_enabled) 2169 reg |= lpi_en; 2170 else 2171 reg &= ~lpi_en; 2172 ret = qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg); 2173 2174exit: 2175 mutex_unlock(&priv->reg_mutex); 2176 return ret; 2177} 2178 2179static int 2180qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e) 2181{ 2182 /* Nothing to do on the port's MAC */ 2183 return 0; 2184} 2185 2186static void 2187qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) 2188{ 2189 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2190 u32 stp_state; 2191 2192 switch (state) { 2193 case BR_STATE_DISABLED: 2194 stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED; 2195 break; 2196 case BR_STATE_BLOCKING: 2197 stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING; 2198 break; 2199 case BR_STATE_LISTENING: 2200 stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING; 2201 break; 2202 case BR_STATE_LEARNING: 2203 stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING; 2204 break; 2205 case BR_STATE_FORWARDING: 2206 default: 2207 stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD; 2208 break; 2209 } 2210 2211 qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), 2212 QCA8K_PORT_LOOKUP_STATE_MASK, stp_state); 2213} 2214 2215static int qca8k_port_bridge_join(struct dsa_switch *ds, int port, 2216 struct dsa_bridge bridge, 2217 bool *tx_fwd_offload, 2218 struct netlink_ext_ack *extack) 2219{ 2220 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2221 int port_mask, cpu_port; 2222 int i, ret; 2223 2224 cpu_port = dsa_to_port(ds, port)->cpu_dp->index; 2225 port_mask = BIT(cpu_port); 2226 2227 for (i = 0; i < QCA8K_NUM_PORTS; i++) { 2228 if (dsa_is_cpu_port(ds, i)) 2229 continue; 2230 if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge)) 2231 continue; 2232 /* Add this port to the portvlan mask of the other ports 2233 * in the bridge 2234 */ 2235 ret = regmap_set_bits(priv->regmap, 2236 QCA8K_PORT_LOOKUP_CTRL(i), 2237 BIT(port)); 2238 if (ret) 2239 return ret; 2240 if (i != port) 2241 port_mask |= BIT(i); 2242 } 2243 2244 /* Add all other ports to this ports portvlan mask */ 2245 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), 2246 QCA8K_PORT_LOOKUP_MEMBER, port_mask); 2247 2248 return ret; 2249} 2250 2251static void qca8k_port_bridge_leave(struct dsa_switch *ds, int port, 2252 struct dsa_bridge bridge) 2253{ 2254 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2255 int cpu_port, i; 2256 2257 cpu_port = dsa_to_port(ds, port)->cpu_dp->index; 2258 2259 for (i = 0; i < QCA8K_NUM_PORTS; i++) { 2260 if (dsa_is_cpu_port(ds, i)) 2261 continue; 2262 if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge)) 2263 continue; 2264 /* Remove this port to the portvlan mask of the other ports 2265 * in the bridge 2266 */ 2267 regmap_clear_bits(priv->regmap, 2268 QCA8K_PORT_LOOKUP_CTRL(i), 2269 BIT(port)); 2270 } 2271 2272 /* Set the cpu port to be the only one in the portvlan mask of 2273 * this port 2274 */ 2275 qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), 2276 QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port)); 2277} 2278 2279static void 2280qca8k_port_fast_age(struct dsa_switch *ds, int port) 2281{ 2282 struct qca8k_priv *priv = ds->priv; 2283 2284 mutex_lock(&priv->reg_mutex); 2285 qca8k_fdb_access(priv, QCA8K_FDB_FLUSH_PORT, port); 2286 mutex_unlock(&priv->reg_mutex); 2287} 2288 2289static int 2290qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs) 2291{ 2292 struct qca8k_priv *priv = ds->priv; 2293 unsigned int secs = msecs / 1000; 2294 u32 val; 2295 2296 /* AGE_TIME reg is set in 7s step */ 2297 val = secs / 7; 2298 2299 /* Handle case with 0 as val to NOT disable 2300 * learning 2301 */ 2302 if (!val) 2303 val = 1; 2304 2305 return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK, 2306 QCA8K_ATU_AGE_TIME(val)); 2307} 2308 2309static int 2310qca8k_port_enable(struct dsa_switch *ds, int port, 2311 struct phy_device *phy) 2312{ 2313 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2314 2315 qca8k_port_set_status(priv, port, 1); 2316 priv->port_enabled_map |= BIT(port); 2317 2318 if (dsa_is_user_port(ds, port)) 2319 phy_support_asym_pause(phy); 2320 2321 return 0; 2322} 2323 2324static void 2325qca8k_port_disable(struct dsa_switch *ds, int port) 2326{ 2327 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2328 2329 qca8k_port_set_status(priv, port, 0); 2330 priv->port_enabled_map &= ~BIT(port); 2331} 2332 2333static int 2334qca8k_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) 2335{ 2336 struct qca8k_priv *priv = ds->priv; 2337 int ret; 2338 2339 /* We have only have a general MTU setting. 2340 * DSA always set the CPU port's MTU to the largest MTU of the slave 2341 * ports. 2342 * Setting MTU just for the CPU port is sufficient to correctly set a 2343 * value for every port. 2344 */ 2345 if (!dsa_is_cpu_port(ds, port)) 2346 return 0; 2347 2348 /* To change the MAX_FRAME_SIZE the cpu ports must be off or 2349 * the switch panics. 2350 * Turn off both cpu ports before applying the new value to prevent 2351 * this. 2352 */ 2353 if (priv->port_enabled_map & BIT(0)) 2354 qca8k_port_set_status(priv, 0, 0); 2355 2356 if (priv->port_enabled_map & BIT(6)) 2357 qca8k_port_set_status(priv, 6, 0); 2358 2359 /* Include L2 header / FCS length */ 2360 ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, new_mtu + ETH_HLEN + ETH_FCS_LEN); 2361 2362 if (priv->port_enabled_map & BIT(0)) 2363 qca8k_port_set_status(priv, 0, 1); 2364 2365 if (priv->port_enabled_map & BIT(6)) 2366 qca8k_port_set_status(priv, 6, 1); 2367 2368 return ret; 2369} 2370 2371static int 2372qca8k_port_max_mtu(struct dsa_switch *ds, int port) 2373{ 2374 return QCA8K_MAX_MTU; 2375} 2376 2377static int 2378qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr, 2379 u16 port_mask, u16 vid) 2380{ 2381 /* Set the vid to the port vlan id if no vid is set */ 2382 if (!vid) 2383 vid = QCA8K_PORT_VID_DEF; 2384 2385 return qca8k_fdb_add(priv, addr, port_mask, vid, 2386 QCA8K_ATU_STATUS_STATIC); 2387} 2388 2389static int 2390qca8k_port_fdb_add(struct dsa_switch *ds, int port, 2391 const unsigned char *addr, u16 vid, 2392 struct dsa_db db) 2393{ 2394 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2395 u16 port_mask = BIT(port); 2396 2397 return qca8k_port_fdb_insert(priv, addr, port_mask, vid); 2398} 2399 2400static int 2401qca8k_port_fdb_del(struct dsa_switch *ds, int port, 2402 const unsigned char *addr, u16 vid, 2403 struct dsa_db db) 2404{ 2405 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2406 u16 port_mask = BIT(port); 2407 2408 if (!vid) 2409 vid = QCA8K_PORT_VID_DEF; 2410 2411 return qca8k_fdb_del(priv, addr, port_mask, vid); 2412} 2413 2414static int 2415qca8k_port_fdb_dump(struct dsa_switch *ds, int port, 2416 dsa_fdb_dump_cb_t *cb, void *data) 2417{ 2418 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2419 struct qca8k_fdb _fdb = { 0 }; 2420 int cnt = QCA8K_NUM_FDB_RECORDS; 2421 bool is_static; 2422 int ret = 0; 2423 2424 mutex_lock(&priv->reg_mutex); 2425 while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) { 2426 if (!_fdb.aging) 2427 break; 2428 is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC); 2429 ret = cb(_fdb.mac, _fdb.vid, is_static, data); 2430 if (ret) 2431 break; 2432 } 2433 mutex_unlock(&priv->reg_mutex); 2434 2435 return 0; 2436} 2437 2438static int 2439qca8k_port_mdb_add(struct dsa_switch *ds, int port, 2440 const struct switchdev_obj_port_mdb *mdb, 2441 struct dsa_db db) 2442{ 2443 struct qca8k_priv *priv = ds->priv; 2444 const u8 *addr = mdb->addr; 2445 u16 vid = mdb->vid; 2446 2447 return qca8k_fdb_search_and_insert(priv, BIT(port), addr, vid); 2448} 2449 2450static int 2451qca8k_port_mdb_del(struct dsa_switch *ds, int port, 2452 const struct switchdev_obj_port_mdb *mdb, 2453 struct dsa_db db) 2454{ 2455 struct qca8k_priv *priv = ds->priv; 2456 const u8 *addr = mdb->addr; 2457 u16 vid = mdb->vid; 2458 2459 return qca8k_fdb_search_and_del(priv, BIT(port), addr, vid); 2460} 2461 2462static int 2463qca8k_port_mirror_add(struct dsa_switch *ds, int port, 2464 struct dsa_mall_mirror_tc_entry *mirror, 2465 bool ingress, struct netlink_ext_ack *extack) 2466{ 2467 struct qca8k_priv *priv = ds->priv; 2468 int monitor_port, ret; 2469 u32 reg, val; 2470 2471 /* Check for existent entry */ 2472 if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port)) 2473 return -EEXIST; 2474 2475 ret = regmap_read(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, &val); 2476 if (ret) 2477 return ret; 2478 2479 /* QCA83xx can have only one port set to mirror mode. 2480 * Check that the correct port is requested and return error otherwise. 2481 * When no mirror port is set, the values is set to 0xF 2482 */ 2483 monitor_port = FIELD_GET(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); 2484 if (monitor_port != 0xF && monitor_port != mirror->to_local_port) 2485 return -EEXIST; 2486 2487 /* Set the monitor port */ 2488 val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 2489 mirror->to_local_port); 2490 ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, 2491 QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); 2492 if (ret) 2493 return ret; 2494 2495 if (ingress) { 2496 reg = QCA8K_PORT_LOOKUP_CTRL(port); 2497 val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; 2498 } else { 2499 reg = QCA8K_REG_PORT_HOL_CTRL1(port); 2500 val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; 2501 } 2502 2503 ret = regmap_update_bits(priv->regmap, reg, val, val); 2504 if (ret) 2505 return ret; 2506 2507 /* Track mirror port for tx and rx to decide when the 2508 * mirror port has to be disabled. 2509 */ 2510 if (ingress) 2511 priv->mirror_rx |= BIT(port); 2512 else 2513 priv->mirror_tx |= BIT(port); 2514 2515 return 0; 2516} 2517 2518static void 2519qca8k_port_mirror_del(struct dsa_switch *ds, int port, 2520 struct dsa_mall_mirror_tc_entry *mirror) 2521{ 2522 struct qca8k_priv *priv = ds->priv; 2523 u32 reg, val; 2524 int ret; 2525 2526 if (mirror->ingress) { 2527 reg = QCA8K_PORT_LOOKUP_CTRL(port); 2528 val = QCA8K_PORT_LOOKUP_ING_MIRROR_EN; 2529 } else { 2530 reg = QCA8K_REG_PORT_HOL_CTRL1(port); 2531 val = QCA8K_PORT_HOL_CTRL1_EG_MIRROR_EN; 2532 } 2533 2534 ret = regmap_clear_bits(priv->regmap, reg, val); 2535 if (ret) 2536 goto err; 2537 2538 if (mirror->ingress) 2539 priv->mirror_rx &= ~BIT(port); 2540 else 2541 priv->mirror_tx &= ~BIT(port); 2542 2543 /* No port set to send packet to mirror port. Disable mirror port */ 2544 if (!priv->mirror_rx && !priv->mirror_tx) { 2545 val = FIELD_PREP(QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, 0xF); 2546 ret = regmap_update_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, 2547 QCA8K_GLOBAL_FW_CTRL0_MIRROR_PORT_NUM, val); 2548 if (ret) 2549 goto err; 2550 } 2551err: 2552 dev_err(priv->dev, "Failed to del mirror port from %d", port); 2553} 2554 2555static int 2556qca8k_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, 2557 struct netlink_ext_ack *extack) 2558{ 2559 struct qca8k_priv *priv = ds->priv; 2560 int ret; 2561 2562 if (vlan_filtering) { 2563 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), 2564 QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, 2565 QCA8K_PORT_LOOKUP_VLAN_MODE_SECURE); 2566 } else { 2567 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port), 2568 QCA8K_PORT_LOOKUP_VLAN_MODE_MASK, 2569 QCA8K_PORT_LOOKUP_VLAN_MODE_NONE); 2570 } 2571 2572 return ret; 2573} 2574 2575static int 2576qca8k_port_vlan_add(struct dsa_switch *ds, int port, 2577 const struct switchdev_obj_port_vlan *vlan, 2578 struct netlink_ext_ack *extack) 2579{ 2580 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; 2581 bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; 2582 struct qca8k_priv *priv = ds->priv; 2583 int ret; 2584 2585 ret = qca8k_vlan_add(priv, port, vlan->vid, untagged); 2586 if (ret) { 2587 dev_err(priv->dev, "Failed to add VLAN to port %d (%d)", port, ret); 2588 return ret; 2589 } 2590 2591 if (pvid) { 2592 ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port), 2593 QCA8K_EGREES_VLAN_PORT_MASK(port), 2594 QCA8K_EGREES_VLAN_PORT(port, vlan->vid)); 2595 if (ret) 2596 return ret; 2597 2598 ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port), 2599 QCA8K_PORT_VLAN_CVID(vlan->vid) | 2600 QCA8K_PORT_VLAN_SVID(vlan->vid)); 2601 } 2602 2603 return ret; 2604} 2605 2606static int 2607qca8k_port_vlan_del(struct dsa_switch *ds, int port, 2608 const struct switchdev_obj_port_vlan *vlan) 2609{ 2610 struct qca8k_priv *priv = ds->priv; 2611 int ret; 2612 2613 ret = qca8k_vlan_del(priv, port, vlan->vid); 2614 if (ret) 2615 dev_err(priv->dev, "Failed to delete VLAN from port %d (%d)", port, ret); 2616 2617 return ret; 2618} 2619 2620static u32 qca8k_get_phy_flags(struct dsa_switch *ds, int port) 2621{ 2622 struct qca8k_priv *priv = ds->priv; 2623 2624 /* Communicate to the phy internal driver the switch revision. 2625 * Based on the switch revision different values needs to be 2626 * set to the dbg and mmd reg on the phy. 2627 * The first 2 bit are used to communicate the switch revision 2628 * to the phy driver. 2629 */ 2630 if (port > 0 && port < 6) 2631 return priv->switch_revision; 2632 2633 return 0; 2634} 2635 2636static enum dsa_tag_protocol 2637qca8k_get_tag_protocol(struct dsa_switch *ds, int port, 2638 enum dsa_tag_protocol mp) 2639{ 2640 return DSA_TAG_PROTO_QCA; 2641} 2642 2643static bool 2644qca8k_lag_can_offload(struct dsa_switch *ds, struct dsa_lag lag, 2645 struct netdev_lag_upper_info *info) 2646{ 2647 struct dsa_port *dp; 2648 int members = 0; 2649 2650 if (!lag.id) 2651 return false; 2652 2653 dsa_lag_foreach_port(dp, ds->dst, &lag) 2654 /* Includes the port joining the LAG */ 2655 members++; 2656 2657 if (members > QCA8K_NUM_PORTS_FOR_LAG) 2658 return false; 2659 2660 if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) 2661 return false; 2662 2663 if (info->hash_type != NETDEV_LAG_HASH_L2 && 2664 info->hash_type != NETDEV_LAG_HASH_L23) 2665 return false; 2666 2667 return true; 2668} 2669 2670static int 2671qca8k_lag_setup_hash(struct dsa_switch *ds, struct dsa_lag lag, 2672 struct netdev_lag_upper_info *info) 2673{ 2674 struct net_device *lag_dev = lag.dev; 2675 struct qca8k_priv *priv = ds->priv; 2676 bool unique_lag = true; 2677 unsigned int i; 2678 u32 hash = 0; 2679 2680 switch (info->hash_type) { 2681 case NETDEV_LAG_HASH_L23: 2682 hash |= QCA8K_TRUNK_HASH_SIP_EN; 2683 hash |= QCA8K_TRUNK_HASH_DIP_EN; 2684 fallthrough; 2685 case NETDEV_LAG_HASH_L2: 2686 hash |= QCA8K_TRUNK_HASH_SA_EN; 2687 hash |= QCA8K_TRUNK_HASH_DA_EN; 2688 break; 2689 default: /* We should NEVER reach this */ 2690 return -EOPNOTSUPP; 2691 } 2692 2693 /* Check if we are the unique configured LAG */ 2694 dsa_lags_foreach_id(i, ds->dst) 2695 if (i != lag.id && dsa_lag_by_id(ds->dst, i)) { 2696 unique_lag = false; 2697 break; 2698 } 2699 2700 /* Hash Mode is global. Make sure the same Hash Mode 2701 * is set to all the 4 possible lag. 2702 * If we are the unique LAG we can set whatever hash 2703 * mode we want. 2704 * To change hash mode it's needed to remove all LAG 2705 * and change the mode with the latest. 2706 */ 2707 if (unique_lag) { 2708 priv->lag_hash_mode = hash; 2709 } else if (priv->lag_hash_mode != hash) { 2710 netdev_err(lag_dev, "Error: Mismatched Hash Mode across different lag is not supported\n"); 2711 return -EOPNOTSUPP; 2712 } 2713 2714 return regmap_update_bits(priv->regmap, QCA8K_TRUNK_HASH_EN_CTRL, 2715 QCA8K_TRUNK_HASH_MASK, hash); 2716} 2717 2718static int 2719qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, 2720 struct dsa_lag lag, bool delete) 2721{ 2722 struct qca8k_priv *priv = ds->priv; 2723 int ret, id, i; 2724 u32 val; 2725 2726 /* DSA LAG IDs are one-based, hardware is zero-based */ 2727 id = lag.id - 1; 2728 2729 /* Read current port member */ 2730 ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, &val); 2731 if (ret) 2732 return ret; 2733 2734 /* Shift val to the correct trunk */ 2735 val >>= QCA8K_REG_GOL_TRUNK_SHIFT(id); 2736 val &= QCA8K_REG_GOL_TRUNK_MEMBER_MASK; 2737 if (delete) 2738 val &= ~BIT(port); 2739 else 2740 val |= BIT(port); 2741 2742 /* Update port member. With empty portmap disable trunk */ 2743 ret = regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL0, 2744 QCA8K_REG_GOL_TRUNK_MEMBER(id) | 2745 QCA8K_REG_GOL_TRUNK_EN(id), 2746 !val << QCA8K_REG_GOL_TRUNK_SHIFT(id) | 2747 val << QCA8K_REG_GOL_TRUNK_SHIFT(id)); 2748 2749 /* Search empty member if adding or port on deleting */ 2750 for (i = 0; i < QCA8K_NUM_PORTS_FOR_LAG; i++) { 2751 ret = regmap_read(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), &val); 2752 if (ret) 2753 return ret; 2754 2755 val >>= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i); 2756 val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_MASK; 2757 2758 if (delete) { 2759 /* If port flagged to be disabled assume this member is 2760 * empty 2761 */ 2762 if (val != QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) 2763 continue; 2764 2765 val &= QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT_MASK; 2766 if (val != port) 2767 continue; 2768 } else { 2769 /* If port flagged to be enabled assume this member is 2770 * already set 2771 */ 2772 if (val == QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN_MASK) 2773 continue; 2774 } 2775 2776 /* We have found the member to add/remove */ 2777 break; 2778 } 2779 2780 /* Set port in the correct port mask or disable port if in delete mode */ 2781 return regmap_update_bits(priv->regmap, QCA8K_REG_GOL_TRUNK_CTRL(id), 2782 QCA8K_REG_GOL_TRUNK_ID_MEM_ID_EN(id, i) | 2783 QCA8K_REG_GOL_TRUNK_ID_MEM_ID_PORT(id, i), 2784 !delete << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i) | 2785 port << QCA8K_REG_GOL_TRUNK_ID_MEM_ID_SHIFT(id, i)); 2786} 2787 2788static int 2789qca8k_port_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag, 2790 struct netdev_lag_upper_info *info) 2791{ 2792 int ret; 2793 2794 if (!qca8k_lag_can_offload(ds, lag, info)) 2795 return -EOPNOTSUPP; 2796 2797 ret = qca8k_lag_setup_hash(ds, lag, info); 2798 if (ret) 2799 return ret; 2800 2801 return qca8k_lag_refresh_portmap(ds, port, lag, false); 2802} 2803 2804static int 2805qca8k_port_lag_leave(struct dsa_switch *ds, int port, 2806 struct dsa_lag lag) 2807{ 2808 return qca8k_lag_refresh_portmap(ds, port, lag, true); 2809} 2810 2811static void 2812qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, 2813 bool operational) 2814{ 2815 struct dsa_port *dp = master->dsa_ptr; 2816 struct qca8k_priv *priv = ds->priv; 2817 2818 /* Ethernet MIB/MDIO is only supported for CPU port 0 */ 2819 if (dp->index != 0) 2820 return; 2821 2822 mutex_lock(&priv->mgmt_eth_data.mutex); 2823 mutex_lock(&priv->mib_eth_data.mutex); 2824 2825 priv->mgmt_master = operational ? (struct net_device *)master : NULL; 2826 2827 mutex_unlock(&priv->mib_eth_data.mutex); 2828 mutex_unlock(&priv->mgmt_eth_data.mutex); 2829} 2830 2831static int qca8k_connect_tag_protocol(struct dsa_switch *ds, 2832 enum dsa_tag_protocol proto) 2833{ 2834 struct qca_tagger_data *tagger_data; 2835 2836 switch (proto) { 2837 case DSA_TAG_PROTO_QCA: 2838 tagger_data = ds->tagger_data; 2839 2840 tagger_data->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; 2841 tagger_data->mib_autocast_handler = qca8k_mib_autocast_handler; 2842 2843 break; 2844 default: 2845 return -EOPNOTSUPP; 2846 } 2847 2848 return 0; 2849} 2850 2851static int 2852qca8k_setup(struct dsa_switch *ds) 2853{ 2854 struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; 2855 int cpu_port, ret, i; 2856 u32 mask; 2857 2858 cpu_port = qca8k_find_cpu_port(ds); 2859 if (cpu_port < 0) { 2860 dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6"); 2861 return cpu_port; 2862 } 2863 2864 /* Parse CPU port config to be later used in phy_link mac_config */ 2865 ret = qca8k_parse_port_config(priv); 2866 if (ret) 2867 return ret; 2868 2869 ret = qca8k_setup_mdio_bus(priv); 2870 if (ret) 2871 return ret; 2872 2873 ret = qca8k_setup_of_pws_reg(priv); 2874 if (ret) 2875 return ret; 2876 2877 ret = qca8k_setup_mac_pwr_sel(priv); 2878 if (ret) 2879 return ret; 2880 2881 qca8k_setup_pcs(priv, &priv->pcs_port_0, 0); 2882 qca8k_setup_pcs(priv, &priv->pcs_port_6, 6); 2883 2884 /* Make sure MAC06 is disabled */ 2885 ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL, 2886 QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN); 2887 if (ret) { 2888 dev_err(priv->dev, "failed disabling MAC06 exchange"); 2889 return ret; 2890 } 2891 2892 /* Enable CPU Port */ 2893 ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0, 2894 QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); 2895 if (ret) { 2896 dev_err(priv->dev, "failed enabling CPU port"); 2897 return ret; 2898 } 2899 2900 /* Enable MIB counters */ 2901 ret = qca8k_mib_init(priv); 2902 if (ret) 2903 dev_warn(priv->dev, "mib init failed"); 2904 2905 /* Initial setup of all ports */ 2906 for (i = 0; i < QCA8K_NUM_PORTS; i++) { 2907 /* Disable forwarding by default on all ports */ 2908 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), 2909 QCA8K_PORT_LOOKUP_MEMBER, 0); 2910 if (ret) 2911 return ret; 2912 2913 /* Enable QCA header mode on all cpu ports */ 2914 if (dsa_is_cpu_port(ds, i)) { 2915 ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i), 2916 FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) | 2917 FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL)); 2918 if (ret) { 2919 dev_err(priv->dev, "failed enabling QCA header mode"); 2920 return ret; 2921 } 2922 } 2923 2924 /* Disable MAC by default on all user ports */ 2925 if (dsa_is_user_port(ds, i)) 2926 qca8k_port_set_status(priv, i, 0); 2927 } 2928 2929 /* Forward all unknown frames to CPU port for Linux processing 2930 * Notice that in multi-cpu config only one port should be set 2931 * for igmp, unknown, multicast and broadcast packet 2932 */ 2933 ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1, 2934 FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) | 2935 FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) | 2936 FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) | 2937 FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port))); 2938 if (ret) 2939 return ret; 2940 2941 /* Setup connection between CPU port & user ports 2942 * Configure specific switch configuration for ports 2943 */ 2944 for (i = 0; i < QCA8K_NUM_PORTS; i++) { 2945 /* CPU port gets connected to all user ports of the switch */ 2946 if (dsa_is_cpu_port(ds, i)) { 2947 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), 2948 QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds)); 2949 if (ret) 2950 return ret; 2951 } 2952 2953 /* Individual user ports get connected to CPU port only */ 2954 if (dsa_is_user_port(ds, i)) { 2955 ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i), 2956 QCA8K_PORT_LOOKUP_MEMBER, 2957 BIT(cpu_port)); 2958 if (ret) 2959 return ret; 2960 2961 /* Enable ARP Auto-learning by default */ 2962 ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i), 2963 QCA8K_PORT_LOOKUP_LEARN); 2964 if (ret) 2965 return ret; 2966 2967 /* For port based vlans to work we need to set the 2968 * default egress vid 2969 */ 2970 ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i), 2971 QCA8K_EGREES_VLAN_PORT_MASK(i), 2972 QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF)); 2973 if (ret) 2974 return ret; 2975 2976 ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i), 2977 QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) | 2978 QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF)); 2979 if (ret) 2980 return ret; 2981 } 2982 2983 /* The port 5 of the qca8337 have some problem in flood condition. The 2984 * original legacy driver had some specific buffer and priority settings 2985 * for the different port suggested by the QCA switch team. Add this 2986 * missing settings to improve switch stability under load condition. 2987 * This problem is limited to qca8337 and other qca8k switch are not affected. 2988 */ 2989 if (priv->switch_id == QCA8K_ID_QCA8337) { 2990 switch (i) { 2991 /* The 2 CPU port and port 5 requires some different 2992 * priority than any other ports. 2993 */ 2994 case 0: 2995 case 5: 2996 case 6: 2997 mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | 2998 QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | 2999 QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) | 3000 QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) | 3001 QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) | 3002 QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) | 3003 QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e); 3004 break; 3005 default: 3006 mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) | 3007 QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) | 3008 QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) | 3009 QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) | 3010 QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19); 3011 } 3012 qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask); 3013 3014 mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) | 3015 QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | 3016 QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | 3017 QCA8K_PORT_HOL_CTRL1_WRED_EN; 3018 qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i), 3019 QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK | 3020 QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN | 3021 QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN | 3022 QCA8K_PORT_HOL_CTRL1_WRED_EN, 3023 mask); 3024 } 3025 } 3026 3027 /* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */ 3028 if (priv->switch_id == QCA8K_ID_QCA8327) { 3029 mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) | 3030 QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496); 3031 qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH, 3032 QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK | 3033 QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK, 3034 mask); 3035 } 3036 3037 /* Setup our port MTUs to match power on defaults */ 3038 ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN); 3039 if (ret) 3040 dev_warn(priv->dev, "failed setting MTU settings"); 3041 3042 /* Flush the FDB table */ 3043 qca8k_fdb_flush(priv); 3044 3045 /* Set min a max ageing value supported */ 3046 ds->ageing_time_min = 7000; 3047 ds->ageing_time_max = 458745000; 3048 3049 /* Set max number of LAGs supported */ 3050 ds->num_lag_ids = QCA8K_NUM_LAGS; 3051 3052 return 0; 3053} 3054 3055static const struct dsa_switch_ops qca8k_switch_ops = { 3056 .get_tag_protocol = qca8k_get_tag_protocol, 3057 .setup = qca8k_setup, 3058 .get_strings = qca8k_get_strings, 3059 .get_ethtool_stats = qca8k_get_ethtool_stats, 3060 .get_sset_count = qca8k_get_sset_count, 3061 .set_ageing_time = qca8k_set_ageing_time, 3062 .get_mac_eee = qca8k_get_mac_eee, 3063 .set_mac_eee = qca8k_set_mac_eee, 3064 .port_enable = qca8k_port_enable, 3065 .port_disable = qca8k_port_disable, 3066 .port_change_mtu = qca8k_port_change_mtu, 3067 .port_max_mtu = qca8k_port_max_mtu, 3068 .port_stp_state_set = qca8k_port_stp_state_set, 3069 .port_bridge_join = qca8k_port_bridge_join, 3070 .port_bridge_leave = qca8k_port_bridge_leave, 3071 .port_fast_age = qca8k_port_fast_age, 3072 .port_fdb_add = qca8k_port_fdb_add, 3073 .port_fdb_del = qca8k_port_fdb_del, 3074 .port_fdb_dump = qca8k_port_fdb_dump, 3075 .port_mdb_add = qca8k_port_mdb_add, 3076 .port_mdb_del = qca8k_port_mdb_del, 3077 .port_mirror_add = qca8k_port_mirror_add, 3078 .port_mirror_del = qca8k_port_mirror_del, 3079 .port_vlan_filtering = qca8k_port_vlan_filtering, 3080 .port_vlan_add = qca8k_port_vlan_add, 3081 .port_vlan_del = qca8k_port_vlan_del, 3082 .phylink_get_caps = qca8k_phylink_get_caps, 3083 .phylink_mac_select_pcs = qca8k_phylink_mac_select_pcs, 3084 .phylink_mac_config = qca8k_phylink_mac_config, 3085 .phylink_mac_link_down = qca8k_phylink_mac_link_down, 3086 .phylink_mac_link_up = qca8k_phylink_mac_link_up, 3087 .get_phy_flags = qca8k_get_phy_flags, 3088 .port_lag_join = qca8k_port_lag_join, 3089 .port_lag_leave = qca8k_port_lag_leave, 3090 .master_state_change = qca8k_master_change, 3091 .connect_tag_protocol = qca8k_connect_tag_protocol, 3092}; 3093 3094static int qca8k_read_switch_id(struct qca8k_priv *priv) 3095{ 3096 const struct qca8k_match_data *data; 3097 u32 val; 3098 u8 id; 3099 int ret; 3100 3101 /* get the switches ID from the compatible */ 3102 data = of_device_get_match_data(priv->dev); 3103 if (!data) 3104 return -ENODEV; 3105 3106 ret = qca8k_read(priv, QCA8K_REG_MASK_CTRL, &val); 3107 if (ret < 0) 3108 return -ENODEV; 3109 3110 id = QCA8K_MASK_CTRL_DEVICE_ID(val); 3111 if (id != data->id) { 3112 dev_err(priv->dev, "Switch id detected %x but expected %x", id, data->id); 3113 return -ENODEV; 3114 } 3115 3116 priv->switch_id = id; 3117 3118 /* Save revision to communicate to the internal PHY driver */ 3119 priv->switch_revision = QCA8K_MASK_CTRL_REV_ID(val); 3120 3121 return 0; 3122} 3123 3124static int 3125qca8k_sw_probe(struct mdio_device *mdiodev) 3126{ 3127 struct qca8k_priv *priv; 3128 int ret; 3129 3130 /* allocate the private data struct so that we can probe the switches 3131 * ID register 3132 */ 3133 priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); 3134 if (!priv) 3135 return -ENOMEM; 3136 3137 priv->bus = mdiodev->bus; 3138 priv->dev = &mdiodev->dev; 3139 3140 priv->reset_gpio = devm_gpiod_get_optional(priv->dev, "reset", 3141 GPIOD_ASIS); 3142 if (IS_ERR(priv->reset_gpio)) 3143 return PTR_ERR(priv->reset_gpio); 3144 3145 if (priv->reset_gpio) { 3146 gpiod_set_value_cansleep(priv->reset_gpio, 1); 3147 /* The active low duration must be greater than 10 ms 3148 * and checkpatch.pl wants 20 ms. 3149 */ 3150 msleep(20); 3151 gpiod_set_value_cansleep(priv->reset_gpio, 0); 3152 } 3153 3154 /* Start by setting up the register mapping */ 3155 priv->regmap = devm_regmap_init(&mdiodev->dev, NULL, priv, 3156 &qca8k_regmap_config); 3157 if (IS_ERR(priv->regmap)) { 3158 dev_err(priv->dev, "regmap initialization failed"); 3159 return PTR_ERR(priv->regmap); 3160 } 3161 3162 priv->mdio_cache.page = 0xffff; 3163 priv->mdio_cache.lo = 0xffff; 3164 priv->mdio_cache.hi = 0xffff; 3165 3166 /* Check the detected switch id */ 3167 ret = qca8k_read_switch_id(priv); 3168 if (ret) 3169 return ret; 3170 3171 priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); 3172 if (!priv->ds) 3173 return -ENOMEM; 3174 3175 mutex_init(&priv->mgmt_eth_data.mutex); 3176 init_completion(&priv->mgmt_eth_data.rw_done); 3177 3178 mutex_init(&priv->mib_eth_data.mutex); 3179 init_completion(&priv->mib_eth_data.rw_done); 3180 3181 priv->ds->dev = &mdiodev->dev; 3182 priv->ds->num_ports = QCA8K_NUM_PORTS; 3183 priv->ds->priv = priv; 3184 priv->ds->ops = &qca8k_switch_ops; 3185 mutex_init(&priv->reg_mutex); 3186 dev_set_drvdata(&mdiodev->dev, priv); 3187 3188 return dsa_register_switch(priv->ds); 3189} 3190 3191static void 3192qca8k_sw_remove(struct mdio_device *mdiodev) 3193{ 3194 struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); 3195 int i; 3196 3197 if (!priv) 3198 return; 3199 3200 for (i = 0; i < QCA8K_NUM_PORTS; i++) 3201 qca8k_port_set_status(priv, i, 0); 3202 3203 dsa_unregister_switch(priv->ds); 3204 3205 dev_set_drvdata(&mdiodev->dev, NULL); 3206} 3207 3208static void qca8k_sw_shutdown(struct mdio_device *mdiodev) 3209{ 3210 struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); 3211 3212 if (!priv) 3213 return; 3214 3215 dsa_switch_shutdown(priv->ds); 3216 3217 dev_set_drvdata(&mdiodev->dev, NULL); 3218} 3219 3220#ifdef CONFIG_PM_SLEEP 3221static void 3222qca8k_set_pm(struct qca8k_priv *priv, int enable) 3223{ 3224 int port; 3225 3226 for (port = 0; port < QCA8K_NUM_PORTS; port++) { 3227 /* Do not enable on resume if the port was 3228 * disabled before. 3229 */ 3230 if (!(priv->port_enabled_map & BIT(port))) 3231 continue; 3232 3233 qca8k_port_set_status(priv, port, enable); 3234 } 3235} 3236 3237static int qca8k_suspend(struct device *dev) 3238{ 3239 struct qca8k_priv *priv = dev_get_drvdata(dev); 3240 3241 qca8k_set_pm(priv, 0); 3242 3243 return dsa_switch_suspend(priv->ds); 3244} 3245 3246static int qca8k_resume(struct device *dev) 3247{ 3248 struct qca8k_priv *priv = dev_get_drvdata(dev); 3249 3250 qca8k_set_pm(priv, 1); 3251 3252 return dsa_switch_resume(priv->ds); 3253} 3254#endif /* CONFIG_PM_SLEEP */ 3255 3256static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, 3257 qca8k_suspend, qca8k_resume); 3258 3259static const struct qca8k_match_data qca8327 = { 3260 .id = QCA8K_ID_QCA8327, 3261 .reduced_package = true, 3262 .mib_count = QCA8K_QCA832X_MIB_COUNT, 3263}; 3264 3265static const struct qca8k_match_data qca8328 = { 3266 .id = QCA8K_ID_QCA8327, 3267 .mib_count = QCA8K_QCA832X_MIB_COUNT, 3268}; 3269 3270static const struct qca8k_match_data qca833x = { 3271 .id = QCA8K_ID_QCA8337, 3272 .mib_count = QCA8K_QCA833X_MIB_COUNT, 3273}; 3274 3275static const struct of_device_id qca8k_of_match[] = { 3276 { .compatible = "qca,qca8327", .data = &qca8327 }, 3277 { .compatible = "qca,qca8328", .data = &qca8328 }, 3278 { .compatible = "qca,qca8334", .data = &qca833x }, 3279 { .compatible = "qca,qca8337", .data = &qca833x }, 3280 { /* sentinel */ }, 3281}; 3282 3283static struct mdio_driver qca8kmdio_driver = { 3284 .probe = qca8k_sw_probe, 3285 .remove = qca8k_sw_remove, 3286 .shutdown = qca8k_sw_shutdown, 3287 .mdiodrv.driver = { 3288 .name = "qca8k", 3289 .of_match_table = qca8k_of_match, 3290 .pm = &qca8k_pm_ops, 3291 }, 3292}; 3293 3294mdio_module_driver(qca8kmdio_driver); 3295 3296MODULE_AUTHOR("Mathieu Olivari, John Crispin <john@phrozen.org>"); 3297MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family"); 3298MODULE_LICENSE("GPL v2"); 3299MODULE_ALIAS("platform:qca8k");