diff options
| -rw-r--r-- | drivers/net/cxgb3/regs.h | 27 | ||||
| -rw-r--r-- | drivers/net/cxgb3/t3_hw.c | 6 | ||||
| -rw-r--r-- | drivers/net/cxgb3/xgmac.c | 44 |
3 files changed, 58 insertions, 19 deletions
diff --git a/drivers/net/cxgb3/regs.h b/drivers/net/cxgb3/regs.h index 5e1bc0dec5f1..6e12bf4bc6cf 100644 --- a/drivers/net/cxgb3/regs.h +++ b/drivers/net/cxgb3/regs.h | |||
| @@ -1937,6 +1937,10 @@ | |||
| 1937 | 1937 | ||
| 1938 | #define A_XGM_RXFIFO_CFG 0x884 | 1938 | #define A_XGM_RXFIFO_CFG 0x884 |
| 1939 | 1939 | ||
| 1940 | #define S_RXFIFO_EMPTY 31 | ||
| 1941 | #define V_RXFIFO_EMPTY(x) ((x) << S_RXFIFO_EMPTY) | ||
| 1942 | #define F_RXFIFO_EMPTY V_RXFIFO_EMPTY(1U) | ||
| 1943 | |||
| 1940 | #define S_RXFIFOPAUSEHWM 17 | 1944 | #define S_RXFIFOPAUSEHWM 17 |
| 1941 | #define M_RXFIFOPAUSEHWM 0xfff | 1945 | #define M_RXFIFOPAUSEHWM 0xfff |
| 1942 | 1946 | ||
| @@ -1961,6 +1965,10 @@ | |||
| 1961 | 1965 | ||
| 1962 | #define A_XGM_TXFIFO_CFG 0x888 | 1966 | #define A_XGM_TXFIFO_CFG 0x888 |
| 1963 | 1967 | ||
| 1968 | #define S_UNDERUNFIX 22 | ||
| 1969 | #define V_UNDERUNFIX(x) ((x) << S_UNDERUNFIX) | ||
| 1970 | #define F_UNDERUNFIX V_UNDERUNFIX(1U) | ||
| 1971 | |||
| 1964 | #define S_TXIPG 13 | 1972 | #define S_TXIPG 13 |
| 1965 | #define M_TXIPG 0xff | 1973 | #define M_TXIPG 0xff |
| 1966 | #define V_TXIPG(x) ((x) << S_TXIPG) | 1974 | #define V_TXIPG(x) ((x) << S_TXIPG) |
| @@ -2034,10 +2042,27 @@ | |||
| 2034 | #define V_XAUIIMP(x) ((x) << S_XAUIIMP) | 2042 | #define V_XAUIIMP(x) ((x) << S_XAUIIMP) |
| 2035 | 2043 | ||
| 2036 | #define A_XGM_RX_MAX_PKT_SIZE 0x8a8 | 2044 | #define A_XGM_RX_MAX_PKT_SIZE 0x8a8 |
| 2037 | #define A_XGM_RX_MAX_PKT_SIZE_ERR_CNT 0x9a4 | 2045 | |
| 2046 | #define S_RXMAXFRAMERSIZE 17 | ||
| 2047 | #define M_RXMAXFRAMERSIZE 0x3fff | ||
| 2048 | #define V_RXMAXFRAMERSIZE(x) ((x) << S_RXMAXFRAMERSIZE) | ||
| 2049 | #define G_RXMAXFRAMERSIZE(x) (((x) >> S_RXMAXFRAMERSIZE) & M_RXMAXFRAMERSIZE) | ||
| 2050 | |||
| 2051 | #define S_RXENFRAMER 14 | ||
| 2052 | #define V_RXENFRAMER(x) ((x) << S_RXENFRAMER) | ||
| 2053 | #define F_RXENFRAMER V_RXENFRAMER(1U) | ||
| 2054 | |||
| 2055 | #define S_RXMAXPKTSIZE 0 | ||
| 2056 | #define M_RXMAXPKTSIZE 0x3fff | ||
| 2057 | #define V_RXMAXPKTSIZE(x) ((x) << S_RXMAXPKTSIZE) | ||
| 2058 | #define G_RXMAXPKTSIZE(x) (((x) >> S_RXMAXPKTSIZE) & M_RXMAXPKTSIZE) | ||
| 2038 | 2059 | ||
| 2039 | #define A_XGM_RESET_CTRL 0x8ac | 2060 | #define A_XGM_RESET_CTRL 0x8ac |
| 2040 | 2061 | ||
| 2062 | #define S_XGMAC_STOP_EN 4 | ||
| 2063 | #define V_XGMAC_STOP_EN(x) ((x) << S_XGMAC_STOP_EN) | ||
| 2064 | #define F_XGMAC_STOP_EN V_XGMAC_STOP_EN(1U) | ||
| 2065 | |||
| 2041 | #define S_XG2G_RESET_ 3 | 2066 | #define S_XG2G_RESET_ 3 |
| 2042 | #define V_XG2G_RESET_(x) ((x) << S_XG2G_RESET_) | 2067 | #define V_XG2G_RESET_(x) ((x) << S_XG2G_RESET_) |
| 2043 | #define F_XG2G_RESET_ V_XG2G_RESET_(1U) | 2068 | #define F_XG2G_RESET_ V_XG2G_RESET_(1U) |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index d4ee00d32219..522834c42ae7 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
| @@ -447,8 +447,8 @@ static const struct adapter_info t3_adap_info[] = { | |||
| 447 | &mi1_mdio_ops, "Chelsio T302"}, | 447 | &mi1_mdio_ops, "Chelsio T302"}, |
| 448 | {1, 0, 0, 0, | 448 | {1, 0, 0, 0, |
| 449 | F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | | 449 | F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | |
| 450 | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, | 450 | F_GPIO11_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, |
| 451 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI, | 451 | 0, SUPPORTED_10000baseT_Full | SUPPORTED_AUI, |
| 452 | &mi1_mdio_ext_ops, "Chelsio T310"}, | 452 | &mi1_mdio_ext_ops, "Chelsio T310"}, |
| 453 | {2, 0, 0, 0, | 453 | {2, 0, 0, 0, |
| 454 | F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | | 454 | F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | |
| @@ -2613,7 +2613,7 @@ static void __devinit init_mtus(unsigned short mtus[]) | |||
| 2613 | * it can accomodate max size TCP/IP headers when SACK and timestamps | 2613 | * it can accomodate max size TCP/IP headers when SACK and timestamps |
| 2614 | * are enabled and still have at least 8 bytes of payload. | 2614 | * are enabled and still have at least 8 bytes of payload. |
| 2615 | */ | 2615 | */ |
| 2616 | mtus[1] = 88; | 2616 | mtus[0] = 88; |
| 2617 | mtus[1] = 88; | 2617 | mtus[1] = 88; |
| 2618 | mtus[2] = 256; | 2618 | mtus[2] = 256; |
| 2619 | mtus[3] = 512; | 2619 | mtus[3] = 512; |
diff --git a/drivers/net/cxgb3/xgmac.c b/drivers/net/cxgb3/xgmac.c index eeb766aeced9..efcf09a709cf 100644 --- a/drivers/net/cxgb3/xgmac.c +++ b/drivers/net/cxgb3/xgmac.c | |||
| @@ -106,6 +106,7 @@ int t3_mac_reset(struct cmac *mac) | |||
| 106 | t3_set_reg_field(adap, A_XGM_RXFIFO_CFG + oft, | 106 | t3_set_reg_field(adap, A_XGM_RXFIFO_CFG + oft, |
| 107 | F_RXSTRFRWRD | F_DISERRFRAMES, | 107 | F_RXSTRFRWRD | F_DISERRFRAMES, |
| 108 | uses_xaui(adap) ? 0 : F_RXSTRFRWRD); | 108 | uses_xaui(adap) ? 0 : F_RXSTRFRWRD); |
| 109 | t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + oft, 0, F_UNDERUNFIX); | ||
| 109 | 110 | ||
| 110 | if (uses_xaui(adap)) { | 111 | if (uses_xaui(adap)) { |
| 111 | if (adap->params.rev == 0) { | 112 | if (adap->params.rev == 0) { |
| @@ -124,7 +125,11 @@ int t3_mac_reset(struct cmac *mac) | |||
| 124 | xaui_serdes_reset(mac); | 125 | xaui_serdes_reset(mac); |
| 125 | } | 126 | } |
| 126 | 127 | ||
| 127 | val = F_MAC_RESET_; | 128 | t3_set_reg_field(adap, A_XGM_RX_MAX_PKT_SIZE + oft, |
| 129 | V_RXMAXFRAMERSIZE(M_RXMAXFRAMERSIZE), | ||
| 130 | V_RXMAXFRAMERSIZE(MAX_FRAME_SIZE) | F_RXENFRAMER); | ||
| 131 | val = F_MAC_RESET_ | F_XGMAC_STOP_EN; | ||
| 132 | |||
| 128 | if (is_10G(adap)) | 133 | if (is_10G(adap)) |
| 129 | val |= F_PCS_RESET_; | 134 | val |= F_PCS_RESET_; |
| 130 | else if (uses_xaui(adap)) | 135 | else if (uses_xaui(adap)) |
| @@ -313,8 +318,9 @@ static int rx_fifo_hwm(int mtu) | |||
| 313 | 318 | ||
| 314 | int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) | 319 | int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) |
| 315 | { | 320 | { |
| 316 | int hwm, lwm; | 321 | int hwm, lwm, divisor; |
| 317 | unsigned int thres, v; | 322 | int ipg; |
| 323 | unsigned int thres, v, reg; | ||
| 318 | struct adapter *adap = mac->adapter; | 324 | struct adapter *adap = mac->adapter; |
| 319 | 325 | ||
| 320 | /* | 326 | /* |
| @@ -335,27 +341,32 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) | |||
| 335 | hwm = min(hwm, MAC_RXFIFO_SIZE - 8192); | 341 | hwm = min(hwm, MAC_RXFIFO_SIZE - 8192); |
| 336 | lwm = min(3 * (int)mtu, MAC_RXFIFO_SIZE / 4); | 342 | lwm = min(3 * (int)mtu, MAC_RXFIFO_SIZE / 4); |
| 337 | 343 | ||
| 338 | if (adap->params.rev == T3_REV_B2 && | 344 | if (adap->params.rev >= T3_REV_B2 && |
| 339 | (t3_read_reg(adap, A_XGM_RX_CTRL + mac->offset) & F_RXEN)) { | 345 | (t3_read_reg(adap, A_XGM_RX_CTRL + mac->offset) & F_RXEN)) { |
| 340 | disable_exact_filters(mac); | 346 | disable_exact_filters(mac); |
| 341 | v = t3_read_reg(adap, A_XGM_RX_CFG + mac->offset); | 347 | v = t3_read_reg(adap, A_XGM_RX_CFG + mac->offset); |
| 342 | t3_set_reg_field(adap, A_XGM_RX_CFG + mac->offset, | 348 | t3_set_reg_field(adap, A_XGM_RX_CFG + mac->offset, |
| 343 | F_ENHASHMCAST | F_COPYALLFRAMES, F_DISBCAST); | 349 | F_ENHASHMCAST | F_COPYALLFRAMES, F_DISBCAST); |
| 344 | 350 | ||
| 345 | /* drain rx FIFO */ | 351 | reg = adap->params.rev == T3_REV_B2 ? |
| 346 | if (t3_wait_op_done(adap, | 352 | A_XGM_RX_MAX_PKT_SIZE_ERR_CNT : A_XGM_RXFIFO_CFG; |
| 347 | A_XGM_RX_MAX_PKT_SIZE_ERR_CNT + | 353 | |
| 348 | mac->offset, | 354 | /* drain RX FIFO */ |
| 349 | 1 << 31, 1, 20, 5)) { | 355 | if (t3_wait_op_done(adap, reg + mac->offset, |
| 356 | F_RXFIFO_EMPTY, 1, 20, 5)) { | ||
| 350 | t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v); | 357 | t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v); |
| 351 | enable_exact_filters(mac); | 358 | enable_exact_filters(mac); |
| 352 | return -EIO; | 359 | return -EIO; |
| 353 | } | 360 | } |
| 354 | t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu); | 361 | t3_set_reg_field(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, |
| 362 | V_RXMAXPKTSIZE(M_RXMAXPKTSIZE), | ||
| 363 | V_RXMAXPKTSIZE(mtu)); | ||
| 355 | t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v); | 364 | t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v); |
| 356 | enable_exact_filters(mac); | 365 | enable_exact_filters(mac); |
| 357 | } else | 366 | } else |
| 358 | t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu); | 367 | t3_set_reg_field(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, |
| 368 | V_RXMAXPKTSIZE(M_RXMAXPKTSIZE), | ||
| 369 | V_RXMAXPKTSIZE(mtu)); | ||
| 359 | 370 | ||
| 360 | /* | 371 | /* |
| 361 | * Adjust the PAUSE frame watermarks. We always set the LWM, and the | 372 | * Adjust the PAUSE frame watermarks. We always set the LWM, and the |
| @@ -379,13 +390,16 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) | |||
| 379 | thres /= 10; | 390 | thres /= 10; |
| 380 | thres = mtu > thres ? (mtu - thres + 7) / 8 : 0; | 391 | thres = mtu > thres ? (mtu - thres + 7) / 8 : 0; |
| 381 | thres = max(thres, 8U); /* need at least 8 */ | 392 | thres = max(thres, 8U); /* need at least 8 */ |
| 393 | ipg = (adap->params.rev == T3_REV_C) ? 0 : 1; | ||
| 382 | t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + mac->offset, | 394 | t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + mac->offset, |
| 383 | V_TXFIFOTHRESH(M_TXFIFOTHRESH) | V_TXIPG(M_TXIPG), | 395 | V_TXFIFOTHRESH(M_TXFIFOTHRESH) | V_TXIPG(M_TXIPG), |
| 384 | V_TXFIFOTHRESH(thres) | V_TXIPG(1)); | 396 | V_TXFIFOTHRESH(thres) | V_TXIPG(ipg)); |
| 385 | 397 | ||
| 386 | if (adap->params.rev > 0) | 398 | if (adap->params.rev > 0) { |
| 399 | divisor = (adap->params.rev == T3_REV_C) ? 64 : 8; | ||
| 387 | t3_write_reg(adap, A_XGM_PAUSE_TIMER + mac->offset, | 400 | t3_write_reg(adap, A_XGM_PAUSE_TIMER + mac->offset, |
| 388 | (hwm - lwm) * 4 / 8); | 401 | (hwm - lwm) * 4 / divisor); |
| 402 | } | ||
| 389 | t3_write_reg(adap, A_XGM_TX_PAUSE_QUANTA + mac->offset, | 403 | t3_write_reg(adap, A_XGM_TX_PAUSE_QUANTA + mac->offset, |
| 390 | MAC_RXFIFO_SIZE * 4 * 8 / 512); | 404 | MAC_RXFIFO_SIZE * 4 * 8 / 512); |
| 391 | return 0; | 405 | return 0; |
| @@ -522,7 +536,7 @@ int t3b2_mac_watchdog_task(struct cmac *mac) | |||
| 522 | goto rxcheck; | 536 | goto rxcheck; |
| 523 | } | 537 | } |
| 524 | 538 | ||
| 525 | if ((tx_tcnt != mac->tx_tcnt) && (mac->tx_xcnt == 0)) { | 539 | if ((tx_tcnt != mac->tx_tcnt) && (mac->tx_xcnt == 0)) { |
| 526 | if (mac->toggle_cnt > 4) { | 540 | if (mac->toggle_cnt > 4) { |
| 527 | status = 2; | 541 | status = 2; |
| 528 | goto out; | 542 | goto out; |
