.. | .. |
---|
136 | 136 | static const char ixgbe_priv_flags_strings[][ETH_GSTRING_LEN] = { |
---|
137 | 137 | #define IXGBE_PRIV_FLAGS_LEGACY_RX BIT(0) |
---|
138 | 138 | "legacy-rx", |
---|
| 139 | +#define IXGBE_PRIV_FLAGS_VF_IPSEC_EN BIT(1) |
---|
| 140 | + "vf-ipsec", |
---|
139 | 141 | }; |
---|
140 | 142 | |
---|
141 | 143 | #define IXGBE_PRIV_FLAGS_STR_LEN ARRAY_SIZE(ixgbe_priv_flags_strings) |
---|
142 | 144 | |
---|
143 | | -/* currently supported speeds for 10G */ |
---|
144 | | -#define ADVRTSD_MSK_10G (SUPPORTED_10000baseT_Full | \ |
---|
145 | | - SUPPORTED_10000baseKX4_Full | \ |
---|
146 | | - SUPPORTED_10000baseKR_Full) |
---|
147 | | - |
---|
148 | 145 | #define ixgbe_isbackplane(type) ((type) == ixgbe_media_type_backplane) |
---|
149 | 146 | |
---|
150 | | -static u32 ixgbe_get_supported_10gtypes(struct ixgbe_hw *hw) |
---|
| 147 | +static void ixgbe_set_supported_10gtypes(struct ixgbe_hw *hw, |
---|
| 148 | + struct ethtool_link_ksettings *cmd) |
---|
151 | 149 | { |
---|
152 | | - if (!ixgbe_isbackplane(hw->phy.media_type)) |
---|
153 | | - return SUPPORTED_10000baseT_Full; |
---|
| 150 | + if (!ixgbe_isbackplane(hw->phy.media_type)) { |
---|
| 151 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 152 | + 10000baseT_Full); |
---|
| 153 | + return; |
---|
| 154 | + } |
---|
154 | 155 | |
---|
155 | 156 | switch (hw->device_id) { |
---|
156 | 157 | case IXGBE_DEV_ID_82598: |
---|
157 | 158 | case IXGBE_DEV_ID_82599_KX4: |
---|
158 | 159 | case IXGBE_DEV_ID_82599_KX4_MEZZ: |
---|
159 | 160 | case IXGBE_DEV_ID_X550EM_X_KX4: |
---|
160 | | - return SUPPORTED_10000baseKX4_Full; |
---|
| 161 | + ethtool_link_ksettings_add_link_mode |
---|
| 162 | + (cmd, supported, 10000baseKX4_Full); |
---|
| 163 | + break; |
---|
161 | 164 | case IXGBE_DEV_ID_82598_BX: |
---|
162 | 165 | case IXGBE_DEV_ID_82599_KR: |
---|
163 | 166 | case IXGBE_DEV_ID_X550EM_X_KR: |
---|
164 | 167 | case IXGBE_DEV_ID_X550EM_X_XFI: |
---|
165 | | - return SUPPORTED_10000baseKR_Full; |
---|
| 168 | + ethtool_link_ksettings_add_link_mode |
---|
| 169 | + (cmd, supported, 10000baseKR_Full); |
---|
| 170 | + break; |
---|
166 | 171 | default: |
---|
167 | | - return SUPPORTED_10000baseKX4_Full | |
---|
168 | | - SUPPORTED_10000baseKR_Full; |
---|
| 172 | + ethtool_link_ksettings_add_link_mode |
---|
| 173 | + (cmd, supported, 10000baseKX4_Full); |
---|
| 174 | + ethtool_link_ksettings_add_link_mode |
---|
| 175 | + (cmd, supported, 10000baseKR_Full); |
---|
| 176 | + break; |
---|
| 177 | + } |
---|
| 178 | +} |
---|
| 179 | + |
---|
| 180 | +static void ixgbe_set_advertising_10gtypes(struct ixgbe_hw *hw, |
---|
| 181 | + struct ethtool_link_ksettings *cmd) |
---|
| 182 | +{ |
---|
| 183 | + if (!ixgbe_isbackplane(hw->phy.media_type)) { |
---|
| 184 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 185 | + 10000baseT_Full); |
---|
| 186 | + return; |
---|
| 187 | + } |
---|
| 188 | + |
---|
| 189 | + switch (hw->device_id) { |
---|
| 190 | + case IXGBE_DEV_ID_82598: |
---|
| 191 | + case IXGBE_DEV_ID_82599_KX4: |
---|
| 192 | + case IXGBE_DEV_ID_82599_KX4_MEZZ: |
---|
| 193 | + case IXGBE_DEV_ID_X550EM_X_KX4: |
---|
| 194 | + ethtool_link_ksettings_add_link_mode |
---|
| 195 | + (cmd, advertising, 10000baseKX4_Full); |
---|
| 196 | + break; |
---|
| 197 | + case IXGBE_DEV_ID_82598_BX: |
---|
| 198 | + case IXGBE_DEV_ID_82599_KR: |
---|
| 199 | + case IXGBE_DEV_ID_X550EM_X_KR: |
---|
| 200 | + case IXGBE_DEV_ID_X550EM_X_XFI: |
---|
| 201 | + ethtool_link_ksettings_add_link_mode |
---|
| 202 | + (cmd, advertising, 10000baseKR_Full); |
---|
| 203 | + break; |
---|
| 204 | + default: |
---|
| 205 | + ethtool_link_ksettings_add_link_mode |
---|
| 206 | + (cmd, advertising, 10000baseKX4_Full); |
---|
| 207 | + ethtool_link_ksettings_add_link_mode |
---|
| 208 | + (cmd, advertising, 10000baseKR_Full); |
---|
| 209 | + break; |
---|
169 | 210 | } |
---|
170 | 211 | } |
---|
171 | 212 | |
---|
.. | .. |
---|
176 | 217 | struct ixgbe_hw *hw = &adapter->hw; |
---|
177 | 218 | ixgbe_link_speed supported_link; |
---|
178 | 219 | bool autoneg = false; |
---|
179 | | - u32 supported, advertising; |
---|
180 | 220 | |
---|
181 | | - ethtool_convert_link_mode_to_legacy_u32(&supported, |
---|
182 | | - cmd->link_modes.supported); |
---|
| 221 | + ethtool_link_ksettings_zero_link_mode(cmd, supported); |
---|
| 222 | + ethtool_link_ksettings_zero_link_mode(cmd, advertising); |
---|
183 | 223 | |
---|
184 | 224 | hw->mac.ops.get_link_capabilities(hw, &supported_link, &autoneg); |
---|
185 | 225 | |
---|
186 | 226 | /* set the supported link speeds */ |
---|
187 | | - if (supported_link & IXGBE_LINK_SPEED_10GB_FULL) |
---|
188 | | - supported |= ixgbe_get_supported_10gtypes(hw); |
---|
189 | | - if (supported_link & IXGBE_LINK_SPEED_1GB_FULL) |
---|
190 | | - supported |= (ixgbe_isbackplane(hw->phy.media_type)) ? |
---|
191 | | - SUPPORTED_1000baseKX_Full : |
---|
192 | | - SUPPORTED_1000baseT_Full; |
---|
193 | | - if (supported_link & IXGBE_LINK_SPEED_100_FULL) |
---|
194 | | - supported |= SUPPORTED_100baseT_Full; |
---|
195 | | - if (supported_link & IXGBE_LINK_SPEED_10_FULL) |
---|
196 | | - supported |= SUPPORTED_10baseT_Full; |
---|
| 227 | + if (supported_link & IXGBE_LINK_SPEED_10GB_FULL) { |
---|
| 228 | + ixgbe_set_supported_10gtypes(hw, cmd); |
---|
| 229 | + ixgbe_set_advertising_10gtypes(hw, cmd); |
---|
| 230 | + } |
---|
| 231 | + if (supported_link & IXGBE_LINK_SPEED_5GB_FULL) |
---|
| 232 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 233 | + 5000baseT_Full); |
---|
197 | 234 | |
---|
198 | | - /* default advertised speed if phy.autoneg_advertised isn't set */ |
---|
199 | | - advertising = supported; |
---|
| 235 | + if (supported_link & IXGBE_LINK_SPEED_2_5GB_FULL) |
---|
| 236 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 237 | + 2500baseT_Full); |
---|
| 238 | + |
---|
| 239 | + if (supported_link & IXGBE_LINK_SPEED_1GB_FULL) { |
---|
| 240 | + if (ixgbe_isbackplane(hw->phy.media_type)) { |
---|
| 241 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 242 | + 1000baseKX_Full); |
---|
| 243 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 244 | + 1000baseKX_Full); |
---|
| 245 | + } else { |
---|
| 246 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 247 | + 1000baseT_Full); |
---|
| 248 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 249 | + 1000baseT_Full); |
---|
| 250 | + } |
---|
| 251 | + } |
---|
| 252 | + if (supported_link & IXGBE_LINK_SPEED_100_FULL) { |
---|
| 253 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 254 | + 100baseT_Full); |
---|
| 255 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 256 | + 100baseT_Full); |
---|
| 257 | + } |
---|
| 258 | + if (supported_link & IXGBE_LINK_SPEED_10_FULL) { |
---|
| 259 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 260 | + 10baseT_Full); |
---|
| 261 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 262 | + 10baseT_Full); |
---|
| 263 | + } |
---|
| 264 | + |
---|
200 | 265 | /* set the advertised speeds */ |
---|
201 | 266 | if (hw->phy.autoneg_advertised) { |
---|
202 | | - advertising = 0; |
---|
| 267 | + ethtool_link_ksettings_zero_link_mode(cmd, advertising); |
---|
203 | 268 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10_FULL) |
---|
204 | | - advertising |= ADVERTISED_10baseT_Full; |
---|
| 269 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 270 | + 10baseT_Full); |
---|
205 | 271 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) |
---|
206 | | - advertising |= ADVERTISED_100baseT_Full; |
---|
| 272 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 273 | + 100baseT_Full); |
---|
207 | 274 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) |
---|
208 | | - advertising |= supported & ADVRTSD_MSK_10G; |
---|
| 275 | + ixgbe_set_advertising_10gtypes(hw, cmd); |
---|
209 | 276 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) { |
---|
210 | | - if (supported & SUPPORTED_1000baseKX_Full) |
---|
211 | | - advertising |= ADVERTISED_1000baseKX_Full; |
---|
| 277 | + if (ethtool_link_ksettings_test_link_mode |
---|
| 278 | + (cmd, supported, 1000baseKX_Full)) |
---|
| 279 | + ethtool_link_ksettings_add_link_mode |
---|
| 280 | + (cmd, advertising, 1000baseKX_Full); |
---|
212 | 281 | else |
---|
213 | | - advertising |= ADVERTISED_1000baseT_Full; |
---|
| 282 | + ethtool_link_ksettings_add_link_mode |
---|
| 283 | + (cmd, advertising, 1000baseT_Full); |
---|
214 | 284 | } |
---|
| 285 | + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) |
---|
| 286 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 287 | + 5000baseT_Full); |
---|
| 288 | + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL) |
---|
| 289 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 290 | + 2500baseT_Full); |
---|
215 | 291 | } else { |
---|
216 | 292 | if (hw->phy.multispeed_fiber && !autoneg) { |
---|
217 | 293 | if (supported_link & IXGBE_LINK_SPEED_10GB_FULL) |
---|
218 | | - advertising = ADVERTISED_10000baseT_Full; |
---|
| 294 | + ethtool_link_ksettings_add_link_mode |
---|
| 295 | + (cmd, advertising, 10000baseT_Full); |
---|
219 | 296 | } |
---|
220 | 297 | } |
---|
221 | 298 | |
---|
222 | 299 | if (autoneg) { |
---|
223 | | - supported |= SUPPORTED_Autoneg; |
---|
224 | | - advertising |= ADVERTISED_Autoneg; |
---|
| 300 | + ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg); |
---|
| 301 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg); |
---|
225 | 302 | cmd->base.autoneg = AUTONEG_ENABLE; |
---|
226 | 303 | } else |
---|
227 | 304 | cmd->base.autoneg = AUTONEG_DISABLE; |
---|
.. | .. |
---|
233 | 310 | case ixgbe_phy_x550em_ext_t: |
---|
234 | 311 | case ixgbe_phy_fw: |
---|
235 | 312 | case ixgbe_phy_cu_unknown: |
---|
236 | | - supported |= SUPPORTED_TP; |
---|
237 | | - advertising |= ADVERTISED_TP; |
---|
| 313 | + ethtool_link_ksettings_add_link_mode(cmd, supported, TP); |
---|
| 314 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, TP); |
---|
238 | 315 | cmd->base.port = PORT_TP; |
---|
239 | 316 | break; |
---|
240 | 317 | case ixgbe_phy_qt: |
---|
241 | | - supported |= SUPPORTED_FIBRE; |
---|
242 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 318 | + ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); |
---|
| 319 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE); |
---|
243 | 320 | cmd->base.port = PORT_FIBRE; |
---|
244 | 321 | break; |
---|
245 | 322 | case ixgbe_phy_nl: |
---|
.. | .. |
---|
258 | 335 | case ixgbe_sfp_type_da_cu: |
---|
259 | 336 | case ixgbe_sfp_type_da_cu_core0: |
---|
260 | 337 | case ixgbe_sfp_type_da_cu_core1: |
---|
261 | | - supported |= SUPPORTED_FIBRE; |
---|
262 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 338 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 339 | + FIBRE); |
---|
| 340 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 341 | + FIBRE); |
---|
263 | 342 | cmd->base.port = PORT_DA; |
---|
264 | 343 | break; |
---|
265 | 344 | case ixgbe_sfp_type_sr: |
---|
.. | .. |
---|
270 | 349 | case ixgbe_sfp_type_1g_sx_core1: |
---|
271 | 350 | case ixgbe_sfp_type_1g_lx_core0: |
---|
272 | 351 | case ixgbe_sfp_type_1g_lx_core1: |
---|
273 | | - supported |= SUPPORTED_FIBRE; |
---|
274 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 352 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 353 | + FIBRE); |
---|
| 354 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 355 | + FIBRE); |
---|
275 | 356 | cmd->base.port = PORT_FIBRE; |
---|
276 | 357 | break; |
---|
277 | 358 | case ixgbe_sfp_type_not_present: |
---|
278 | | - supported |= SUPPORTED_FIBRE; |
---|
279 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 359 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 360 | + FIBRE); |
---|
| 361 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 362 | + FIBRE); |
---|
280 | 363 | cmd->base.port = PORT_NONE; |
---|
281 | 364 | break; |
---|
282 | 365 | case ixgbe_sfp_type_1g_cu_core0: |
---|
283 | 366 | case ixgbe_sfp_type_1g_cu_core1: |
---|
284 | | - supported |= SUPPORTED_TP; |
---|
285 | | - advertising |= ADVERTISED_TP; |
---|
| 367 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 368 | + TP); |
---|
| 369 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 370 | + TP); |
---|
286 | 371 | cmd->base.port = PORT_TP; |
---|
287 | 372 | break; |
---|
288 | 373 | case ixgbe_sfp_type_unknown: |
---|
289 | 374 | default: |
---|
290 | | - supported |= SUPPORTED_FIBRE; |
---|
291 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 375 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 376 | + FIBRE); |
---|
| 377 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 378 | + FIBRE); |
---|
292 | 379 | cmd->base.port = PORT_OTHER; |
---|
293 | 380 | break; |
---|
294 | 381 | } |
---|
295 | 382 | break; |
---|
296 | 383 | case ixgbe_phy_xaui: |
---|
297 | | - supported |= SUPPORTED_FIBRE; |
---|
298 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 384 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 385 | + FIBRE); |
---|
| 386 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 387 | + FIBRE); |
---|
299 | 388 | cmd->base.port = PORT_NONE; |
---|
300 | 389 | break; |
---|
301 | 390 | case ixgbe_phy_unknown: |
---|
302 | 391 | case ixgbe_phy_generic: |
---|
303 | 392 | case ixgbe_phy_sfp_unsupported: |
---|
304 | 393 | default: |
---|
305 | | - supported |= SUPPORTED_FIBRE; |
---|
306 | | - advertising |= ADVERTISED_FIBRE; |
---|
| 394 | + ethtool_link_ksettings_add_link_mode(cmd, supported, |
---|
| 395 | + FIBRE); |
---|
| 396 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 397 | + FIBRE); |
---|
307 | 398 | cmd->base.port = PORT_OTHER; |
---|
308 | 399 | break; |
---|
309 | 400 | } |
---|
310 | 401 | |
---|
311 | 402 | /* Indicate pause support */ |
---|
312 | | - supported |= SUPPORTED_Pause; |
---|
| 403 | + ethtool_link_ksettings_add_link_mode(cmd, supported, Pause); |
---|
313 | 404 | |
---|
314 | 405 | switch (hw->fc.requested_mode) { |
---|
315 | 406 | case ixgbe_fc_full: |
---|
316 | | - advertising |= ADVERTISED_Pause; |
---|
| 407 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); |
---|
317 | 408 | break; |
---|
318 | 409 | case ixgbe_fc_rx_pause: |
---|
319 | | - advertising |= ADVERTISED_Pause | |
---|
320 | | - ADVERTISED_Asym_Pause; |
---|
| 410 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); |
---|
| 411 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 412 | + Asym_Pause); |
---|
321 | 413 | break; |
---|
322 | 414 | case ixgbe_fc_tx_pause: |
---|
323 | | - advertising |= ADVERTISED_Asym_Pause; |
---|
| 415 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, |
---|
| 416 | + Asym_Pause); |
---|
324 | 417 | break; |
---|
325 | 418 | default: |
---|
326 | | - advertising &= ~(ADVERTISED_Pause | |
---|
327 | | - ADVERTISED_Asym_Pause); |
---|
| 419 | + ethtool_link_ksettings_del_link_mode(cmd, advertising, Pause); |
---|
| 420 | + ethtool_link_ksettings_del_link_mode(cmd, advertising, |
---|
| 421 | + Asym_Pause); |
---|
328 | 422 | } |
---|
329 | 423 | |
---|
330 | 424 | if (netif_carrier_ok(netdev)) { |
---|
.. | .. |
---|
356 | 450 | cmd->base.duplex = DUPLEX_UNKNOWN; |
---|
357 | 451 | } |
---|
358 | 452 | |
---|
359 | | - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, |
---|
360 | | - supported); |
---|
361 | | - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, |
---|
362 | | - advertising); |
---|
363 | | - |
---|
364 | 453 | return 0; |
---|
365 | 454 | } |
---|
366 | 455 | |
---|
.. | .. |
---|
371 | 460 | struct ixgbe_hw *hw = &adapter->hw; |
---|
372 | 461 | u32 advertised, old; |
---|
373 | 462 | s32 err = 0; |
---|
374 | | - u32 supported, advertising; |
---|
375 | | - |
---|
376 | | - ethtool_convert_link_mode_to_legacy_u32(&supported, |
---|
377 | | - cmd->link_modes.supported); |
---|
378 | | - ethtool_convert_link_mode_to_legacy_u32(&advertising, |
---|
379 | | - cmd->link_modes.advertising); |
---|
380 | 463 | |
---|
381 | 464 | if ((hw->phy.media_type == ixgbe_media_type_copper) || |
---|
382 | 465 | (hw->phy.multispeed_fiber)) { |
---|
.. | .. |
---|
384 | 467 | * this function does not support duplex forcing, but can |
---|
385 | 468 | * limit the advertising of the adapter to the specified speed |
---|
386 | 469 | */ |
---|
387 | | - if (advertising & ~supported) |
---|
| 470 | + if (!bitmap_subset(cmd->link_modes.advertising, |
---|
| 471 | + cmd->link_modes.supported, |
---|
| 472 | + __ETHTOOL_LINK_MODE_MASK_NBITS)) |
---|
388 | 473 | return -EINVAL; |
---|
389 | 474 | |
---|
390 | 475 | /* only allow one speed at a time if no autoneg */ |
---|
391 | 476 | if (!cmd->base.autoneg && hw->phy.multispeed_fiber) { |
---|
392 | | - if (advertising == |
---|
393 | | - (ADVERTISED_10000baseT_Full | |
---|
394 | | - ADVERTISED_1000baseT_Full)) |
---|
| 477 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 478 | + 10000baseT_Full) && |
---|
| 479 | + ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 480 | + 1000baseT_Full)) |
---|
395 | 481 | return -EINVAL; |
---|
396 | 482 | } |
---|
397 | 483 | |
---|
398 | 484 | old = hw->phy.autoneg_advertised; |
---|
399 | 485 | advertised = 0; |
---|
400 | | - if (advertising & ADVERTISED_10000baseT_Full) |
---|
| 486 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 487 | + 10000baseT_Full)) |
---|
401 | 488 | advertised |= IXGBE_LINK_SPEED_10GB_FULL; |
---|
402 | | - |
---|
403 | | - if (advertising & ADVERTISED_1000baseT_Full) |
---|
| 489 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 490 | + 5000baseT_Full)) |
---|
| 491 | + advertised |= IXGBE_LINK_SPEED_5GB_FULL; |
---|
| 492 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 493 | + 2500baseT_Full)) |
---|
| 494 | + advertised |= IXGBE_LINK_SPEED_2_5GB_FULL; |
---|
| 495 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 496 | + 1000baseT_Full)) |
---|
404 | 497 | advertised |= IXGBE_LINK_SPEED_1GB_FULL; |
---|
405 | 498 | |
---|
406 | | - if (advertising & ADVERTISED_100baseT_Full) |
---|
| 499 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 500 | + 100baseT_Full)) |
---|
407 | 501 | advertised |= IXGBE_LINK_SPEED_100_FULL; |
---|
408 | 502 | |
---|
409 | | - if (advertising & ADVERTISED_10baseT_Full) |
---|
| 503 | + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 504 | + 10baseT_Full)) |
---|
410 | 505 | advertised |= IXGBE_LINK_SPEED_10_FULL; |
---|
411 | 506 | |
---|
412 | 507 | if (old == advertised) |
---|
.. | .. |
---|
427 | 522 | u32 speed = cmd->base.speed; |
---|
428 | 523 | |
---|
429 | 524 | if ((cmd->base.autoneg == AUTONEG_ENABLE) || |
---|
430 | | - (advertising != ADVERTISED_10000baseT_Full) || |
---|
| 525 | + (!ethtool_link_ksettings_test_link_mode(cmd, advertising, |
---|
| 526 | + 10000baseT_Full)) || |
---|
431 | 527 | (speed + cmd->base.duplex != SPEED_10000 + DUPLEX_FULL)) |
---|
432 | 528 | return -EINVAL; |
---|
433 | 529 | } |
---|
434 | 530 | |
---|
435 | 531 | return err; |
---|
| 532 | +} |
---|
| 533 | + |
---|
| 534 | +static void ixgbe_get_pause_stats(struct net_device *netdev, |
---|
| 535 | + struct ethtool_pause_stats *stats) |
---|
| 536 | +{ |
---|
| 537 | + struct ixgbe_adapter *adapter = netdev_priv(netdev); |
---|
| 538 | + struct ixgbe_hw_stats *hwstats = &adapter->stats; |
---|
| 539 | + |
---|
| 540 | + stats->tx_pause_frames = hwstats->lxontxc + hwstats->lxofftxc; |
---|
| 541 | + stats->rx_pause_frames = hwstats->lxonrxc + hwstats->lxoffrxc; |
---|
436 | 542 | } |
---|
437 | 543 | |
---|
438 | 544 | static void ixgbe_get_pauseparam(struct net_device *netdev, |
---|
.. | .. |
---|
1002 | 1108 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
---|
1003 | 1109 | |
---|
1004 | 1110 | strlcpy(drvinfo->driver, ixgbe_driver_name, sizeof(drvinfo->driver)); |
---|
1005 | | - strlcpy(drvinfo->version, ixgbe_driver_version, |
---|
1006 | | - sizeof(drvinfo->version)); |
---|
1007 | 1111 | |
---|
1008 | 1112 | strlcpy(drvinfo->fw_version, adapter->eeprom_id, |
---|
1009 | 1113 | sizeof(drvinfo->fw_version)); |
---|
.. | .. |
---|
1857 | 1961 | memset(skb->data, 0xFF, frame_size); |
---|
1858 | 1962 | frame_size >>= 1; |
---|
1859 | 1963 | memset(&skb->data[frame_size], 0xAA, frame_size / 2 - 1); |
---|
1860 | | - memset(&skb->data[frame_size + 10], 0xBE, 1); |
---|
1861 | | - memset(&skb->data[frame_size + 12], 0xAF, 1); |
---|
| 1964 | + skb->data[frame_size + 10] = 0xBE; |
---|
| 1965 | + skb->data[frame_size + 12] = 0xAF; |
---|
1862 | 1966 | } |
---|
1863 | 1967 | |
---|
1864 | 1968 | static bool ixgbe_check_lbtest_frame(struct ixgbe_rx_buffer *rx_buffer, |
---|
.. | .. |
---|
2084 | 2188 | eth_test->flags |= ETH_TEST_FL_FAILED; |
---|
2085 | 2189 | clear_bit(__IXGBE_TESTING, |
---|
2086 | 2190 | &adapter->state); |
---|
2087 | | - goto skip_ol_tests; |
---|
| 2191 | + return; |
---|
2088 | 2192 | } |
---|
2089 | 2193 | } |
---|
2090 | 2194 | } |
---|
.. | .. |
---|
2156 | 2260 | |
---|
2157 | 2261 | clear_bit(__IXGBE_TESTING, &adapter->state); |
---|
2158 | 2262 | } |
---|
2159 | | - |
---|
2160 | | -skip_ol_tests: |
---|
2161 | | - msleep_interruptible(4 * 1000); |
---|
2162 | 2263 | } |
---|
2163 | 2264 | |
---|
2164 | 2265 | static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter, |
---|
.. | .. |
---|
2204 | 2305 | { |
---|
2205 | 2306 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
---|
2206 | 2307 | |
---|
2207 | | - if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) |
---|
| 2308 | + if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE | |
---|
| 2309 | + WAKE_FILTER)) |
---|
2208 | 2310 | return -EOPNOTSUPP; |
---|
2209 | 2311 | |
---|
2210 | 2312 | if (ixgbe_wol_exclusion(adapter, wol)) |
---|
.. | .. |
---|
2506 | 2608 | switch (cmd->flow_type) { |
---|
2507 | 2609 | case TCP_V4_FLOW: |
---|
2508 | 2610 | cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
---|
2509 | | - /* fallthrough */ |
---|
| 2611 | + fallthrough; |
---|
2510 | 2612 | case UDP_V4_FLOW: |
---|
2511 | 2613 | if (adapter->flags2 & IXGBE_FLAG2_RSS_FIELD_IPV4_UDP) |
---|
2512 | 2614 | cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
---|
2513 | | - /* fallthrough */ |
---|
| 2615 | + fallthrough; |
---|
2514 | 2616 | case SCTP_V4_FLOW: |
---|
2515 | 2617 | case AH_ESP_V4_FLOW: |
---|
2516 | 2618 | case AH_V4_FLOW: |
---|
.. | .. |
---|
2520 | 2622 | break; |
---|
2521 | 2623 | case TCP_V6_FLOW: |
---|
2522 | 2624 | cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
---|
2523 | | - /* fallthrough */ |
---|
| 2625 | + fallthrough; |
---|
2524 | 2626 | case UDP_V6_FLOW: |
---|
2525 | 2627 | if (adapter->flags2 & IXGBE_FLAG2_RSS_FIELD_IPV6_UDP) |
---|
2526 | 2628 | cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
---|
2527 | | - /* fallthrough */ |
---|
| 2629 | + fallthrough; |
---|
2528 | 2630 | case SCTP_V6_FLOW: |
---|
2529 | 2631 | case AH_ESP_V6_FLOW: |
---|
2530 | 2632 | case AH_V6_FLOW: |
---|
.. | .. |
---|
2539 | 2641 | return 0; |
---|
2540 | 2642 | } |
---|
2541 | 2643 | |
---|
| 2644 | +static int ixgbe_rss_indir_tbl_max(struct ixgbe_adapter *adapter) |
---|
| 2645 | +{ |
---|
| 2646 | + if (adapter->hw.mac.type < ixgbe_mac_X550) |
---|
| 2647 | + return 16; |
---|
| 2648 | + else |
---|
| 2649 | + return 64; |
---|
| 2650 | +} |
---|
| 2651 | + |
---|
2542 | 2652 | static int ixgbe_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, |
---|
2543 | 2653 | u32 *rule_locs) |
---|
2544 | 2654 | { |
---|
.. | .. |
---|
2547 | 2657 | |
---|
2548 | 2658 | switch (cmd->cmd) { |
---|
2549 | 2659 | case ETHTOOL_GRXRINGS: |
---|
2550 | | - cmd->data = adapter->num_rx_queues; |
---|
| 2660 | + cmd->data = min_t(int, adapter->num_rx_queues, |
---|
| 2661 | + ixgbe_rss_indir_tbl_max(adapter)); |
---|
2551 | 2662 | ret = 0; |
---|
2552 | 2663 | break; |
---|
2553 | 2664 | case ETHTOOL_GRXCLSRLCNT: |
---|
.. | .. |
---|
2656 | 2767 | *flow_type = IXGBE_ATR_FLOW_TYPE_IPV4; |
---|
2657 | 2768 | break; |
---|
2658 | 2769 | } |
---|
2659 | | - /* fall through */ |
---|
| 2770 | + fallthrough; |
---|
2660 | 2771 | default: |
---|
2661 | 2772 | return 0; |
---|
2662 | 2773 | } |
---|
.. | .. |
---|
2949 | 3060 | return ret; |
---|
2950 | 3061 | } |
---|
2951 | 3062 | |
---|
2952 | | -static int ixgbe_rss_indir_tbl_max(struct ixgbe_adapter *adapter) |
---|
2953 | | -{ |
---|
2954 | | - if (adapter->hw.mac.type < ixgbe_mac_X550) |
---|
2955 | | - return 16; |
---|
2956 | | - else |
---|
2957 | | - return 64; |
---|
2958 | | -} |
---|
2959 | | - |
---|
2960 | 3063 | static u32 ixgbe_get_rxfh_key_size(struct net_device *netdev) |
---|
2961 | 3064 | { |
---|
2962 | 3065 | return IXGBE_RSS_KEY_SIZE; |
---|
.. | .. |
---|
3005 | 3108 | int i; |
---|
3006 | 3109 | u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter); |
---|
3007 | 3110 | |
---|
3008 | | - if (hfunc) |
---|
3009 | | - return -EINVAL; |
---|
| 3111 | + if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) |
---|
| 3112 | + return -EOPNOTSUPP; |
---|
3010 | 3113 | |
---|
3011 | 3114 | /* Fill out the redirection table */ |
---|
3012 | 3115 | if (indir) { |
---|
.. | .. |
---|
3114 | 3217 | max_combined = ixgbe_max_rss_indices(adapter); |
---|
3115 | 3218 | } |
---|
3116 | 3219 | |
---|
3117 | | - return max_combined; |
---|
| 3220 | + return min_t(int, max_combined, num_online_cpus()); |
---|
3118 | 3221 | } |
---|
3119 | 3222 | |
---|
3120 | 3223 | static void ixgbe_get_channels(struct net_device *dev, |
---|
.. | .. |
---|
3410 | 3513 | if (adapter->flags2 & IXGBE_FLAG2_RX_LEGACY) |
---|
3411 | 3514 | priv_flags |= IXGBE_PRIV_FLAGS_LEGACY_RX; |
---|
3412 | 3515 | |
---|
| 3516 | + if (adapter->flags2 & IXGBE_FLAG2_VF_IPSEC_ENABLED) |
---|
| 3517 | + priv_flags |= IXGBE_PRIV_FLAGS_VF_IPSEC_EN; |
---|
| 3518 | + |
---|
3413 | 3519 | return priv_flags; |
---|
3414 | 3520 | } |
---|
3415 | 3521 | |
---|
.. | .. |
---|
3421 | 3527 | flags2 &= ~IXGBE_FLAG2_RX_LEGACY; |
---|
3422 | 3528 | if (priv_flags & IXGBE_PRIV_FLAGS_LEGACY_RX) |
---|
3423 | 3529 | flags2 |= IXGBE_FLAG2_RX_LEGACY; |
---|
| 3530 | + |
---|
| 3531 | + flags2 &= ~IXGBE_FLAG2_VF_IPSEC_ENABLED; |
---|
| 3532 | + if (priv_flags & IXGBE_PRIV_FLAGS_VF_IPSEC_EN) |
---|
| 3533 | + flags2 |= IXGBE_FLAG2_VF_IPSEC_ENABLED; |
---|
3424 | 3534 | |
---|
3425 | 3535 | if (flags2 != adapter->flags2) { |
---|
3426 | 3536 | adapter->flags2 = flags2; |
---|
.. | .. |
---|
3434 | 3544 | } |
---|
3435 | 3545 | |
---|
3436 | 3546 | static const struct ethtool_ops ixgbe_ethtool_ops = { |
---|
| 3547 | + .supported_coalesce_params = ETHTOOL_COALESCE_USECS, |
---|
3437 | 3548 | .get_drvinfo = ixgbe_get_drvinfo, |
---|
3438 | 3549 | .get_regs_len = ixgbe_get_regs_len, |
---|
3439 | 3550 | .get_regs = ixgbe_get_regs, |
---|
.. | .. |
---|
3446 | 3557 | .set_eeprom = ixgbe_set_eeprom, |
---|
3447 | 3558 | .get_ringparam = ixgbe_get_ringparam, |
---|
3448 | 3559 | .set_ringparam = ixgbe_set_ringparam, |
---|
| 3560 | + .get_pause_stats = ixgbe_get_pause_stats, |
---|
3449 | 3561 | .get_pauseparam = ixgbe_get_pauseparam, |
---|
3450 | 3562 | .set_pauseparam = ixgbe_set_pauseparam, |
---|
3451 | 3563 | .get_msglevel = ixgbe_get_msglevel, |
---|