1 /******************************************************************************* 2 3 Intel 10 Gigabit PCI Express Linux driver 4 Copyright(c) 1999 - 2013 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 #include "ixgbe_sriov.h" 34 35 /* Callbacks for DCB netlink in the kernel */ 36 #define BIT_DCB_MODE 0x01 37 #define BIT_PFC 0x02 38 #define BIT_PG_RX 0x04 39 #define BIT_PG_TX 0x08 40 #define BIT_APP_UPCHG 0x10 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 48 static int ixgbe_copy_dcb_cfg(struct ixgbe_adapter *adapter, int tc_max) 49 { 50 struct ixgbe_dcb_config *scfg = &adapter->temp_dcb_cfg; 51 struct ixgbe_dcb_config *dcfg = &adapter->dcb_cfg; 52 struct tc_configuration *src = NULL; 53 struct tc_configuration *dst = NULL; 54 int i, j; 55 int tx = DCB_TX_CONFIG; 56 int rx = DCB_RX_CONFIG; 57 int changes = 0; 58 #ifdef IXGBE_FCOE 59 struct dcb_app app = { 60 .selector = DCB_APP_IDTYPE_ETHTYPE, 61 .protocol = ETH_P_FCOE, 62 }; 63 u8 up = dcb_getapp(adapter->netdev, &app); 64 65 if (up && !(up & (1 << adapter->fcoe.up))) 66 changes |= BIT_APP_UPCHG; 67 #endif 68 69 for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { 70 src = &scfg->tc_config[i - DCB_PG_ATTR_TC_0]; 71 dst = &dcfg->tc_config[i - DCB_PG_ATTR_TC_0]; 72 73 if (dst->path[tx].prio_type != src->path[tx].prio_type) { 74 dst->path[tx].prio_type = src->path[tx].prio_type; 75 changes |= BIT_PG_TX; 76 } 77 78 if (dst->path[tx].bwg_id != src->path[tx].bwg_id) { 79 dst->path[tx].bwg_id = src->path[tx].bwg_id; 80 changes |= BIT_PG_TX; 81 } 82 83 if (dst->path[tx].bwg_percent != src->path[tx].bwg_percent) { 84 dst->path[tx].bwg_percent = src->path[tx].bwg_percent; 85 changes |= BIT_PG_TX; 86 } 87 88 if (dst->path[tx].up_to_tc_bitmap != 89 src->path[tx].up_to_tc_bitmap) { 90 dst->path[tx].up_to_tc_bitmap = 91 src->path[tx].up_to_tc_bitmap; 92 changes |= (BIT_PG_TX | BIT_PFC | BIT_APP_UPCHG); 93 } 94 95 if (dst->path[rx].prio_type != src->path[rx].prio_type) { 96 dst->path[rx].prio_type = src->path[rx].prio_type; 97 changes |= BIT_PG_RX; 98 } 99 100 if (dst->path[rx].bwg_id != src->path[rx].bwg_id) { 101 dst->path[rx].bwg_id = src->path[rx].bwg_id; 102 changes |= BIT_PG_RX; 103 } 104 105 if (dst->path[rx].bwg_percent != src->path[rx].bwg_percent) { 106 dst->path[rx].bwg_percent = src->path[rx].bwg_percent; 107 changes |= BIT_PG_RX; 108 } 109 110 if (dst->path[rx].up_to_tc_bitmap != 111 src->path[rx].up_to_tc_bitmap) { 112 dst->path[rx].up_to_tc_bitmap = 113 src->path[rx].up_to_tc_bitmap; 114 changes |= (BIT_PG_RX | BIT_PFC | BIT_APP_UPCHG); 115 } 116 } 117 118 for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { 119 j = i - DCB_PG_ATTR_BW_ID_0; 120 if (dcfg->bw_percentage[tx][j] != scfg->bw_percentage[tx][j]) { 121 dcfg->bw_percentage[tx][j] = scfg->bw_percentage[tx][j]; 122 changes |= BIT_PG_TX; 123 } 124 if (dcfg->bw_percentage[rx][j] != scfg->bw_percentage[rx][j]) { 125 dcfg->bw_percentage[rx][j] = scfg->bw_percentage[rx][j]; 126 changes |= BIT_PG_RX; 127 } 128 } 129 130 for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { 131 j = i - DCB_PFC_UP_ATTR_0; 132 if (dcfg->tc_config[j].dcb_pfc != scfg->tc_config[j].dcb_pfc) { 133 dcfg->tc_config[j].dcb_pfc = scfg->tc_config[j].dcb_pfc; 134 changes |= BIT_PFC; 135 } 136 } 137 138 if (dcfg->pfc_mode_enable != scfg->pfc_mode_enable) { 139 dcfg->pfc_mode_enable = scfg->pfc_mode_enable; 140 changes |= BIT_PFC; 141 } 142 143 return changes; 144 } 145 146 static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) 147 { 148 struct ixgbe_adapter *adapter = netdev_priv(netdev); 149 150 return !!(adapter->flags & IXGBE_FLAG_DCB_ENABLED); 151 } 152 153 static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) 154 { 155 struct ixgbe_adapter *adapter = netdev_priv(netdev); 156 int err = 0; 157 158 /* Fail command if not in CEE mode */ 159 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 160 return 1; 161 162 /* verify there is something to do, if not then exit */ 163 if (!state == !(adapter->flags & IXGBE_FLAG_DCB_ENABLED)) 164 goto out; 165 166 err = ixgbe_setup_tc(netdev, 167 state ? adapter->dcb_cfg.num_tcs.pg_tcs : 0); 168 out: 169 return !!err; 170 } 171 172 static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev, 173 u8 *perm_addr) 174 { 175 struct ixgbe_adapter *adapter = netdev_priv(netdev); 176 int i, j; 177 178 memset(perm_addr, 0xff, MAX_ADDR_LEN); 179 180 for (i = 0; i < netdev->addr_len; i++) 181 perm_addr[i] = adapter->hw.mac.perm_addr[i]; 182 183 switch (adapter->hw.mac.type) { 184 case ixgbe_mac_82599EB: 185 case ixgbe_mac_X540: 186 for (j = 0; j < netdev->addr_len; j++, i++) 187 perm_addr[i] = adapter->hw.mac.san_addr[j]; 188 break; 189 default: 190 break; 191 } 192 } 193 194 static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc, 195 u8 prio, u8 bwg_id, u8 bw_pct, 196 u8 up_map) 197 { 198 struct ixgbe_adapter *adapter = netdev_priv(netdev); 199 200 if (prio != DCB_ATTR_VALUE_UNDEFINED) 201 adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type = prio; 202 if (bwg_id != DCB_ATTR_VALUE_UNDEFINED) 203 adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_id = bwg_id; 204 if (bw_pct != DCB_ATTR_VALUE_UNDEFINED) 205 adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent = 206 bw_pct; 207 if (up_map != DCB_ATTR_VALUE_UNDEFINED) 208 adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = 209 up_map; 210 } 211 212 static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, 213 u8 bw_pct) 214 { 215 struct ixgbe_adapter *adapter = netdev_priv(netdev); 216 217 adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; 218 } 219 220 static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, 221 u8 prio, u8 bwg_id, u8 bw_pct, 222 u8 up_map) 223 { 224 struct ixgbe_adapter *adapter = netdev_priv(netdev); 225 226 if (prio != DCB_ATTR_VALUE_UNDEFINED) 227 adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type = prio; 228 if (bwg_id != DCB_ATTR_VALUE_UNDEFINED) 229 adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_id = bwg_id; 230 if (bw_pct != DCB_ATTR_VALUE_UNDEFINED) 231 adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent = 232 bw_pct; 233 if (up_map != DCB_ATTR_VALUE_UNDEFINED) 234 adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = 235 up_map; 236 } 237 238 static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, 239 u8 bw_pct) 240 { 241 struct ixgbe_adapter *adapter = netdev_priv(netdev); 242 243 adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; 244 } 245 246 static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, 247 u8 *prio, u8 *bwg_id, u8 *bw_pct, 248 u8 *up_map) 249 { 250 struct ixgbe_adapter *adapter = netdev_priv(netdev); 251 252 *prio = adapter->dcb_cfg.tc_config[tc].path[0].prio_type; 253 *bwg_id = adapter->dcb_cfg.tc_config[tc].path[0].bwg_id; 254 *bw_pct = adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent; 255 *up_map = adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap; 256 } 257 258 static void ixgbe_dcbnl_get_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, 259 u8 *bw_pct) 260 { 261 struct ixgbe_adapter *adapter = netdev_priv(netdev); 262 263 *bw_pct = adapter->dcb_cfg.bw_percentage[0][bwg_id]; 264 } 265 266 static void ixgbe_dcbnl_get_pg_tc_cfg_rx(struct net_device *netdev, int tc, 267 u8 *prio, u8 *bwg_id, u8 *bw_pct, 268 u8 *up_map) 269 { 270 struct ixgbe_adapter *adapter = netdev_priv(netdev); 271 272 *prio = adapter->dcb_cfg.tc_config[tc].path[1].prio_type; 273 *bwg_id = adapter->dcb_cfg.tc_config[tc].path[1].bwg_id; 274 *bw_pct = adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent; 275 *up_map = adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap; 276 } 277 278 static void ixgbe_dcbnl_get_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, 279 u8 *bw_pct) 280 { 281 struct ixgbe_adapter *adapter = netdev_priv(netdev); 282 283 *bw_pct = adapter->dcb_cfg.bw_percentage[1][bwg_id]; 284 } 285 286 static void ixgbe_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, 287 u8 setting) 288 { 289 struct ixgbe_adapter *adapter = netdev_priv(netdev); 290 291 adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; 292 if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != 293 adapter->dcb_cfg.tc_config[priority].dcb_pfc) 294 adapter->temp_dcb_cfg.pfc_mode_enable = true; 295 } 296 297 static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, 298 u8 *setting) 299 { 300 struct ixgbe_adapter *adapter = netdev_priv(netdev); 301 302 *setting = adapter->dcb_cfg.tc_config[priority].dcb_pfc; 303 } 304 305 static void ixgbe_dcbnl_devreset(struct net_device *dev) 306 { 307 struct ixgbe_adapter *adapter = netdev_priv(dev); 308 309 while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) 310 usleep_range(1000, 2000); 311 312 if (netif_running(dev)) 313 dev->netdev_ops->ndo_stop(dev); 314 315 ixgbe_clear_interrupt_scheme(adapter); 316 ixgbe_init_interrupt_scheme(adapter); 317 318 if (netif_running(dev)) 319 dev->netdev_ops->ndo_open(dev); 320 321 clear_bit(__IXGBE_RESETTING, &adapter->state); 322 } 323 324 static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) 325 { 326 struct ixgbe_adapter *adapter = netdev_priv(netdev); 327 struct ixgbe_dcb_config *dcb_cfg = &adapter->dcb_cfg; 328 struct ixgbe_hw *hw = &adapter->hw; 329 int ret = DCB_NO_HW_CHG; 330 int i; 331 332 /* Fail command if not in CEE mode */ 333 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 334 return ret; 335 336 adapter->dcb_set_bitmap |= ixgbe_copy_dcb_cfg(adapter, 337 MAX_TRAFFIC_CLASS); 338 if (!adapter->dcb_set_bitmap) 339 return ret; 340 341 if (adapter->dcb_set_bitmap & (BIT_PG_TX|BIT_PG_RX)) { 342 u16 refill[MAX_TRAFFIC_CLASS], max[MAX_TRAFFIC_CLASS]; 343 u8 bwg_id[MAX_TRAFFIC_CLASS], prio_type[MAX_TRAFFIC_CLASS]; 344 /* Priority to TC mapping in CEE case default to 1:1 */ 345 u8 prio_tc[MAX_USER_PRIORITY]; 346 int max_frame = adapter->netdev->mtu + ETH_HLEN + ETH_FCS_LEN; 347 348 #ifdef IXGBE_FCOE 349 if (adapter->netdev->features & NETIF_F_FCOE_MTU) 350 max_frame = max(max_frame, IXGBE_FCOE_JUMBO_FRAME_SIZE); 351 #endif 352 353 ixgbe_dcb_calculate_tc_credits(hw, dcb_cfg, max_frame, 354 DCB_TX_CONFIG); 355 ixgbe_dcb_calculate_tc_credits(hw, dcb_cfg, max_frame, 356 DCB_RX_CONFIG); 357 358 ixgbe_dcb_unpack_refill(dcb_cfg, DCB_TX_CONFIG, refill); 359 ixgbe_dcb_unpack_max(dcb_cfg, max); 360 ixgbe_dcb_unpack_bwgid(dcb_cfg, DCB_TX_CONFIG, bwg_id); 361 ixgbe_dcb_unpack_prio(dcb_cfg, DCB_TX_CONFIG, prio_type); 362 ixgbe_dcb_unpack_map(dcb_cfg, DCB_TX_CONFIG, prio_tc); 363 364 ixgbe_dcb_hw_ets_config(hw, refill, max, bwg_id, 365 prio_type, prio_tc); 366 367 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) 368 netdev_set_prio_tc_map(netdev, i, prio_tc[i]); 369 370 ret = DCB_HW_CHG_RST; 371 } 372 373 if (adapter->dcb_set_bitmap & BIT_PFC) { 374 if (dcb_cfg->pfc_mode_enable) { 375 u8 pfc_en; 376 u8 prio_tc[MAX_USER_PRIORITY]; 377 378 ixgbe_dcb_unpack_map(dcb_cfg, DCB_TX_CONFIG, prio_tc); 379 ixgbe_dcb_unpack_pfc(dcb_cfg, &pfc_en); 380 ixgbe_dcb_hw_pfc_config(hw, pfc_en, prio_tc); 381 } else { 382 hw->mac.ops.fc_enable(hw); 383 } 384 385 ixgbe_set_rx_drop_en(adapter); 386 387 ret = DCB_HW_CHG; 388 } 389 390 #ifdef IXGBE_FCOE 391 /* Reprogam FCoE hardware offloads when the traffic class 392 * FCoE is using changes. This happens if the APP info 393 * changes or the up2tc mapping is updated. 394 */ 395 if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { 396 struct dcb_app app = { 397 .selector = DCB_APP_IDTYPE_ETHTYPE, 398 .protocol = ETH_P_FCOE, 399 }; 400 u8 up = dcb_getapp(netdev, &app); 401 402 adapter->fcoe.up = ffs(up) - 1; 403 ixgbe_dcbnl_devreset(netdev); 404 ret = DCB_HW_CHG_RST; 405 } 406 #endif 407 408 adapter->dcb_set_bitmap = 0x00; 409 return ret; 410 } 411 412 static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap) 413 { 414 struct ixgbe_adapter *adapter = netdev_priv(netdev); 415 416 switch (capid) { 417 case DCB_CAP_ATTR_PG: 418 *cap = true; 419 break; 420 case DCB_CAP_ATTR_PFC: 421 *cap = true; 422 break; 423 case DCB_CAP_ATTR_UP2TC: 424 *cap = false; 425 break; 426 case DCB_CAP_ATTR_PG_TCS: 427 *cap = 0x80; 428 break; 429 case DCB_CAP_ATTR_PFC_TCS: 430 *cap = 0x80; 431 break; 432 case DCB_CAP_ATTR_GSP: 433 *cap = true; 434 break; 435 case DCB_CAP_ATTR_BCN: 436 *cap = false; 437 break; 438 case DCB_CAP_ATTR_DCBX: 439 *cap = adapter->dcbx_cap; 440 break; 441 default: 442 *cap = false; 443 break; 444 } 445 446 return 0; 447 } 448 449 static int ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) 450 { 451 struct ixgbe_adapter *adapter = netdev_priv(netdev); 452 453 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 454 switch (tcid) { 455 case DCB_NUMTCS_ATTR_PG: 456 *num = adapter->dcb_cfg.num_tcs.pg_tcs; 457 break; 458 case DCB_NUMTCS_ATTR_PFC: 459 *num = adapter->dcb_cfg.num_tcs.pfc_tcs; 460 break; 461 default: 462 return -EINVAL; 463 break; 464 } 465 } else { 466 return -EINVAL; 467 } 468 469 return 0; 470 } 471 472 static int ixgbe_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num) 473 { 474 return -EINVAL; 475 } 476 477 static u8 ixgbe_dcbnl_getpfcstate(struct net_device *netdev) 478 { 479 struct ixgbe_adapter *adapter = netdev_priv(netdev); 480 481 return adapter->dcb_cfg.pfc_mode_enable; 482 } 483 484 static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state) 485 { 486 struct ixgbe_adapter *adapter = netdev_priv(netdev); 487 488 adapter->temp_dcb_cfg.pfc_mode_enable = state; 489 } 490 491 /** 492 * ixgbe_dcbnl_getapp - retrieve the DCBX application user priority 493 * @netdev : the corresponding netdev 494 * @idtype : identifies the id as ether type or TCP/UDP port number 495 * @id: id is either ether type or TCP/UDP port number 496 * 497 * Returns : on success, returns a non-zero 802.1p user priority bitmap 498 * otherwise returns 0 as the invalid user priority bitmap to indicate an 499 * error. 500 */ 501 static u8 ixgbe_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id) 502 { 503 struct ixgbe_adapter *adapter = netdev_priv(netdev); 504 struct dcb_app app = { 505 .selector = idtype, 506 .protocol = id, 507 }; 508 509 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) 510 return 0; 511 512 return dcb_getapp(netdev, &app); 513 } 514 515 static int ixgbe_dcbnl_ieee_getets(struct net_device *dev, 516 struct ieee_ets *ets) 517 { 518 struct ixgbe_adapter *adapter = netdev_priv(dev); 519 struct ieee_ets *my_ets = adapter->ixgbe_ieee_ets; 520 521 ets->ets_cap = adapter->dcb_cfg.num_tcs.pg_tcs; 522 523 /* No IEEE PFC settings available */ 524 if (!my_ets) 525 return 0; 526 527 ets->cbs = my_ets->cbs; 528 memcpy(ets->tc_tx_bw, my_ets->tc_tx_bw, sizeof(ets->tc_tx_bw)); 529 memcpy(ets->tc_rx_bw, my_ets->tc_rx_bw, sizeof(ets->tc_rx_bw)); 530 memcpy(ets->tc_tsa, my_ets->tc_tsa, sizeof(ets->tc_tsa)); 531 memcpy(ets->prio_tc, my_ets->prio_tc, sizeof(ets->prio_tc)); 532 return 0; 533 } 534 535 static int ixgbe_dcbnl_ieee_setets(struct net_device *dev, 536 struct ieee_ets *ets) 537 { 538 struct ixgbe_adapter *adapter = netdev_priv(dev); 539 int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN; 540 int i, err = 0; 541 __u8 max_tc = 0; 542 __u8 map_chg = 0; 543 544 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) 545 return -EINVAL; 546 547 if (!adapter->ixgbe_ieee_ets) { 548 adapter->ixgbe_ieee_ets = kmalloc(sizeof(struct ieee_ets), 549 GFP_KERNEL); 550 if (!adapter->ixgbe_ieee_ets) 551 return -ENOMEM; 552 553 /* initialize UP2TC mappings to invalid value */ 554 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) 555 adapter->ixgbe_ieee_ets->prio_tc[i] = 556 IEEE_8021QAZ_MAX_TCS; 557 } 558 559 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { 560 if (ets->prio_tc[i] > max_tc) 561 max_tc = ets->prio_tc[i]; 562 if (ets->prio_tc[i] != adapter->ixgbe_ieee_ets->prio_tc[i]) 563 map_chg = 1; 564 } 565 566 memcpy(adapter->ixgbe_ieee_ets, ets, sizeof(*adapter->ixgbe_ieee_ets)); 567 568 if (max_tc) 569 max_tc++; 570 571 if (max_tc > adapter->dcb_cfg.num_tcs.pg_tcs) 572 return -EINVAL; 573 574 if (max_tc != netdev_get_num_tc(dev)) 575 err = ixgbe_setup_tc(dev, max_tc); 576 else if (map_chg) 577 ixgbe_dcbnl_devreset(dev); 578 579 if (err) 580 goto err_out; 581 582 err = ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame); 583 err_out: 584 return err; 585 } 586 587 static int ixgbe_dcbnl_ieee_getpfc(struct net_device *dev, 588 struct ieee_pfc *pfc) 589 { 590 struct ixgbe_adapter *adapter = netdev_priv(dev); 591 struct ieee_pfc *my_pfc = adapter->ixgbe_ieee_pfc; 592 int i; 593 594 pfc->pfc_cap = adapter->dcb_cfg.num_tcs.pfc_tcs; 595 596 /* No IEEE PFC settings available */ 597 if (!my_pfc) 598 return 0; 599 600 pfc->pfc_en = my_pfc->pfc_en; 601 pfc->mbc = my_pfc->mbc; 602 pfc->delay = my_pfc->delay; 603 604 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 605 pfc->requests[i] = adapter->stats.pxoffrxc[i]; 606 pfc->indications[i] = adapter->stats.pxofftxc[i]; 607 } 608 609 return 0; 610 } 611 612 static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev, 613 struct ieee_pfc *pfc) 614 { 615 struct ixgbe_adapter *adapter = netdev_priv(dev); 616 struct ixgbe_hw *hw = &adapter->hw; 617 u8 *prio_tc; 618 int err; 619 620 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) 621 return -EINVAL; 622 623 if (!adapter->ixgbe_ieee_pfc) { 624 adapter->ixgbe_ieee_pfc = kmalloc(sizeof(struct ieee_pfc), 625 GFP_KERNEL); 626 if (!adapter->ixgbe_ieee_pfc) 627 return -ENOMEM; 628 } 629 630 prio_tc = adapter->ixgbe_ieee_ets->prio_tc; 631 memcpy(adapter->ixgbe_ieee_pfc, pfc, sizeof(*adapter->ixgbe_ieee_pfc)); 632 633 /* Enable link flow control parameters if PFC is disabled */ 634 if (pfc->pfc_en) 635 err = ixgbe_dcb_hw_pfc_config(hw, pfc->pfc_en, prio_tc); 636 else 637 err = hw->mac.ops.fc_enable(hw); 638 639 ixgbe_set_rx_drop_en(adapter); 640 641 return err; 642 } 643 644 static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev, 645 struct dcb_app *app) 646 { 647 struct ixgbe_adapter *adapter = netdev_priv(dev); 648 int err = -EINVAL; 649 650 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) 651 return err; 652 653 err = dcb_ieee_setapp(dev, app); 654 if (err) 655 return err; 656 657 #ifdef IXGBE_FCOE 658 if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && 659 app->protocol == ETH_P_FCOE) { 660 u8 app_mask = dcb_ieee_getapp_mask(dev, app); 661 662 if (app_mask & (1 << adapter->fcoe.up)) 663 return err; 664 665 adapter->fcoe.up = app->priority; 666 ixgbe_dcbnl_devreset(dev); 667 } 668 #endif 669 670 /* VF devices should use default UP when available */ 671 if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && 672 app->protocol == 0) { 673 int vf; 674 675 adapter->default_up = app->priority; 676 677 for (vf = 0; vf < adapter->num_vfs; vf++) { 678 struct vf_data_storage *vfinfo = &adapter->vfinfo[vf]; 679 680 if (!vfinfo->pf_qos) 681 ixgbe_set_vmvir(adapter, vfinfo->pf_vlan, 682 app->priority, vf); 683 } 684 } 685 686 return 0; 687 } 688 689 static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev, 690 struct dcb_app *app) 691 { 692 struct ixgbe_adapter *adapter = netdev_priv(dev); 693 int err; 694 695 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) 696 return -EINVAL; 697 698 err = dcb_ieee_delapp(dev, app); 699 700 #ifdef IXGBE_FCOE 701 if (!err && app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && 702 app->protocol == ETH_P_FCOE) { 703 u8 app_mask = dcb_ieee_getapp_mask(dev, app); 704 705 if (app_mask & (1 << adapter->fcoe.up)) 706 return err; 707 708 adapter->fcoe.up = app_mask ? 709 ffs(app_mask) - 1 : IXGBE_FCOE_DEFTC; 710 ixgbe_dcbnl_devreset(dev); 711 } 712 #endif 713 /* IF default priority is being removed clear VF default UP */ 714 if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && 715 app->protocol == 0 && adapter->default_up == app->priority) { 716 int vf; 717 long unsigned int app_mask = dcb_ieee_getapp_mask(dev, app); 718 int qos = app_mask ? find_first_bit(&app_mask, 8) : 0; 719 720 adapter->default_up = qos; 721 722 for (vf = 0; vf < adapter->num_vfs; vf++) { 723 struct vf_data_storage *vfinfo = &adapter->vfinfo[vf]; 724 725 if (!vfinfo->pf_qos) 726 ixgbe_set_vmvir(adapter, vfinfo->pf_vlan, 727 qos, vf); 728 } 729 } 730 731 return err; 732 } 733 734 static u8 ixgbe_dcbnl_getdcbx(struct net_device *dev) 735 { 736 struct ixgbe_adapter *adapter = netdev_priv(dev); 737 return adapter->dcbx_cap; 738 } 739 740 static u8 ixgbe_dcbnl_setdcbx(struct net_device *dev, u8 mode) 741 { 742 struct ixgbe_adapter *adapter = netdev_priv(dev); 743 struct ieee_ets ets = {0}; 744 struct ieee_pfc pfc = {0}; 745 int err = 0; 746 747 /* no support for LLD_MANAGED modes or CEE+IEEE */ 748 if ((mode & DCB_CAP_DCBX_LLD_MANAGED) || 749 ((mode & DCB_CAP_DCBX_VER_IEEE) && (mode & DCB_CAP_DCBX_VER_CEE)) || 750 !(mode & DCB_CAP_DCBX_HOST)) 751 return 1; 752 753 if (mode == adapter->dcbx_cap) 754 return 0; 755 756 adapter->dcbx_cap = mode; 757 758 /* ETS and PFC defaults */ 759 ets.ets_cap = 8; 760 pfc.pfc_cap = 8; 761 762 if (mode & DCB_CAP_DCBX_VER_IEEE) { 763 ixgbe_dcbnl_ieee_setets(dev, &ets); 764 ixgbe_dcbnl_ieee_setpfc(dev, &pfc); 765 } else if (mode & DCB_CAP_DCBX_VER_CEE) { 766 u8 mask = BIT_PFC | BIT_PG_TX | BIT_PG_RX | BIT_APP_UPCHG; 767 768 adapter->dcb_set_bitmap |= mask; 769 ixgbe_dcbnl_set_all(dev); 770 } else { 771 /* Drop into single TC mode strict priority as this 772 * indicates CEE and IEEE versions are disabled 773 */ 774 ixgbe_dcbnl_ieee_setets(dev, &ets); 775 ixgbe_dcbnl_ieee_setpfc(dev, &pfc); 776 err = ixgbe_setup_tc(dev, 0); 777 } 778 779 return err ? 1 : 0; 780 } 781 782 const struct dcbnl_rtnl_ops dcbnl_ops = { 783 .ieee_getets = ixgbe_dcbnl_ieee_getets, 784 .ieee_setets = ixgbe_dcbnl_ieee_setets, 785 .ieee_getpfc = ixgbe_dcbnl_ieee_getpfc, 786 .ieee_setpfc = ixgbe_dcbnl_ieee_setpfc, 787 .ieee_setapp = ixgbe_dcbnl_ieee_setapp, 788 .ieee_delapp = ixgbe_dcbnl_ieee_delapp, 789 .getstate = ixgbe_dcbnl_get_state, 790 .setstate = ixgbe_dcbnl_set_state, 791 .getpermhwaddr = ixgbe_dcbnl_get_perm_hw_addr, 792 .setpgtccfgtx = ixgbe_dcbnl_set_pg_tc_cfg_tx, 793 .setpgbwgcfgtx = ixgbe_dcbnl_set_pg_bwg_cfg_tx, 794 .setpgtccfgrx = ixgbe_dcbnl_set_pg_tc_cfg_rx, 795 .setpgbwgcfgrx = ixgbe_dcbnl_set_pg_bwg_cfg_rx, 796 .getpgtccfgtx = ixgbe_dcbnl_get_pg_tc_cfg_tx, 797 .getpgbwgcfgtx = ixgbe_dcbnl_get_pg_bwg_cfg_tx, 798 .getpgtccfgrx = ixgbe_dcbnl_get_pg_tc_cfg_rx, 799 .getpgbwgcfgrx = ixgbe_dcbnl_get_pg_bwg_cfg_rx, 800 .setpfccfg = ixgbe_dcbnl_set_pfc_cfg, 801 .getpfccfg = ixgbe_dcbnl_get_pfc_cfg, 802 .setall = ixgbe_dcbnl_set_all, 803 .getcap = ixgbe_dcbnl_getcap, 804 .getnumtcs = ixgbe_dcbnl_getnumtcs, 805 .setnumtcs = ixgbe_dcbnl_setnumtcs, 806 .getpfcstate = ixgbe_dcbnl_getpfcstate, 807 .setpfcstate = ixgbe_dcbnl_setpfcstate, 808 .getapp = ixgbe_dcbnl_getapp, 809 .getdcbx = ixgbe_dcbnl_getdcbx, 810 .setdcbx = ixgbe_dcbnl_setdcbx, 811 }; 812