root/drivers/net/dsa/mv88e6xxx/port.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mv88e6xxx_port_read
  2. mv88e6xxx_port_write
  3. mv88e6185_port_set_pause
  4. mv88e6xxx_port_set_rgmii_delay
  5. mv88e6352_port_set_rgmii_delay
  6. mv88e6390_port_set_rgmii_delay
  7. mv88e6xxx_port_set_link
  8. mv88e6xxx_port_set_duplex
  9. mv88e6xxx_port_set_speed
  10. mv88e6065_port_set_speed
  11. mv88e6185_port_set_speed
  12. mv88e6250_port_set_speed
  13. mv88e6341_port_set_speed
  14. mv88e6341_port_max_speed_mode
  15. mv88e6352_port_set_speed
  16. mv88e6390_port_set_speed
  17. mv88e6390_port_max_speed_mode
  18. mv88e6390x_port_set_speed
  19. mv88e6390x_port_max_speed_mode
  20. mv88e6xxx_port_set_cmode
  21. mv88e6390x_port_set_cmode
  22. mv88e6390_port_set_cmode
  23. mv88e6341_port_set_cmode_writable
  24. mv88e6341_port_set_cmode
  25. mv88e6185_port_get_cmode
  26. mv88e6352_port_get_cmode
  27. mv88e6250_port_link_state
  28. mv88e6352_port_link_state
  29. mv88e6185_port_link_state
  30. mv88e6097_port_pause_limit
  31. mv88e6390_port_pause_limit
  32. mv88e6xxx_port_set_state
  33. mv88e6xxx_port_set_egress_mode
  34. mv88e6085_port_set_frame_mode
  35. mv88e6351_port_set_frame_mode
  36. mv88e6185_port_set_forward_unknown
  37. mv88e6352_port_set_egress_floods
  38. mv88e6xxx_port_set_message_port
  39. mv88e6xxx_port_set_vlan_map
  40. mv88e6xxx_port_get_fid
  41. mv88e6xxx_port_set_fid
  42. mv88e6xxx_port_get_pvid
  43. mv88e6xxx_port_set_pvid
  44. mv88e6185_port_set_default_forward
  45. mv88e6185_port_set_egress_floods
  46. mv88e6095_port_set_upstream_port
  47. mv88e6xxx_port_set_8021q_mode
  48. mv88e6xxx_port_set_map_da
  49. mv88e6165_port_set_jumbo_size
  50. mv88e6095_port_egress_rate_limiting
  51. mv88e6097_port_egress_rate_limiting
  52. mv88e6xxx_port_disable_learn_limit
  53. mv88e6xxx_port_disable_pri_override
  54. mv88e6351_port_set_ether_type
  55. mv88e6095_port_tag_remap
  56. mv88e6xxx_port_ieeepmt_write
  57. mv88e6390_port_tag_remap
  58. mv88e6352_port_set_policy

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * Marvell 88E6xxx Switch Port Registers support
   4  *
   5  * Copyright (c) 2008 Marvell Semiconductor
   6  *
   7  * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
   8  *      Vivien Didelot <vivien.didelot@savoirfairelinux.com>
   9  */
  10 
  11 #include <linux/bitfield.h>
  12 #include <linux/if_bridge.h>
  13 #include <linux/phy.h>
  14 #include <linux/phylink.h>
  15 
  16 #include "chip.h"
  17 #include "port.h"
  18 #include "serdes.h"
  19 
  20 int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
  21                         u16 *val)
  22 {
  23         int addr = chip->info->port_base_addr + port;
  24 
  25         return mv88e6xxx_read(chip, addr, reg, val);
  26 }
  27 
  28 int mv88e6xxx_port_write(struct mv88e6xxx_chip *chip, int port, int reg,
  29                          u16 val)
  30 {
  31         int addr = chip->info->port_base_addr + port;
  32 
  33         return mv88e6xxx_write(chip, addr, reg, val);
  34 }
  35 
  36 /* Offset 0x00: MAC (or PCS or Physical) Status Register
  37  *
  38  * For most devices, this is read only. However the 6185 has the MyPause
  39  * bit read/write.
  40  */
  41 int mv88e6185_port_set_pause(struct mv88e6xxx_chip *chip, int port,
  42                              int pause)
  43 {
  44         u16 reg;
  45         int err;
  46 
  47         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
  48         if (err)
  49                 return err;
  50 
  51         if (pause)
  52                 reg |= MV88E6XXX_PORT_STS_MY_PAUSE;
  53         else
  54                 reg &= ~MV88E6XXX_PORT_STS_MY_PAUSE;
  55 
  56         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
  57 }
  58 
  59 /* Offset 0x01: MAC (or PCS or Physical) Control Register
  60  *
  61  * Link, Duplex and Flow Control have one force bit, one value bit.
  62  *
  63  * For port's MAC speed, ForceSpd (or SpdValue) bits 1:0 program the value.
  64  * Alternative values require the 200BASE (or AltSpeed) bit 12 set.
  65  * Newer chips need a ForcedSpd bit 13 set to consider the value.
  66  */
  67 
  68 static int mv88e6xxx_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
  69                                           phy_interface_t mode)
  70 {
  71         u16 reg;
  72         int err;
  73 
  74         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
  75         if (err)
  76                 return err;
  77 
  78         reg &= ~(MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
  79                  MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK);
  80 
  81         switch (mode) {
  82         case PHY_INTERFACE_MODE_RGMII_RXID:
  83                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK;
  84                 break;
  85         case PHY_INTERFACE_MODE_RGMII_TXID:
  86                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
  87                 break;
  88         case PHY_INTERFACE_MODE_RGMII_ID:
  89                 reg |= MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK |
  90                         MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK;
  91                 break;
  92         case PHY_INTERFACE_MODE_RGMII:
  93                 break;
  94         default:
  95                 return 0;
  96         }
  97 
  98         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
  99         if (err)
 100                 return err;
 101 
 102         dev_dbg(chip->dev, "p%d: delay RXCLK %s, TXCLK %s\n", port,
 103                 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK ? "yes" : "no",
 104                 reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK ? "yes" : "no");
 105 
 106         return 0;
 107 }
 108 
 109 int mv88e6352_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
 110                                    phy_interface_t mode)
 111 {
 112         if (port < 5)
 113                 return -EOPNOTSUPP;
 114 
 115         return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
 116 }
 117 
 118 int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
 119                                    phy_interface_t mode)
 120 {
 121         if (port != 0)
 122                 return -EOPNOTSUPP;
 123 
 124         return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
 125 }
 126 
 127 int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
 128 {
 129         u16 reg;
 130         int err;
 131 
 132         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
 133         if (err)
 134                 return err;
 135 
 136         reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
 137                  MV88E6XXX_PORT_MAC_CTL_LINK_UP);
 138 
 139         switch (link) {
 140         case LINK_FORCED_DOWN:
 141                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK;
 142                 break;
 143         case LINK_FORCED_UP:
 144                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_LINK |
 145                         MV88E6XXX_PORT_MAC_CTL_LINK_UP;
 146                 break;
 147         case LINK_UNFORCED:
 148                 /* normal link detection */
 149                 break;
 150         default:
 151                 return -EINVAL;
 152         }
 153 
 154         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
 155         if (err)
 156                 return err;
 157 
 158         dev_dbg(chip->dev, "p%d: %s link %s\n", port,
 159                 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_LINK ? "Force" : "Unforce",
 160                 reg & MV88E6XXX_PORT_MAC_CTL_LINK_UP ? "up" : "down");
 161 
 162         return 0;
 163 }
 164 
 165 int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup)
 166 {
 167         u16 reg;
 168         int err;
 169 
 170         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
 171         if (err)
 172                 return err;
 173 
 174         reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
 175                  MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL);
 176 
 177         switch (dup) {
 178         case DUPLEX_HALF:
 179                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX;
 180                 break;
 181         case DUPLEX_FULL:
 182                 reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX |
 183                         MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL;
 184                 break;
 185         case DUPLEX_UNFORCED:
 186                 /* normal duplex detection */
 187                 break;
 188         default:
 189                 return -EOPNOTSUPP;
 190         }
 191 
 192         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
 193         if (err)
 194                 return err;
 195 
 196         dev_dbg(chip->dev, "p%d: %s %s duplex\n", port,
 197                 reg & MV88E6XXX_PORT_MAC_CTL_FORCE_DUPLEX ? "Force" : "Unforce",
 198                 reg & MV88E6XXX_PORT_MAC_CTL_DUPLEX_FULL ? "full" : "half");
 199 
 200         return 0;
 201 }
 202 
 203 static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port,
 204                                     int speed, bool alt_bit, bool force_bit)
 205 {
 206         u16 reg, ctrl;
 207         int err;
 208 
 209         switch (speed) {
 210         case 10:
 211                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_10;
 212                 break;
 213         case 100:
 214                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100;
 215                 break;
 216         case 200:
 217                 if (alt_bit)
 218                         ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_100 |
 219                                 MV88E6390_PORT_MAC_CTL_ALTSPEED;
 220                 else
 221                         ctrl = MV88E6065_PORT_MAC_CTL_SPEED_200;
 222                 break;
 223         case 1000:
 224                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_1000;
 225                 break;
 226         case 2500:
 227                 if (alt_bit)
 228                         ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 |
 229                                 MV88E6390_PORT_MAC_CTL_ALTSPEED;
 230                 else
 231                         ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000;
 232                 break;
 233         case 10000:
 234                 /* all bits set, fall through... */
 235         case SPEED_UNFORCED:
 236                 ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_UNFORCED;
 237                 break;
 238         default:
 239                 return -EOPNOTSUPP;
 240         }
 241 
 242         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
 243         if (err)
 244                 return err;
 245 
 246         reg &= ~MV88E6XXX_PORT_MAC_CTL_SPEED_MASK;
 247         if (alt_bit)
 248                 reg &= ~MV88E6390_PORT_MAC_CTL_ALTSPEED;
 249         if (force_bit) {
 250                 reg &= ~MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
 251                 if (speed != SPEED_UNFORCED)
 252                         ctrl |= MV88E6390_PORT_MAC_CTL_FORCE_SPEED;
 253         }
 254         reg |= ctrl;
 255 
 256         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
 257         if (err)
 258                 return err;
 259 
 260         if (speed)
 261                 dev_dbg(chip->dev, "p%d: Speed set to %d Mbps\n", port, speed);
 262         else
 263                 dev_dbg(chip->dev, "p%d: Speed unforced\n", port);
 264 
 265         return 0;
 266 }
 267 
 268 /* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
 269 int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 270 {
 271         if (speed == SPEED_MAX)
 272                 speed = 200;
 273 
 274         if (speed > 200)
 275                 return -EOPNOTSUPP;
 276 
 277         /* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
 278         return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
 279 }
 280 
 281 /* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
 282 int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 283 {
 284         if (speed == SPEED_MAX)
 285                 speed = 1000;
 286 
 287         if (speed == 200 || speed > 1000)
 288                 return -EOPNOTSUPP;
 289 
 290         return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
 291 }
 292 
 293 /* Support 10, 100 Mbps (e.g. 88E6250 family) */
 294 int mv88e6250_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 295 {
 296         if (speed == SPEED_MAX)
 297                 speed = 100;
 298 
 299         if (speed > 100)
 300                 return -EOPNOTSUPP;
 301 
 302         return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
 303 }
 304 
 305 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6341) */
 306 int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 307 {
 308         if (speed == SPEED_MAX)
 309                 speed = port < 5 ? 1000 : 2500;
 310 
 311         if (speed > 2500)
 312                 return -EOPNOTSUPP;
 313 
 314         if (speed == 200 && port != 0)
 315                 return -EOPNOTSUPP;
 316 
 317         if (speed == 2500 && port < 5)
 318                 return -EOPNOTSUPP;
 319 
 320         return mv88e6xxx_port_set_speed(chip, port, speed, !port, true);
 321 }
 322 
 323 phy_interface_t mv88e6341_port_max_speed_mode(int port)
 324 {
 325         if (port == 5)
 326                 return PHY_INTERFACE_MODE_2500BASEX;
 327 
 328         return PHY_INTERFACE_MODE_NA;
 329 }
 330 
 331 /* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
 332 int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 333 {
 334         if (speed == SPEED_MAX)
 335                 speed = 1000;
 336 
 337         if (speed > 1000)
 338                 return -EOPNOTSUPP;
 339 
 340         if (speed == 200 && port < 5)
 341                 return -EOPNOTSUPP;
 342 
 343         return mv88e6xxx_port_set_speed(chip, port, speed, true, false);
 344 }
 345 
 346 /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6390) */
 347 int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 348 {
 349         if (speed == SPEED_MAX)
 350                 speed = port < 9 ? 1000 : 2500;
 351 
 352         if (speed > 2500)
 353                 return -EOPNOTSUPP;
 354 
 355         if (speed == 200 && port != 0)
 356                 return -EOPNOTSUPP;
 357 
 358         if (speed == 2500 && port < 9)
 359                 return -EOPNOTSUPP;
 360 
 361         return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
 362 }
 363 
 364 phy_interface_t mv88e6390_port_max_speed_mode(int port)
 365 {
 366         if (port == 9 || port == 10)
 367                 return PHY_INTERFACE_MODE_2500BASEX;
 368 
 369         return PHY_INTERFACE_MODE_NA;
 370 }
 371 
 372 /* Support 10, 100, 200, 1000, 2500, 10000 Mbps (e.g. 88E6190X) */
 373 int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
 374 {
 375         if (speed == SPEED_MAX)
 376                 speed = port < 9 ? 1000 : 10000;
 377 
 378         if (speed == 200 && port != 0)
 379                 return -EOPNOTSUPP;
 380 
 381         if (speed >= 2500 && port < 9)
 382                 return -EOPNOTSUPP;
 383 
 384         return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
 385 }
 386 
 387 phy_interface_t mv88e6390x_port_max_speed_mode(int port)
 388 {
 389         if (port == 9 || port == 10)
 390                 return PHY_INTERFACE_MODE_XAUI;
 391 
 392         return PHY_INTERFACE_MODE_NA;
 393 }
 394 
 395 static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
 396                                     phy_interface_t mode, bool force)
 397 {
 398         u8 lane;
 399         u16 cmode;
 400         u16 reg;
 401         int err;
 402 
 403         /* Default to a slow mode, so freeing up SERDES interfaces for
 404          * other ports which might use them for SFPs.
 405          */
 406         if (mode == PHY_INTERFACE_MODE_NA)
 407                 mode = PHY_INTERFACE_MODE_1000BASEX;
 408 
 409         switch (mode) {
 410         case PHY_INTERFACE_MODE_1000BASEX:
 411                 cmode = MV88E6XXX_PORT_STS_CMODE_1000BASEX;
 412                 break;
 413         case PHY_INTERFACE_MODE_SGMII:
 414                 cmode = MV88E6XXX_PORT_STS_CMODE_SGMII;
 415                 break;
 416         case PHY_INTERFACE_MODE_2500BASEX:
 417                 cmode = MV88E6XXX_PORT_STS_CMODE_2500BASEX;
 418                 break;
 419         case PHY_INTERFACE_MODE_XGMII:
 420         case PHY_INTERFACE_MODE_XAUI:
 421                 cmode = MV88E6XXX_PORT_STS_CMODE_XAUI;
 422                 break;
 423         case PHY_INTERFACE_MODE_RXAUI:
 424                 cmode = MV88E6XXX_PORT_STS_CMODE_RXAUI;
 425                 break;
 426         default:
 427                 cmode = 0;
 428         }
 429 
 430         /* cmode doesn't change, nothing to do for us unless forced */
 431         if (cmode == chip->ports[port].cmode && !force)
 432                 return 0;
 433 
 434         lane = mv88e6xxx_serdes_get_lane(chip, port);
 435         if (lane) {
 436                 if (chip->ports[port].serdes_irq) {
 437                         err = mv88e6xxx_serdes_irq_disable(chip, port, lane);
 438                         if (err)
 439                                 return err;
 440                 }
 441 
 442                 err = mv88e6xxx_serdes_power_down(chip, port, lane);
 443                 if (err)
 444                         return err;
 445         }
 446 
 447         chip->ports[port].cmode = 0;
 448 
 449         if (cmode) {
 450                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
 451                 if (err)
 452                         return err;
 453 
 454                 reg &= ~MV88E6XXX_PORT_STS_CMODE_MASK;
 455                 reg |= cmode;
 456 
 457                 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
 458                 if (err)
 459                         return err;
 460 
 461                 chip->ports[port].cmode = cmode;
 462 
 463                 lane = mv88e6xxx_serdes_get_lane(chip, port);
 464                 if (!lane)
 465                         return -ENODEV;
 466 
 467                 err = mv88e6xxx_serdes_power_up(chip, port, lane);
 468                 if (err)
 469                         return err;
 470 
 471                 if (chip->ports[port].serdes_irq) {
 472                         err = mv88e6xxx_serdes_irq_enable(chip, port, lane);
 473                         if (err)
 474                                 return err;
 475                 }
 476         }
 477 
 478         return 0;
 479 }
 480 
 481 int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
 482                               phy_interface_t mode)
 483 {
 484         if (port != 9 && port != 10)
 485                 return -EOPNOTSUPP;
 486 
 487         return mv88e6xxx_port_set_cmode(chip, port, mode, false);
 488 }
 489 
 490 int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
 491                              phy_interface_t mode)
 492 {
 493         if (port != 9 && port != 10)
 494                 return -EOPNOTSUPP;
 495 
 496         switch (mode) {
 497         case PHY_INTERFACE_MODE_NA:
 498                 return 0;
 499         case PHY_INTERFACE_MODE_XGMII:
 500         case PHY_INTERFACE_MODE_XAUI:
 501         case PHY_INTERFACE_MODE_RXAUI:
 502                 return -EINVAL;
 503         default:
 504                 break;
 505         }
 506 
 507         return mv88e6xxx_port_set_cmode(chip, port, mode, false);
 508 }
 509 
 510 static int mv88e6341_port_set_cmode_writable(struct mv88e6xxx_chip *chip,
 511                                              int port)
 512 {
 513         int err, addr;
 514         u16 reg, bits;
 515 
 516         if (port != 5)
 517                 return -EOPNOTSUPP;
 518 
 519         addr = chip->info->port_base_addr + port;
 520 
 521         err = mv88e6xxx_port_hidden_read(chip, 0x7, addr, 0, &reg);
 522         if (err)
 523                 return err;
 524 
 525         bits = MV88E6341_PORT_RESERVED_1A_FORCE_CMODE |
 526                MV88E6341_PORT_RESERVED_1A_SGMII_AN;
 527 
 528         if ((reg & bits) == bits)
 529                 return 0;
 530 
 531         reg |= bits;
 532         return mv88e6xxx_port_hidden_write(chip, 0x7, addr, 0, reg);
 533 }
 534 
 535 int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
 536                              phy_interface_t mode)
 537 {
 538         int err;
 539 
 540         if (port != 5)
 541                 return -EOPNOTSUPP;
 542 
 543         switch (mode) {
 544         case PHY_INTERFACE_MODE_NA:
 545                 return 0;
 546         case PHY_INTERFACE_MODE_XGMII:
 547         case PHY_INTERFACE_MODE_XAUI:
 548         case PHY_INTERFACE_MODE_RXAUI:
 549                 return -EINVAL;
 550         default:
 551                 break;
 552         }
 553 
 554         err = mv88e6341_port_set_cmode_writable(chip, port);
 555         if (err)
 556                 return err;
 557 
 558         return mv88e6xxx_port_set_cmode(chip, port, mode, true);
 559 }
 560 
 561 int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
 562 {
 563         int err;
 564         u16 reg;
 565 
 566         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
 567         if (err)
 568                 return err;
 569 
 570         *cmode = reg & MV88E6185_PORT_STS_CMODE_MASK;
 571 
 572         return 0;
 573 }
 574 
 575 int mv88e6352_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
 576 {
 577         int err;
 578         u16 reg;
 579 
 580         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
 581         if (err)
 582                 return err;
 583 
 584         *cmode = reg & MV88E6XXX_PORT_STS_CMODE_MASK;
 585 
 586         return 0;
 587 }
 588 
 589 int mv88e6250_port_link_state(struct mv88e6xxx_chip *chip, int port,
 590                               struct phylink_link_state *state)
 591 {
 592         int err;
 593         u16 reg;
 594 
 595         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
 596         if (err)
 597                 return err;
 598 
 599         if (port < 5) {
 600                 switch (reg & MV88E6250_PORT_STS_PORTMODE_MASK) {
 601                 case MV88E6250_PORT_STS_PORTMODE_PHY_10_HALF:
 602                         state->speed = SPEED_10;
 603                         state->duplex = DUPLEX_HALF;
 604                         break;
 605                 case MV88E6250_PORT_STS_PORTMODE_PHY_100_HALF:
 606                         state->speed = SPEED_100;
 607                         state->duplex = DUPLEX_HALF;
 608                         break;
 609                 case MV88E6250_PORT_STS_PORTMODE_PHY_10_FULL:
 610                         state->speed = SPEED_10;
 611                         state->duplex = DUPLEX_FULL;
 612                         break;
 613                 case MV88E6250_PORT_STS_PORTMODE_PHY_100_FULL:
 614                         state->speed = SPEED_100;
 615                         state->duplex = DUPLEX_FULL;
 616                         break;
 617                 default:
 618                         state->speed = SPEED_UNKNOWN;
 619                         state->duplex = DUPLEX_UNKNOWN;
 620                         break;
 621                 }
 622         } else {
 623                 switch (reg & MV88E6250_PORT_STS_PORTMODE_MASK) {
 624                 case MV88E6250_PORT_STS_PORTMODE_MII_10_HALF:
 625                         state->speed = SPEED_10;
 626                         state->duplex = DUPLEX_HALF;
 627                         break;
 628                 case MV88E6250_PORT_STS_PORTMODE_MII_100_HALF:
 629                         state->speed = SPEED_100;
 630                         state->duplex = DUPLEX_HALF;
 631                         break;
 632                 case MV88E6250_PORT_STS_PORTMODE_MII_10_FULL:
 633                         state->speed = SPEED_10;
 634                         state->duplex = DUPLEX_FULL;
 635                         break;
 636                 case MV88E6250_PORT_STS_PORTMODE_MII_100_FULL:
 637                         state->speed = SPEED_100;
 638                         state->duplex = DUPLEX_FULL;
 639                         break;
 640                 default:
 641                         state->speed = SPEED_UNKNOWN;
 642                         state->duplex = DUPLEX_UNKNOWN;
 643                         break;
 644                 }
 645         }
 646 
 647         state->link = !!(reg & MV88E6250_PORT_STS_LINK);
 648         state->an_enabled = 1;
 649         state->an_complete = state->link;
 650         state->interface = PHY_INTERFACE_MODE_NA;
 651 
 652         return 0;
 653 }
 654 
 655 int mv88e6352_port_link_state(struct mv88e6xxx_chip *chip, int port,
 656                               struct phylink_link_state *state)
 657 {
 658         int err;
 659         u16 reg;
 660 
 661         switch (chip->ports[port].cmode) {
 662         case MV88E6XXX_PORT_STS_CMODE_RGMII:
 663                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL,
 664                                           &reg);
 665                 if (err)
 666                         return err;
 667 
 668                 if ((reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK) &&
 669                     (reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK))
 670                         state->interface = PHY_INTERFACE_MODE_RGMII_ID;
 671                 else if (reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_RXCLK)
 672                         state->interface = PHY_INTERFACE_MODE_RGMII_RXID;
 673                 else if (reg & MV88E6XXX_PORT_MAC_CTL_RGMII_DELAY_TXCLK)
 674                         state->interface = PHY_INTERFACE_MODE_RGMII_TXID;
 675                 else
 676                         state->interface = PHY_INTERFACE_MODE_RGMII;
 677                 break;
 678         case MV88E6XXX_PORT_STS_CMODE_1000BASEX:
 679                 state->interface = PHY_INTERFACE_MODE_1000BASEX;
 680                 break;
 681         case MV88E6XXX_PORT_STS_CMODE_SGMII:
 682                 state->interface = PHY_INTERFACE_MODE_SGMII;
 683                 break;
 684         case MV88E6XXX_PORT_STS_CMODE_2500BASEX:
 685                 state->interface = PHY_INTERFACE_MODE_2500BASEX;
 686                 break;
 687         case MV88E6XXX_PORT_STS_CMODE_XAUI:
 688                 state->interface = PHY_INTERFACE_MODE_XAUI;
 689                 break;
 690         case MV88E6XXX_PORT_STS_CMODE_RXAUI:
 691                 state->interface = PHY_INTERFACE_MODE_RXAUI;
 692                 break;
 693         default:
 694                 /* we do not support other cmode values here */
 695                 state->interface = PHY_INTERFACE_MODE_NA;
 696         }
 697 
 698         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
 699         if (err)
 700                 return err;
 701 
 702         switch (reg & MV88E6XXX_PORT_STS_SPEED_MASK) {
 703         case MV88E6XXX_PORT_STS_SPEED_10:
 704                 state->speed = SPEED_10;
 705                 break;
 706         case MV88E6XXX_PORT_STS_SPEED_100:
 707                 state->speed = SPEED_100;
 708                 break;
 709         case MV88E6XXX_PORT_STS_SPEED_1000:
 710                 state->speed = SPEED_1000;
 711                 break;
 712         case MV88E6XXX_PORT_STS_SPEED_10000:
 713                 if ((reg & MV88E6XXX_PORT_STS_CMODE_MASK) ==
 714                     MV88E6XXX_PORT_STS_CMODE_2500BASEX)
 715                         state->speed = SPEED_2500;
 716                 else
 717                         state->speed = SPEED_10000;
 718                 break;
 719         }
 720 
 721         state->duplex = reg & MV88E6XXX_PORT_STS_DUPLEX ?
 722                         DUPLEX_FULL : DUPLEX_HALF;
 723         state->link = !!(reg & MV88E6XXX_PORT_STS_LINK);
 724         state->an_enabled = 1;
 725         state->an_complete = state->link;
 726 
 727         return 0;
 728 }
 729 
 730 int mv88e6185_port_link_state(struct mv88e6xxx_chip *chip, int port,
 731                               struct phylink_link_state *state)
 732 {
 733         if (state->interface == PHY_INTERFACE_MODE_1000BASEX) {
 734                 u8 cmode = chip->ports[port].cmode;
 735 
 736                 /* When a port is in "Cross-chip serdes" mode, it uses
 737                  * 1000Base-X full duplex mode, but there is no automatic
 738                  * link detection. Use the sync OK status for link (as it
 739                  * would do for 1000Base-X mode.)
 740                  */
 741                 if (cmode == MV88E6185_PORT_STS_CMODE_SERDES) {
 742                         u16 mac;
 743                         int err;
 744 
 745                         err = mv88e6xxx_port_read(chip, port,
 746                                                   MV88E6XXX_PORT_MAC_CTL, &mac);
 747                         if (err)
 748                                 return err;
 749 
 750                         state->link = !!(mac & MV88E6185_PORT_MAC_CTL_SYNC_OK);
 751                         state->an_enabled = 1;
 752                         state->an_complete =
 753                                 !!(mac & MV88E6185_PORT_MAC_CTL_AN_DONE);
 754                         state->duplex =
 755                                 state->link ? DUPLEX_FULL : DUPLEX_UNKNOWN;
 756                         state->speed =
 757                                 state->link ? SPEED_1000 : SPEED_UNKNOWN;
 758 
 759                         return 0;
 760                 }
 761         }
 762 
 763         return mv88e6352_port_link_state(chip, port, state);
 764 }
 765 
 766 /* Offset 0x02: Jamming Control
 767  *
 768  * Do not limit the period of time that this port can be paused for by
 769  * the remote end or the period of time that this port can pause the
 770  * remote end.
 771  */
 772 int mv88e6097_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
 773                                u8 out)
 774 {
 775         return mv88e6xxx_port_write(chip, port, MV88E6097_PORT_JAM_CTL,
 776                                     out << 8 | in);
 777 }
 778 
 779 int mv88e6390_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
 780                                u8 out)
 781 {
 782         int err;
 783 
 784         err = mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
 785                                    MV88E6390_PORT_FLOW_CTL_UPDATE |
 786                                    MV88E6390_PORT_FLOW_CTL_LIMIT_IN | in);
 787         if (err)
 788                 return err;
 789 
 790         return mv88e6xxx_port_write(chip, port, MV88E6390_PORT_FLOW_CTL,
 791                                     MV88E6390_PORT_FLOW_CTL_UPDATE |
 792                                     MV88E6390_PORT_FLOW_CTL_LIMIT_OUT | out);
 793 }
 794 
 795 /* Offset 0x04: Port Control Register */
 796 
 797 static const char * const mv88e6xxx_port_state_names[] = {
 798         [MV88E6XXX_PORT_CTL0_STATE_DISABLED] = "Disabled",
 799         [MV88E6XXX_PORT_CTL0_STATE_BLOCKING] = "Blocking/Listening",
 800         [MV88E6XXX_PORT_CTL0_STATE_LEARNING] = "Learning",
 801         [MV88E6XXX_PORT_CTL0_STATE_FORWARDING] = "Forwarding",
 802 };
 803 
 804 int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state)
 805 {
 806         u16 reg;
 807         int err;
 808 
 809         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 810         if (err)
 811                 return err;
 812 
 813         reg &= ~MV88E6XXX_PORT_CTL0_STATE_MASK;
 814 
 815         switch (state) {
 816         case BR_STATE_DISABLED:
 817                 state = MV88E6XXX_PORT_CTL0_STATE_DISABLED;
 818                 break;
 819         case BR_STATE_BLOCKING:
 820         case BR_STATE_LISTENING:
 821                 state = MV88E6XXX_PORT_CTL0_STATE_BLOCKING;
 822                 break;
 823         case BR_STATE_LEARNING:
 824                 state = MV88E6XXX_PORT_CTL0_STATE_LEARNING;
 825                 break;
 826         case BR_STATE_FORWARDING:
 827                 state = MV88E6XXX_PORT_CTL0_STATE_FORWARDING;
 828                 break;
 829         default:
 830                 return -EINVAL;
 831         }
 832 
 833         reg |= state;
 834 
 835         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 836         if (err)
 837                 return err;
 838 
 839         dev_dbg(chip->dev, "p%d: PortState set to %s\n", port,
 840                 mv88e6xxx_port_state_names[state]);
 841 
 842         return 0;
 843 }
 844 
 845 int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,
 846                                    enum mv88e6xxx_egress_mode mode)
 847 {
 848         int err;
 849         u16 reg;
 850 
 851         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 852         if (err)
 853                 return err;
 854 
 855         reg &= ~MV88E6XXX_PORT_CTL0_EGRESS_MODE_MASK;
 856 
 857         switch (mode) {
 858         case MV88E6XXX_EGRESS_MODE_UNMODIFIED:
 859                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNMODIFIED;
 860                 break;
 861         case MV88E6XXX_EGRESS_MODE_UNTAGGED:
 862                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_UNTAGGED;
 863                 break;
 864         case MV88E6XXX_EGRESS_MODE_TAGGED:
 865                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_TAGGED;
 866                 break;
 867         case MV88E6XXX_EGRESS_MODE_ETHERTYPE:
 868                 reg |= MV88E6XXX_PORT_CTL0_EGRESS_MODE_ETHER_TYPE_DSA;
 869                 break;
 870         default:
 871                 return -EINVAL;
 872         }
 873 
 874         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 875 }
 876 
 877 int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
 878                                   enum mv88e6xxx_frame_mode mode)
 879 {
 880         int err;
 881         u16 reg;
 882 
 883         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 884         if (err)
 885                 return err;
 886 
 887         reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
 888 
 889         switch (mode) {
 890         case MV88E6XXX_FRAME_MODE_NORMAL:
 891                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
 892                 break;
 893         case MV88E6XXX_FRAME_MODE_DSA:
 894                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
 895                 break;
 896         default:
 897                 return -EINVAL;
 898         }
 899 
 900         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 901 }
 902 
 903 int mv88e6351_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
 904                                   enum mv88e6xxx_frame_mode mode)
 905 {
 906         int err;
 907         u16 reg;
 908 
 909         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 910         if (err)
 911                 return err;
 912 
 913         reg &= ~MV88E6XXX_PORT_CTL0_FRAME_MODE_MASK;
 914 
 915         switch (mode) {
 916         case MV88E6XXX_FRAME_MODE_NORMAL:
 917                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_NORMAL;
 918                 break;
 919         case MV88E6XXX_FRAME_MODE_DSA:
 920                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_DSA;
 921                 break;
 922         case MV88E6XXX_FRAME_MODE_PROVIDER:
 923                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_PROVIDER;
 924                 break;
 925         case MV88E6XXX_FRAME_MODE_ETHERTYPE:
 926                 reg |= MV88E6XXX_PORT_CTL0_FRAME_MODE_ETHER_TYPE_DSA;
 927                 break;
 928         default:
 929                 return -EINVAL;
 930         }
 931 
 932         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 933 }
 934 
 935 static int mv88e6185_port_set_forward_unknown(struct mv88e6xxx_chip *chip,
 936                                               int port, bool unicast)
 937 {
 938         int err;
 939         u16 reg;
 940 
 941         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 942         if (err)
 943                 return err;
 944 
 945         if (unicast)
 946                 reg |= MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
 947         else
 948                 reg &= ~MV88E6185_PORT_CTL0_FORWARD_UNKNOWN;
 949 
 950         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 951 }
 952 
 953 int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
 954                                      bool unicast, bool multicast)
 955 {
 956         int err;
 957         u16 reg;
 958 
 959         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL0, &reg);
 960         if (err)
 961                 return err;
 962 
 963         reg &= ~MV88E6352_PORT_CTL0_EGRESS_FLOODS_MASK;
 964 
 965         if (unicast && multicast)
 966                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_ALL_UNKNOWN_DA;
 967         else if (unicast)
 968                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_MC_DA;
 969         else if (multicast)
 970                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_UC_DA;
 971         else
 972                 reg |= MV88E6352_PORT_CTL0_EGRESS_FLOODS_NO_UNKNOWN_DA;
 973 
 974         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL0, reg);
 975 }
 976 
 977 /* Offset 0x05: Port Control 1 */
 978 
 979 int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,
 980                                     bool message_port)
 981 {
 982         u16 val;
 983         int err;
 984 
 985         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1, &val);
 986         if (err)
 987                 return err;
 988 
 989         if (message_port)
 990                 val |= MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
 991         else
 992                 val &= ~MV88E6XXX_PORT_CTL1_MESSAGE_PORT;
 993 
 994         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1, val);
 995 }
 996 
 997 /* Offset 0x06: Port Based VLAN Map */
 998 
 999 int mv88e6xxx_port_set_vlan_map(struct mv88e6xxx_chip *chip, int port, u16 map)
1000 {
1001         const u16 mask = mv88e6xxx_port_mask(chip);
1002         u16 reg;
1003         int err;
1004 
1005         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
1006         if (err)
1007                 return err;
1008 
1009         reg &= ~mask;
1010         reg |= map & mask;
1011 
1012         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
1013         if (err)
1014                 return err;
1015 
1016         dev_dbg(chip->dev, "p%d: VLANTable set to %.3x\n", port, map);
1017 
1018         return 0;
1019 }
1020 
1021 int mv88e6xxx_port_get_fid(struct mv88e6xxx_chip *chip, int port, u16 *fid)
1022 {
1023         const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
1024         u16 reg;
1025         int err;
1026 
1027         /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
1028         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
1029         if (err)
1030                 return err;
1031 
1032         *fid = (reg & 0xf000) >> 12;
1033 
1034         /* Port's default FID upper bits are located in reg 0x05, offset 0 */
1035         if (upper_mask) {
1036                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
1037                                           &reg);
1038                 if (err)
1039                         return err;
1040 
1041                 *fid |= (reg & upper_mask) << 4;
1042         }
1043 
1044         return 0;
1045 }
1046 
1047 int mv88e6xxx_port_set_fid(struct mv88e6xxx_chip *chip, int port, u16 fid)
1048 {
1049         const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
1050         u16 reg;
1051         int err;
1052 
1053         if (fid >= mv88e6xxx_num_databases(chip))
1054                 return -EINVAL;
1055 
1056         /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
1057         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_BASE_VLAN, &reg);
1058         if (err)
1059                 return err;
1060 
1061         reg &= 0x0fff;
1062         reg |= (fid & 0x000f) << 12;
1063 
1064         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_BASE_VLAN, reg);
1065         if (err)
1066                 return err;
1067 
1068         /* Port's default FID upper bits are located in reg 0x05, offset 0 */
1069         if (upper_mask) {
1070                 err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL1,
1071                                           &reg);
1072                 if (err)
1073                         return err;
1074 
1075                 reg &= ~upper_mask;
1076                 reg |= (fid >> 4) & upper_mask;
1077 
1078                 err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL1,
1079                                            reg);
1080                 if (err)
1081                         return err;
1082         }
1083 
1084         dev_dbg(chip->dev, "p%d: FID set to %u\n", port, fid);
1085 
1086         return 0;
1087 }
1088 
1089 /* Offset 0x07: Default Port VLAN ID & Priority */
1090 
1091 int mv88e6xxx_port_get_pvid(struct mv88e6xxx_chip *chip, int port, u16 *pvid)
1092 {
1093         u16 reg;
1094         int err;
1095 
1096         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
1097                                   &reg);
1098         if (err)
1099                 return err;
1100 
1101         *pvid = reg & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
1102 
1103         return 0;
1104 }
1105 
1106 int mv88e6xxx_port_set_pvid(struct mv88e6xxx_chip *chip, int port, u16 pvid)
1107 {
1108         u16 reg;
1109         int err;
1110 
1111         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
1112                                   &reg);
1113         if (err)
1114                 return err;
1115 
1116         reg &= ~MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
1117         reg |= pvid & MV88E6XXX_PORT_DEFAULT_VLAN_MASK;
1118 
1119         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_DEFAULT_VLAN,
1120                                    reg);
1121         if (err)
1122                 return err;
1123 
1124         dev_dbg(chip->dev, "p%d: DefaultVID set to %u\n", port, pvid);
1125 
1126         return 0;
1127 }
1128 
1129 /* Offset 0x08: Port Control 2 Register */
1130 
1131 static const char * const mv88e6xxx_port_8021q_mode_names[] = {
1132         [MV88E6XXX_PORT_CTL2_8021Q_MODE_DISABLED] = "Disabled",
1133         [MV88E6XXX_PORT_CTL2_8021Q_MODE_FALLBACK] = "Fallback",
1134         [MV88E6XXX_PORT_CTL2_8021Q_MODE_CHECK] = "Check",
1135         [MV88E6XXX_PORT_CTL2_8021Q_MODE_SECURE] = "Secure",
1136 };
1137 
1138 static int mv88e6185_port_set_default_forward(struct mv88e6xxx_chip *chip,
1139                                               int port, bool multicast)
1140 {
1141         int err;
1142         u16 reg;
1143 
1144         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
1145         if (err)
1146                 return err;
1147 
1148         if (multicast)
1149                 reg |= MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
1150         else
1151                 reg &= ~MV88E6XXX_PORT_CTL2_DEFAULT_FORWARD;
1152 
1153         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1154 }
1155 
1156 int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
1157                                      bool unicast, bool multicast)
1158 {
1159         int err;
1160 
1161         err = mv88e6185_port_set_forward_unknown(chip, port, unicast);
1162         if (err)
1163                 return err;
1164 
1165         return mv88e6185_port_set_default_forward(chip, port, multicast);
1166 }
1167 
1168 int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
1169                                      int upstream_port)
1170 {
1171         int err;
1172         u16 reg;
1173 
1174         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
1175         if (err)
1176                 return err;
1177 
1178         reg &= ~MV88E6095_PORT_CTL2_CPU_PORT_MASK;
1179         reg |= upstream_port;
1180 
1181         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1182 }
1183 
1184 int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
1185                                   u16 mode)
1186 {
1187         u16 reg;
1188         int err;
1189 
1190         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
1191         if (err)
1192                 return err;
1193 
1194         reg &= ~MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
1195         reg |= mode & MV88E6XXX_PORT_CTL2_8021Q_MODE_MASK;
1196 
1197         err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1198         if (err)
1199                 return err;
1200 
1201         dev_dbg(chip->dev, "p%d: 802.1QMode set to %s\n", port,
1202                 mv88e6xxx_port_8021q_mode_names[mode]);
1203 
1204         return 0;
1205 }
1206 
1207 int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
1208 {
1209         u16 reg;
1210         int err;
1211 
1212         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
1213         if (err)
1214                 return err;
1215 
1216         reg |= MV88E6XXX_PORT_CTL2_MAP_DA;
1217 
1218         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1219 }
1220 
1221 int mv88e6165_port_set_jumbo_size(struct mv88e6xxx_chip *chip, int port,
1222                                   size_t size)
1223 {
1224         u16 reg;
1225         int err;
1226 
1227         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
1228         if (err)
1229                 return err;
1230 
1231         reg &= ~MV88E6XXX_PORT_CTL2_JUMBO_MODE_MASK;
1232 
1233         if (size <= 1522)
1234                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_1522;
1235         else if (size <= 2048)
1236                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_2048;
1237         else if (size <= 10240)
1238                 reg |= MV88E6XXX_PORT_CTL2_JUMBO_MODE_10240;
1239         else
1240                 return -ERANGE;
1241 
1242         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
1243 }
1244 
1245 /* Offset 0x09: Port Rate Control */
1246 
1247 int mv88e6095_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
1248 {
1249         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
1250                                     0x0000);
1251 }
1252 
1253 int mv88e6097_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
1254 {
1255         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_EGRESS_RATE_CTL1,
1256                                     0x0001);
1257 }
1258 
1259 /* Offset 0x0C: Port ATU Control */
1260 
1261 int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port)
1262 {
1263         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ATU_CTL, 0);
1264 }
1265 
1266 /* Offset 0x0D: (Priority) Override Register */
1267 
1268 int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port)
1269 {
1270         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_PRI_OVERRIDE, 0);
1271 }
1272 
1273 /* Offset 0x0f: Port Ether type */
1274 
1275 int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
1276                                   u16 etype)
1277 {
1278         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ETH_TYPE, etype);
1279 }
1280 
1281 /* Offset 0x18: Port IEEE Priority Remapping Registers [0-3]
1282  * Offset 0x19: Port IEEE Priority Remapping Registers [4-7]
1283  */
1284 
1285 int mv88e6095_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
1286 {
1287         int err;
1288 
1289         /* Use a direct priority mapping for all IEEE tagged frames */
1290         err = mv88e6xxx_port_write(chip, port,
1291                                    MV88E6095_PORT_IEEE_PRIO_REMAP_0123,
1292                                    0x3210);
1293         if (err)
1294                 return err;
1295 
1296         return mv88e6xxx_port_write(chip, port,
1297                                     MV88E6095_PORT_IEEE_PRIO_REMAP_4567,
1298                                     0x7654);
1299 }
1300 
1301 static int mv88e6xxx_port_ieeepmt_write(struct mv88e6xxx_chip *chip,
1302                                         int port, u16 table, u8 ptr, u16 data)
1303 {
1304         u16 reg;
1305 
1306         reg = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_UPDATE | table |
1307                 (ptr << __bf_shf(MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_PTR_MASK)) |
1308                 (data & MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_DATA_MASK);
1309 
1310         return mv88e6xxx_port_write(chip, port,
1311                                     MV88E6390_PORT_IEEE_PRIO_MAP_TABLE, reg);
1312 }
1313 
1314 int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
1315 {
1316         int err, i;
1317         u16 table;
1318 
1319         for (i = 0; i <= 7; i++) {
1320                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP;
1321                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i,
1322                                                    (i | i << 4));
1323                 if (err)
1324                         return err;
1325 
1326                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP;
1327                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1328                 if (err)
1329                         return err;
1330 
1331                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP;
1332                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1333                 if (err)
1334                         return err;
1335 
1336                 table = MV88E6390_PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP;
1337                 err = mv88e6xxx_port_ieeepmt_write(chip, port, table, i, i);
1338                 if (err)
1339                         return err;
1340         }
1341 
1342         return 0;
1343 }
1344 
1345 /* Offset 0x0E: Policy Control Register */
1346 
1347 int mv88e6352_port_set_policy(struct mv88e6xxx_chip *chip, int port,
1348                               enum mv88e6xxx_policy_mapping mapping,
1349                               enum mv88e6xxx_policy_action action)
1350 {
1351         u16 reg, mask, val;
1352         int shift;
1353         int err;
1354 
1355         switch (mapping) {
1356         case MV88E6XXX_POLICY_MAPPING_DA:
1357                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_DA_MASK);
1358                 mask = MV88E6XXX_PORT_POLICY_CTL_DA_MASK;
1359                 break;
1360         case MV88E6XXX_POLICY_MAPPING_SA:
1361                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_SA_MASK);
1362                 mask = MV88E6XXX_PORT_POLICY_CTL_SA_MASK;
1363                 break;
1364         case MV88E6XXX_POLICY_MAPPING_VTU:
1365                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VTU_MASK);
1366                 mask = MV88E6XXX_PORT_POLICY_CTL_VTU_MASK;
1367                 break;
1368         case MV88E6XXX_POLICY_MAPPING_ETYPE:
1369                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK);
1370                 mask = MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK;
1371                 break;
1372         case MV88E6XXX_POLICY_MAPPING_PPPOE:
1373                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK);
1374                 mask = MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK;
1375                 break;
1376         case MV88E6XXX_POLICY_MAPPING_VBAS:
1377                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK);
1378                 mask = MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK;
1379                 break;
1380         case MV88E6XXX_POLICY_MAPPING_OPT82:
1381                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK);
1382                 mask = MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK;
1383                 break;
1384         case MV88E6XXX_POLICY_MAPPING_UDP:
1385                 shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_UDP_MASK);
1386                 mask = MV88E6XXX_PORT_POLICY_CTL_UDP_MASK;
1387                 break;
1388         default:
1389                 return -EOPNOTSUPP;
1390         }
1391 
1392         switch (action) {
1393         case MV88E6XXX_POLICY_ACTION_NORMAL:
1394                 val = MV88E6XXX_PORT_POLICY_CTL_NORMAL;
1395                 break;
1396         case MV88E6XXX_POLICY_ACTION_MIRROR:
1397                 val = MV88E6XXX_PORT_POLICY_CTL_MIRROR;
1398                 break;
1399         case MV88E6XXX_POLICY_ACTION_TRAP:
1400                 val = MV88E6XXX_PORT_POLICY_CTL_TRAP;
1401                 break;
1402         case MV88E6XXX_POLICY_ACTION_DISCARD:
1403                 val = MV88E6XXX_PORT_POLICY_CTL_DISCARD;
1404                 break;
1405         default:
1406                 return -EOPNOTSUPP;
1407         }
1408 
1409         err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_POLICY_CTL, &reg);
1410         if (err)
1411                 return err;
1412 
1413         reg &= ~mask;
1414         reg |= (val << shift) & mask;
1415 
1416         return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_POLICY_CTL, reg);
1417 }

/* [<][>][^][v][top][bottom][index][help] */