Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa/ar9331: convert to mac_link_up()

Convert the ar9331 DSA driver to use the finalised link parameters in
mac_link_up() rather than the parameters in mac_config().

Tested-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Russell King and committed by
David S. Miller
a5440cbe 6d293026

+31 -29
+31 -29
drivers/net/dsa/qca/ar9331.c
··· 97 97 (AR9331_SW_PORT_STATUS_TXMAC | AR9331_SW_PORT_STATUS_RXMAC) 98 98 99 99 #define AR9331_SW_PORT_STATUS_LINK_MASK \ 100 - (AR9331_SW_PORT_STATUS_LINK_EN | AR9331_SW_PORT_STATUS_FLOW_LINK_EN | \ 101 - AR9331_SW_PORT_STATUS_DUPLEX_MODE | \ 100 + (AR9331_SW_PORT_STATUS_DUPLEX_MODE | \ 102 101 AR9331_SW_PORT_STATUS_RX_FLOW_EN | AR9331_SW_PORT_STATUS_TX_FLOW_EN | \ 103 102 AR9331_SW_PORT_STATUS_SPEED_M) 104 103 ··· 409 410 struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv; 410 411 struct regmap *regmap = priv->regmap; 411 412 int ret; 412 - u32 val; 413 - 414 - switch (state->speed) { 415 - case SPEED_1000: 416 - val = AR9331_SW_PORT_STATUS_SPEED_1000; 417 - break; 418 - case SPEED_100: 419 - val = AR9331_SW_PORT_STATUS_SPEED_100; 420 - break; 421 - case SPEED_10: 422 - val = AR9331_SW_PORT_STATUS_SPEED_10; 423 - break; 424 - default: 425 - return; 426 - } 427 - 428 - if (state->duplex) 429 - val |= AR9331_SW_PORT_STATUS_DUPLEX_MODE; 430 - 431 - if (state->pause & MLO_PAUSE_TX) 432 - val |= AR9331_SW_PORT_STATUS_TX_FLOW_EN; 433 - 434 - if (state->pause & MLO_PAUSE_RX) 435 - val |= AR9331_SW_PORT_STATUS_RX_FLOW_EN; 436 413 437 414 ret = regmap_update_bits(regmap, AR9331_SW_REG_PORT_STATUS(port), 438 - AR9331_SW_PORT_STATUS_LINK_MASK, val); 415 + AR9331_SW_PORT_STATUS_LINK_EN | 416 + AR9331_SW_PORT_STATUS_FLOW_LINK_EN, 0); 439 417 if (ret) 440 418 dev_err_ratelimited(priv->dev, "%s: %i\n", __func__, ret); 441 419 } ··· 440 464 { 441 465 struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv; 442 466 struct regmap *regmap = priv->regmap; 467 + u32 val; 443 468 int ret; 444 469 470 + val = AR9331_SW_PORT_STATUS_MAC_MASK; 471 + switch (speed) { 472 + case SPEED_1000: 473 + val |= AR9331_SW_PORT_STATUS_SPEED_1000; 474 + break; 475 + case SPEED_100: 476 + val |= AR9331_SW_PORT_STATUS_SPEED_100; 477 + break; 478 + case SPEED_10: 479 + val |= AR9331_SW_PORT_STATUS_SPEED_10; 480 + break; 481 + default: 482 + return; 483 + } 484 + 485 + if (duplex) 486 + val |= AR9331_SW_PORT_STATUS_DUPLEX_MODE; 487 + 488 + if (tx_pause) 489 + val |= AR9331_SW_PORT_STATUS_TX_FLOW_EN; 490 + 491 + if (rx_pause) 492 + val |= AR9331_SW_PORT_STATUS_RX_FLOW_EN; 493 + 445 494 ret = regmap_update_bits(regmap, AR9331_SW_REG_PORT_STATUS(port), 446 - AR9331_SW_PORT_STATUS_MAC_MASK, 447 - AR9331_SW_PORT_STATUS_MAC_MASK); 495 + AR9331_SW_PORT_STATUS_MAC_MASK | 496 + AR9331_SW_PORT_STATUS_LINK_MASK, 497 + val); 448 498 if (ret) 449 499 dev_err_ratelimited(priv->dev, "%s: %i\n", __func__, ret); 450 500 }