|
@@ -798,29 +798,15 @@ static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port)
|
|
|
hw->chip_rev != CHIP_REV_YU_EX_A0) ||
|
|
|
hw->chip_id >= CHIP_ID_YUKON_FE_P) {
|
|
|
/* Yukon-Extreme B0 and further Extreme devices */
|
|
|
- /* enable Store & Forward mode for TX */
|
|
|
+ sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_ENA);
|
|
|
+ } else if (dev->mtu > ETH_DATA_LEN) {
|
|
|
+ /* set Tx GMAC FIFO Almost Empty Threshold */
|
|
|
+ sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR),
|
|
|
+ (ECU_JUMBO_WM << 16) | ECU_AE_THR);
|
|
|
|
|
|
- if (dev->mtu <= ETH_DATA_LEN)
|
|
|
- sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T),
|
|
|
- TX_JUMBO_DIS | TX_STFW_ENA);
|
|
|
-
|
|
|
- else
|
|
|
- sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T),
|
|
|
- TX_JUMBO_ENA| TX_STFW_ENA);
|
|
|
- } else {
|
|
|
- if (dev->mtu <= ETH_DATA_LEN)
|
|
|
- sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_ENA);
|
|
|
- else {
|
|
|
- /* set Tx GMAC FIFO Almost Empty Threshold */
|
|
|
- sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR),
|
|
|
- (ECU_JUMBO_WM << 16) | ECU_AE_THR);
|
|
|
-
|
|
|
- sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_DIS);
|
|
|
-
|
|
|
- /* Can't do offload because of lack of store/forward */
|
|
|
- dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | NETIF_F_ALL_CSUM);
|
|
|
- }
|
|
|
- }
|
|
|
+ sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_DIS);
|
|
|
+ } else
|
|
|
+ sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_ENA);
|
|
|
}
|
|
|
|
|
|
static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
|
|
@@ -2206,14 +2192,20 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu)
|
|
|
u16 ctl, mode;
|
|
|
u32 imask;
|
|
|
|
|
|
+ /* MTU size outside the spec */
|
|
|
if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ /* MTU > 1500 on yukon FE and FE+ not allowed */
|
|
|
if (new_mtu > ETH_DATA_LEN &&
|
|
|
(hw->chip_id == CHIP_ID_YUKON_FE ||
|
|
|
hw->chip_id == CHIP_ID_YUKON_FE_P))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ /* TSO, etc on Yukon Ultra and MTU > 1500 not supported */
|
|
|
+ if (new_mtu > ETH_DATA_LEN && hw->chip_id == CHIP_ID_YUKON_EC_U)
|
|
|
+ dev->features &= ~(NETIF_F_TSO|NETIF_F_SG|NETIF_F_ALL_CSUM);
|
|
|
+
|
|
|
if (!netif_running(dev)) {
|
|
|
dev->mtu = new_mtu;
|
|
|
return 0;
|