1/******************************************************************************* 2 3 Intel 10 Gigabit PCI Express Linux driver 4 Copyright(c) 1999 - 2010 Intel Corporation. 5 6 This program is free software; you can redistribute it and/or modify it 7 under the terms and conditions of the GNU General Public License, 8 version 2, as published by the Free Software Foundation. 9 10 This program is distributed in the hope it will be useful, but WITHOUT 11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 more details. 14 15 You should have received a copy of the GNU General Public License along with 16 this program; if not, write to the Free Software Foundation, Inc., 17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18 19 The full GNU General Public License is included in this distribution in 20 the file called "COPYING". 21 22 Contact Information: 23 Linux NICS <linux.nics@intel.com> 24 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 26 27*******************************************************************************/ 28 29#include "ixgbe.h" 30#include <linux/dcbnl.h> 31#include "ixgbe_dcb_82598.h" 32#include "ixgbe_dcb_82599.h" 33 34/* Callbacks for DCB netlink in the kernel */ 35#define BIT_DCB_MODE 0x01 36#define BIT_PFC 0x02 37#define BIT_PG_RX 0x04 38#define BIT_PG_TX 0x08 39#define BIT_APP_UPCHG 0x10 40#define BIT_RESETLINK 0x40 41#define BIT_LINKSPEED 0x80 42 43/* Responses for the DCB_C_SET_ALL command */ 44#define DCB_HW_CHG_RST 0 /* DCB configuration changed with reset */ 45#define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ 46#define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ 47 48int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, 49 struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max) 50{ 51 struct tc_configuration *src_tc_cfg = NULL; 52 struct tc_configuration *dst_tc_cfg = NULL; 53 int i; 54 55 if (!src_dcb_cfg || !dst_dcb_cfg) 56 return -EINVAL; 57 58 for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { 59 src_tc_cfg = &src_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; 60 dst_tc_cfg = &dst_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; 61 62 dst_tc_cfg->path[DCB_TX_CONFIG].prio_type = 63 src_tc_cfg->path[DCB_TX_CONFIG].prio_type; 64 65 dst_tc_cfg->path[DCB_TX_CONFIG].bwg_id = 66 src_tc_cfg->path[DCB_TX_CONFIG].bwg_id; 67 68 dst_tc_cfg->path[DCB_TX_CONFIG].bwg_percent = 69 src_tc_cfg->path[DCB_TX_CONFIG].bwg_percent; 70 71 dst_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap = 72 src_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap; 73 74 dst_tc_cfg->path[DCB_RX_CONFIG].prio_type = 75 src_tc_cfg->path[DCB_RX_CONFIG].prio_type; 76 77 dst_tc_cfg->path[DCB_RX_CONFIG].bwg_id = 78 src_tc_cfg->path[DCB_RX_CONFIG].bwg_id; 79 80 dst_tc_cfg->path[DCB_RX_CONFIG].bwg_percent = 81 src_tc_cfg->path[DCB_RX_CONFIG].bwg_percent; 82 83 dst_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap = 84 src_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap; 85 } 86 87 for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { 88 dst_dcb_cfg->bw_percentage[DCB_TX_CONFIG] 89 [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage 90 [DCB_TX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; 91 dst_dcb_cfg->bw_percentage[DCB_RX_CONFIG] 92 [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage 93 [DCB_RX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; 94 } 95 96 for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { 97 dst_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc = 98 src_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc; 99 } 100 101 dst_dcb_cfg->pfc_mode_enable = src_dcb_cfg->pfc_mode_enable; 102 103 return 0; 104} 105 106static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) 107{ 108 struct ixgbe_adapter *adapter = netdev_priv(netdev); 109 110 return !!(adapter->flags & IXGBE_FLAG_DCB_ENABLED); 111} 112 113static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) 114{ 115 u8 err = 0; 116 struct ixgbe_adapter *adapter = netdev_priv(netdev); 117 118 if (state > 0) { 119 /* Turn on DCB */ 120 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) 121 goto out; 122 123 if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { 124 e_err(drv, "Enable failed, needs MSI-X\n"); 125 err = 1; 126 goto out; 127 } 128 129 if (netif_running(netdev)) 130 netdev->netdev_ops->ndo_stop(netdev); 131 ixgbe_clear_interrupt_scheme(adapter); 132 133 if (adapter->hw.mac.type == ixgbe_mac_82598EB) { 134 adapter->last_lfc_mode = adapter->hw.fc.current_mode; 135 adapter->hw.fc.requested_mode = ixgbe_fc_none; 136 } 137 adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; 138 if (adapter->hw.mac.type == ixgbe_mac_82599EB) { 139 adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; 140 adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; 141 } 142 adapter->flags |= IXGBE_FLAG_DCB_ENABLED; 143 ixgbe_init_interrupt_scheme(adapter); 144 if (netif_running(netdev)) 145 netdev->netdev_ops->ndo_open(netdev); 146 } else { 147 /* Turn off DCB */ 148 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 149 if (netif_running(netdev)) 150 netdev->netdev_ops->ndo_stop(netdev); 151 ixgbe_clear_interrupt_scheme(adapter); 152 153 adapter->hw.fc.requested_mode = adapter->last_lfc_mode; 154 adapter->temp_dcb_cfg.pfc_mode_enable = false; 155 adapter->dcb_cfg.pfc_mode_enable = false; 156 adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; 157 adapter->flags |= IXGBE_FLAG_RSS_ENABLED; 158 if (adapter->hw.mac.type == ixgbe_mac_82599EB) 159 adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; 160 161 ixgbe_init_interrupt_scheme(adapter); 162 if (netif_running(netdev)) 163 netdev->netdev_ops->ndo_open(netdev); 164 } 165 } 166out: 167 return err; 168} 169 170static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev, 171 u8 *perm_addr) 172{ 173 struct ixgbe_adapter *adapter = netdev_priv(netdev); 174 int i, j; 175 176 memset(perm_addr, 0xff, MAX_ADDR_LEN); 177 178 for (i = 0; i < netdev->addr_len; i++) 179 perm_addr[i] = adapter->hw.mac.perm_addr[i]; 180 181 if (adapter->hw.mac.type == ixgbe_mac_82599EB) { 182 for (j = 0; j < netdev->addr_len; j++, i++) 183 perm_addr[i] = adapter->hw.mac.san_addr[j]; 184 } 185} 186 187static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc, 188 u8 prio, u8 bwg_id, u8 bw_pct, 189 u8 up_map) 190{ 191 struct ixgbe_adapter *adapter = netdev_priv(netdev); 192 193 if (prio != DCB_ATTR_VALUE_UNDEFINED) 194 adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type = prio; 195 if (bwg_id != DCB_ATTR_VALUE_UNDEFINED) 196 adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_id = bwg_id; 197 if (bw_pct != DCB_ATTR_VALUE_UNDEFINED) 198 adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent = 199 bw_pct; 200 if (up_map != DCB_ATTR_VALUE_UNDEFINED) 201 adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = 202 up_map; 203 204 if ((adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type != 205 adapter->dcb_cfg.tc_config[tc].path[0].prio_type) || 206 (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_id != 207 adapter->dcb_cfg.tc_config[tc].path[0].bwg_id) || 208 (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent != 209 adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent) || 210 (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != 211 adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) { 212 adapter->dcb_set_bitmap |= BIT_PG_TX; 213 adapter->dcb_set_bitmap |= BIT_RESETLINK; 214 } 215} 216 217static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, 218 u8 bw_pct) 219{ 220 struct ixgbe_adapter *adapter = netdev_priv(netdev); 221 222 adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; 223 224 if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != 225 adapter->dcb_cfg.bw_percentage[0][bwg_id]) { 226 adapter->dcb_set_bitmap |= BIT_PG_TX; 227 adapter->dcb_set_bitmap |= BIT_RESETLINK; 228 } 229} 230 231static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, 232 u8 prio, u8 bwg_id, u8 bw_pct, 233 u8 up_map) 234{ 235 struct ixgbe_adapter *adapter = netdev_priv(netdev); 236 237 if (prio != DCB_ATTR_VALUE_UNDEFINED) 238 adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type = prio; 239 if (bwg_id != DCB_ATTR_VALUE_UNDEFINED) 240 adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_id = bwg_id; 241 if (bw_pct != DCB_ATTR_VALUE_UNDEFINED) 242 adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent = 243 bw_pct; 244 if (up_map != DCB_ATTR_VALUE_UNDEFINED) 245 adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = 246 up_map; 247 248 if ((adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type != 249 adapter->dcb_cfg.tc_config[tc].path[1].prio_type) || 250 (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_id != 251 adapter->dcb_cfg.tc_config[tc].path[1].bwg_id) || 252 (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent != 253 adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent) || 254 (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != 255 adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) { 256 adapter->dcb_set_bitmap |= BIT_PG_RX; 257 adapter->dcb_set_bitmap |= BIT_RESETLINK; 258 } 259} 260 261static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, 262 u8 bw_pct) 263{ 264 struct ixgbe_adapter *adapter = netdev_priv(netdev); 265 266 adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; 267 268 if (adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] != 269 adapter->dcb_cfg.bw_percentage[1][bwg_id]) { 270 adapter->dcb_set_bitmap |= BIT_PG_RX; 271 adapter->dcb_set_bitmap |= BIT_RESETLINK; 272 } 273} 274 275static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, 276 u8 *prio, u8 *bwg_id, u8 *bw_pct, 277 u8 *up_map) 278{ 279 struct ixgbe_adapter *adapter = netdev_priv(netdev); 280 281 *prio = adapter->dcb_cfg.tc_config[tc].path[0].prio_type; 282 *bwg_id = adapter->dcb_cfg.tc_config[tc].path[0].bwg_id; 283 *bw_pct = adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent; 284 *up_map = adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap; 285} 286 287static void ixgbe_dcbnl_get_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, 288 u8 *bw_pct) 289{ 290 struct ixgbe_adapter *adapter = netdev_priv(netdev); 291 292 *bw_pct = adapter->dcb_cfg.bw_percentage[0][bwg_id]; 293} 294 295static void ixgbe_dcbnl_get_pg_tc_cfg_rx(struct net_device *netdev, int tc, 296 u8 *prio, u8 *bwg_id, u8 *bw_pct, 297 u8 *up_map) 298{ 299 struct ixgbe_adapter *adapter = netdev_priv(netdev); 300 301 *prio = adapter->dcb_cfg.tc_config[tc].path[1].prio_type; 302 *bwg_id = adapter->dcb_cfg.tc_config[tc].path[1].bwg_id; 303 *bw_pct = adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent; 304 *up_map = adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap; 305} 306 307static void ixgbe_dcbnl_get_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, 308 u8 *bw_pct) 309{ 310 struct ixgbe_adapter *adapter = netdev_priv(netdev); 311 312 *bw_pct = adapter->dcb_cfg.bw_percentage[1][bwg_id]; 313} 314 315static void ixgbe_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, 316 u8 setting) 317{ 318 struct ixgbe_adapter *adapter = netdev_priv(netdev); 319 320 adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; 321 if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != 322 adapter->dcb_cfg.tc_config[priority].dcb_pfc) { 323 adapter->dcb_set_bitmap |= BIT_PFC; 324 adapter->temp_dcb_cfg.pfc_mode_enable = true; 325 } 326} 327 328static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, 329 u8 *setting) 330{ 331 struct ixgbe_adapter *adapter = netdev_priv(netdev); 332 333 *setting = adapter->dcb_cfg.tc_config[priority].dcb_pfc; 334} 335 336static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) 337{ 338 struct ixgbe_adapter *adapter = netdev_priv(netdev); 339 int ret; 340 341 if (!adapter->dcb_set_bitmap) 342 return DCB_NO_HW_CHG; 343 344 ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, 345 adapter->ring_feature[RING_F_DCB].indices); 346 347 if (ret) 348 return DCB_NO_HW_CHG; 349 350 /* 351 * Only take down the adapter if the configuration change 352 * requires a reset. 353 */ 354 if (adapter->dcb_set_bitmap & BIT_RESETLINK) { 355 while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) 356 msleep(1); 357 358 if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { 359 if (netif_running(netdev)) 360 netdev->netdev_ops->ndo_stop(netdev); 361 ixgbe_clear_interrupt_scheme(adapter); 362 } else { 363 if (netif_running(netdev)) 364 ixgbe_down(adapter); 365 } 366 } 367 368 if (adapter->dcb_cfg.pfc_mode_enable) { 369 if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && 370 (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) 371 adapter->last_lfc_mode = adapter->hw.fc.current_mode; 372 adapter->hw.fc.requested_mode = ixgbe_fc_pfc; 373 } else { 374 if (adapter->hw.mac.type != ixgbe_mac_82598EB) 375 adapter->hw.fc.requested_mode = adapter->last_lfc_mode; 376 else 377 adapter->hw.fc.requested_mode = ixgbe_fc_none; 378 } 379 380 if (adapter->dcb_set_bitmap & BIT_RESETLINK) { 381 if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { 382 ixgbe_init_interrupt_scheme(adapter); 383 if (netif_running(netdev)) 384 netdev->netdev_ops->ndo_open(netdev); 385 } else { 386 if (netif_running(netdev)) 387 ixgbe_up(adapter); 388 } 389 ret = DCB_HW_CHG_RST; 390 } else if (adapter->dcb_set_bitmap & BIT_PFC) { 391 if (adapter->hw.mac.type == ixgbe_mac_82598EB) 392 ixgbe_dcb_config_pfc_82598(&adapter->hw, 393 &adapter->dcb_cfg); 394 else if (adapter->hw.mac.type == ixgbe_mac_82599EB) 395 ixgbe_dcb_config_pfc_82599(&adapter->hw, 396 &adapter->dcb_cfg); 397 ret = DCB_HW_CHG; 398 } 399 if (adapter->dcb_cfg.pfc_mode_enable) 400 adapter->hw.fc.current_mode = ixgbe_fc_pfc; 401 402 if (adapter->dcb_set_bitmap & BIT_RESETLINK) 403 clear_bit(__IXGBE_RESETTING, &adapter->state); 404 adapter->dcb_set_bitmap = 0x00; 405 return ret; 406} 407 408static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap) 409{ 410 struct ixgbe_adapter *adapter = netdev_priv(netdev); 411 u8 rval = 0; 412 413 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 414 switch (capid) { 415 case DCB_CAP_ATTR_PG: 416 *cap = true; 417 break; 418 case DCB_CAP_ATTR_PFC: 419 *cap = true; 420 break; 421 case DCB_CAP_ATTR_UP2TC: 422 *cap = false; 423 break; 424 case DCB_CAP_ATTR_PG_TCS: 425 *cap = 0x80; 426 break; 427 case DCB_CAP_ATTR_PFC_TCS: 428 *cap = 0x80; 429 break; 430 case DCB_CAP_ATTR_GSP: 431 *cap = true; 432 break; 433 case DCB_CAP_ATTR_BCN: 434 *cap = false; 435 break; 436 default: 437 rval = -EINVAL; 438 break; 439 } 440 } else { 441 rval = -EINVAL; 442 } 443 444 return rval; 445} 446 447static u8 ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) 448{ 449 struct ixgbe_adapter *adapter = netdev_priv(netdev); 450 u8 rval = 0; 451 452 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 453 switch (tcid) { 454 case DCB_NUMTCS_ATTR_PG: 455 *num = MAX_TRAFFIC_CLASS; 456 break; 457 case DCB_NUMTCS_ATTR_PFC: 458 *num = MAX_TRAFFIC_CLASS; 459 break; 460 default: 461 rval = -EINVAL; 462 break; 463 } 464 } else { 465 rval = -EINVAL; 466 } 467 468 return rval; 469} 470 471static u8 ixgbe_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num) 472{ 473 return -EINVAL; 474} 475 476static u8 ixgbe_dcbnl_getpfcstate(struct net_device *netdev) 477{ 478 struct ixgbe_adapter *adapter = netdev_priv(netdev); 479 480 return adapter->dcb_cfg.pfc_mode_enable; 481} 482 483static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state) 484{ 485 struct ixgbe_adapter *adapter = netdev_priv(netdev); 486 487 adapter->temp_dcb_cfg.pfc_mode_enable = state; 488 if (adapter->temp_dcb_cfg.pfc_mode_enable != 489 adapter->dcb_cfg.pfc_mode_enable) 490 adapter->dcb_set_bitmap |= BIT_PFC; 491} 492 493/** 494 * ixgbe_dcbnl_getapp - retrieve the DCBX application user priority 495 * @netdev : the corresponding netdev 496 * @idtype : identifies the id as ether type or TCP/UDP port number 497 * @id: id is either ether type or TCP/UDP port number 498 * 499 * Returns : on success, returns a non-zero 802.1p user priority bitmap 500 * otherwise returns 0 as the invalid user priority bitmap to indicate an 501 * error. 502 */ 503static u8 ixgbe_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id) 504{ 505 u8 rval = 0; 506 507 switch (idtype) { 508 case DCB_APP_IDTYPE_ETHTYPE: 509#ifdef IXGBE_FCOE 510 if (id == ETH_P_FCOE) 511 rval = ixgbe_fcoe_getapp(netdev_priv(netdev)); 512#endif 513 break; 514 case DCB_APP_IDTYPE_PORTNUM: 515 break; 516 default: 517 break; 518 } 519 return rval; 520} 521 522/** 523 * ixgbe_dcbnl_setapp - set the DCBX application user priority 524 * @netdev : the corresponding netdev 525 * @idtype : identifies the id as ether type or TCP/UDP port number 526 * @id: id is either ether type or TCP/UDP port number 527 * @up: the 802.1p user priority bitmap 528 * 529 * Returns : 0 on success or 1 on error 530 */ 531static u8 ixgbe_dcbnl_setapp(struct net_device *netdev, 532 u8 idtype, u16 id, u8 up) 533{ 534 u8 rval = 1; 535 536 switch (idtype) { 537 case DCB_APP_IDTYPE_ETHTYPE: 538#ifdef IXGBE_FCOE 539 if (id == ETH_P_FCOE) { 540 u8 tc; 541 struct ixgbe_adapter *adapter; 542 543 adapter = netdev_priv(netdev); 544 tc = adapter->fcoe.tc; 545 rval = ixgbe_fcoe_setapp(adapter, up); 546 if ((!rval) && (tc != adapter->fcoe.tc) && 547 (adapter->flags & IXGBE_FLAG_DCB_ENABLED) && 548 (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) { 549 adapter->dcb_set_bitmap |= BIT_APP_UPCHG; 550 adapter->dcb_set_bitmap |= BIT_RESETLINK; 551 } 552 } 553#endif 554 break; 555 case DCB_APP_IDTYPE_PORTNUM: 556 break; 557 default: 558 break; 559 } 560 return rval; 561} 562 563const struct dcbnl_rtnl_ops dcbnl_ops = { 564 .getstate = ixgbe_dcbnl_get_state, 565 .setstate = ixgbe_dcbnl_set_state, 566 .getpermhwaddr = ixgbe_dcbnl_get_perm_hw_addr, 567 .setpgtccfgtx = ixgbe_dcbnl_set_pg_tc_cfg_tx, 568 .setpgbwgcfgtx = ixgbe_dcbnl_set_pg_bwg_cfg_tx, 569 .setpgtccfgrx = ixgbe_dcbnl_set_pg_tc_cfg_rx, 570 .setpgbwgcfgrx = ixgbe_dcbnl_set_pg_bwg_cfg_rx, 571 .getpgtccfgtx = ixgbe_dcbnl_get_pg_tc_cfg_tx, 572 .getpgbwgcfgtx = ixgbe_dcbnl_get_pg_bwg_cfg_tx, 573 .getpgtccfgrx = ixgbe_dcbnl_get_pg_tc_cfg_rx, 574 .getpgbwgcfgrx = ixgbe_dcbnl_get_pg_bwg_cfg_rx, 575 .setpfccfg = ixgbe_dcbnl_set_pfc_cfg, 576 .getpfccfg = ixgbe_dcbnl_get_pfc_cfg, 577 .setall = ixgbe_dcbnl_set_all, 578 .getcap = ixgbe_dcbnl_getcap, 579 .getnumtcs = ixgbe_dcbnl_getnumtcs, 580 .setnumtcs = ixgbe_dcbnl_setnumtcs, 581 .getpfcstate = ixgbe_dcbnl_getpfcstate, 582 .setpfcstate = ixgbe_dcbnl_setpfcstate, 583 .getapp = ixgbe_dcbnl_getapp, 584 .setapp = ixgbe_dcbnl_setapp, 585}; 586