diff options
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 67 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.h | 1 |
4 files changed, 58 insertions, 28 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index 98cadb0c4dab..eb26fda63c99 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | |||
@@ -101,7 +101,9 @@ struct ixgbevf_ring { | |||
101 | 101 | ||
102 | /* Supported Rx Buffer Sizes */ | 102 | /* Supported Rx Buffer Sizes */ |
103 | #define IXGBEVF_RXBUFFER_256 256 /* Used for packet split */ | 103 | #define IXGBEVF_RXBUFFER_256 256 /* Used for packet split */ |
104 | #define IXGBEVF_RXBUFFER_2048 2048 | 104 | #define IXGBEVF_RXBUFFER_3K 3072 |
105 | #define IXGBEVF_RXBUFFER_7K 7168 | ||
106 | #define IXGBEVF_RXBUFFER_15K 15360 | ||
105 | #define IXGBEVF_MAX_RXBUFFER 16384 /* largest size for single descriptor */ | 107 | #define IXGBEVF_MAX_RXBUFFER 16384 /* largest size for single descriptor */ |
106 | 108 | ||
107 | #define IXGBEVF_RX_HDR_SIZE IXGBEVF_RXBUFFER_256 | 109 | #define IXGBEVF_RX_HDR_SIZE IXGBEVF_RXBUFFER_256 |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 87f87d81addb..a5d9cc5bb257 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -1057,15 +1057,46 @@ static void ixgbevf_configure_srrctl(struct ixgbevf_adapter *adapter, int index) | |||
1057 | 1057 | ||
1058 | srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; | 1058 | srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; |
1059 | 1059 | ||
1060 | if (rx_ring->rx_buf_len == MAXIMUM_ETHERNET_VLAN_SIZE) | 1060 | srrctl |= ALIGN(rx_ring->rx_buf_len, 1024) >> |
1061 | srrctl |= IXGBEVF_RXBUFFER_2048 >> | 1061 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; |
1062 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; | 1062 | |
1063 | else | ||
1064 | srrctl |= rx_ring->rx_buf_len >> | ||
1065 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; | ||
1066 | IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl); | 1063 | IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl); |
1067 | } | 1064 | } |
1068 | 1065 | ||
1066 | static void ixgbevf_set_rx_buffer_len(struct ixgbevf_adapter *adapter) | ||
1067 | { | ||
1068 | struct ixgbe_hw *hw = &adapter->hw; | ||
1069 | struct net_device *netdev = adapter->netdev; | ||
1070 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1071 | int i; | ||
1072 | u16 rx_buf_len; | ||
1073 | |||
1074 | /* notify the PF of our intent to use this size of frame */ | ||
1075 | ixgbevf_rlpml_set_vf(hw, max_frame); | ||
1076 | |||
1077 | /* PF will allow an extra 4 bytes past for vlan tagged frames */ | ||
1078 | max_frame += VLAN_HLEN; | ||
1079 | |||
1080 | /* | ||
1081 | * Make best use of allocation by using all but 1K of a | ||
1082 | * power of 2 allocation that will be used for skb->head. | ||
1083 | */ | ||
1084 | if ((hw->mac.type == ixgbe_mac_X540_vf) && | ||
1085 | (max_frame <= MAXIMUM_ETHERNET_VLAN_SIZE)) | ||
1086 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; | ||
1087 | else if (max_frame <= IXGBEVF_RXBUFFER_3K) | ||
1088 | rx_buf_len = IXGBEVF_RXBUFFER_3K; | ||
1089 | else if (max_frame <= IXGBEVF_RXBUFFER_7K) | ||
1090 | rx_buf_len = IXGBEVF_RXBUFFER_7K; | ||
1091 | else if (max_frame <= IXGBEVF_RXBUFFER_15K) | ||
1092 | rx_buf_len = IXGBEVF_RXBUFFER_15K; | ||
1093 | else | ||
1094 | rx_buf_len = IXGBEVF_MAX_RXBUFFER; | ||
1095 | |||
1096 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
1097 | adapter->rx_ring[i].rx_buf_len = rx_buf_len; | ||
1098 | } | ||
1099 | |||
1069 | /** | 1100 | /** |
1070 | * ixgbevf_configure_rx - Configure 82599 VF Receive Unit after Reset | 1101 | * ixgbevf_configure_rx - Configure 82599 VF Receive Unit after Reset |
1071 | * @adapter: board private structure | 1102 | * @adapter: board private structure |
@@ -1076,18 +1107,14 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter) | |||
1076 | { | 1107 | { |
1077 | u64 rdba; | 1108 | u64 rdba; |
1078 | struct ixgbe_hw *hw = &adapter->hw; | 1109 | struct ixgbe_hw *hw = &adapter->hw; |
1079 | struct net_device *netdev = adapter->netdev; | ||
1080 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1081 | int i, j; | 1110 | int i, j; |
1082 | u32 rdlen; | 1111 | u32 rdlen; |
1083 | int rx_buf_len; | ||
1084 | 1112 | ||
1085 | /* PSRTYPE must be initialized in 82599 */ | 1113 | /* PSRTYPE must be initialized in 82599 */ |
1086 | IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); | 1114 | IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); |
1087 | if (netdev->mtu <= ETH_DATA_LEN) | 1115 | |
1088 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; | 1116 | /* set_rx_buffer_len must be called before ring initialization */ |
1089 | else | 1117 | ixgbevf_set_rx_buffer_len(adapter); |
1090 | rx_buf_len = ALIGN(max_frame, 1024); | ||
1091 | 1118 | ||
1092 | rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); | 1119 | rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); |
1093 | /* Setup the HW Rx Head and Tail Descriptor Pointers and | 1120 | /* Setup the HW Rx Head and Tail Descriptor Pointers and |
@@ -1103,7 +1130,6 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter) | |||
1103 | IXGBE_WRITE_REG(hw, IXGBE_VFRDT(j), 0); | 1130 | IXGBE_WRITE_REG(hw, IXGBE_VFRDT(j), 0); |
1104 | adapter->rx_ring[i].head = IXGBE_VFRDH(j); | 1131 | adapter->rx_ring[i].head = IXGBE_VFRDH(j); |
1105 | adapter->rx_ring[i].tail = IXGBE_VFRDT(j); | 1132 | adapter->rx_ring[i].tail = IXGBE_VFRDT(j); |
1106 | adapter->rx_ring[i].rx_buf_len = rx_buf_len; | ||
1107 | 1133 | ||
1108 | ixgbevf_configure_srrctl(adapter, j); | 1134 | ixgbevf_configure_srrctl(adapter, j); |
1109 | } | 1135 | } |
@@ -1315,7 +1341,6 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | |||
1315 | int i, j = 0; | 1341 | int i, j = 0; |
1316 | int num_rx_rings = adapter->num_rx_queues; | 1342 | int num_rx_rings = adapter->num_rx_queues; |
1317 | u32 txdctl, rxdctl; | 1343 | u32 txdctl, rxdctl; |
1318 | u32 msg[2]; | ||
1319 | 1344 | ||
1320 | for (i = 0; i < adapter->num_tx_queues; i++) { | 1345 | for (i = 0; i < adapter->num_tx_queues; i++) { |
1321 | j = adapter->tx_ring[i].reg_idx; | 1346 | j = adapter->tx_ring[i].reg_idx; |
@@ -1356,10 +1381,6 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | |||
1356 | hw->mac.ops.set_rar(hw, 0, hw->mac.perm_addr, 0); | 1381 | hw->mac.ops.set_rar(hw, 0, hw->mac.perm_addr, 0); |
1357 | } | 1382 | } |
1358 | 1383 | ||
1359 | msg[0] = IXGBE_VF_SET_LPE; | ||
1360 | msg[1] = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1361 | hw->mbx.ops.write_posted(hw, msg, 2); | ||
1362 | |||
1363 | spin_unlock(&adapter->mbx_lock); | 1384 | spin_unlock(&adapter->mbx_lock); |
1364 | 1385 | ||
1365 | clear_bit(__IXGBEVF_DOWN, &adapter->state); | 1386 | clear_bit(__IXGBEVF_DOWN, &adapter->state); |
@@ -2876,10 +2897,8 @@ static int ixgbevf_set_mac(struct net_device *netdev, void *p) | |||
2876 | static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) | 2897 | static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) |
2877 | { | 2898 | { |
2878 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); | 2899 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); |
2879 | struct ixgbe_hw *hw = &adapter->hw; | ||
2880 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 2900 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; |
2881 | int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE; | 2901 | int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE; |
2882 | u32 msg[2]; | ||
2883 | 2902 | ||
2884 | if (adapter->hw.mac.type == ixgbe_mac_X540_vf) | 2903 | if (adapter->hw.mac.type == ixgbe_mac_X540_vf) |
2885 | max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE; | 2904 | max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE; |
@@ -2893,12 +2912,6 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) | |||
2893 | /* must set new MTU before calling down or up */ | 2912 | /* must set new MTU before calling down or up */ |
2894 | netdev->mtu = new_mtu; | 2913 | netdev->mtu = new_mtu; |
2895 | 2914 | ||
2896 | if (!netif_running(netdev)) { | ||
2897 | msg[0] = IXGBE_VF_SET_LPE; | ||
2898 | msg[1] = max_frame; | ||
2899 | hw->mbx.ops.write_posted(hw, msg, 2); | ||
2900 | } | ||
2901 | |||
2902 | if (netif_running(netdev)) | 2915 | if (netif_running(netdev)) |
2903 | ixgbevf_reinit_locked(adapter); | 2916 | ixgbevf_reinit_locked(adapter); |
2904 | 2917 | ||
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c index ec89b86f7ca4..3d555a10f592 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.c +++ b/drivers/net/ethernet/intel/ixgbevf/vf.c | |||
@@ -419,6 +419,20 @@ static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw, | |||
419 | return 0; | 419 | return 0; |
420 | } | 420 | } |
421 | 421 | ||
422 | /** | ||
423 | * ixgbevf_rlpml_set_vf - Set the maximum receive packet length | ||
424 | * @hw: pointer to the HW structure | ||
425 | * @max_size: value to assign to max frame size | ||
426 | **/ | ||
427 | void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size) | ||
428 | { | ||
429 | u32 msgbuf[2]; | ||
430 | |||
431 | msgbuf[0] = IXGBE_VF_SET_LPE; | ||
432 | msgbuf[1] = max_size; | ||
433 | ixgbevf_write_msg_read_ack(hw, msgbuf, 2); | ||
434 | } | ||
435 | |||
422 | static const struct ixgbe_mac_operations ixgbevf_mac_ops = { | 436 | static const struct ixgbe_mac_operations ixgbevf_mac_ops = { |
423 | .init_hw = ixgbevf_init_hw_vf, | 437 | .init_hw = ixgbevf_init_hw_vf, |
424 | .reset_hw = ixgbevf_reset_hw_vf, | 438 | .reset_hw = ixgbevf_reset_hw_vf, |
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h index 25c951daee5d..07fd87688e35 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.h +++ b/drivers/net/ethernet/intel/ixgbevf/vf.h | |||
@@ -170,5 +170,6 @@ struct ixgbevf_info { | |||
170 | const struct ixgbe_mac_operations *mac_ops; | 170 | const struct ixgbe_mac_operations *mac_ops; |
171 | }; | 171 | }; |
172 | 172 | ||
173 | void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size); | ||
173 | #endif /* __IXGBE_VF_H__ */ | 174 | #endif /* __IXGBE_VF_H__ */ |
174 | 175 | ||