| .. | .. |
|---|
| 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, |
|---|