1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 * 3 * Copyright 2013-2016 Freescale Semiconductor Inc. 4 * Copyright 2016 NXP 5 * 6 */ 7 #include <fsl_mc_sys.h> 8 #include <fsl_mc_cmd.h> 9 #include <fsl_dpni.h> 10 #include <fsl_dpni_cmd.h> 11 12 /** 13 * dpni_open() - Open a control session for the specified object 14 * @mc_io: Pointer to MC portal's I/O object 15 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 16 * @dpni_id: DPNI unique ID 17 * @token: Returned token; use in subsequent API calls 18 * 19 * This function can be used to open a control session for an 20 * already created object; an object may have been declared in 21 * the DPL or by calling the dpni_create() function. 22 * This function returns a unique authentication token, 23 * associated with the specific object ID and the specific MC 24 * portal; this token must be used in all subsequent commands for 25 * this specific object. 26 * 27 * Return: '0' on Success; Error code otherwise. 28 */ 29 int dpni_open(struct fsl_mc_io *mc_io, 30 uint32_t cmd_flags, 31 int dpni_id, 32 uint16_t *token) 33 { 34 struct mc_command cmd = { 0 }; 35 struct dpni_cmd_open *cmd_params; 36 37 int err; 38 39 /* prepare command */ 40 cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN, 41 cmd_flags, 42 0); 43 cmd_params = (struct dpni_cmd_open *)cmd.params; 44 cmd_params->dpni_id = cpu_to_le32(dpni_id); 45 46 /* send command to mc*/ 47 err = mc_send_command(mc_io, &cmd); 48 if (err) 49 return err; 50 51 /* retrieve response parameters */ 52 *token = mc_cmd_hdr_read_token(&cmd); 53 54 return 0; 55 } 56 57 /** 58 * dpni_close() - Close the control session of the object 59 * @mc_io: Pointer to MC portal's I/O object 60 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 61 * @token: Token of DPNI object 62 * 63 * After this function is called, no further operations are 64 * allowed on the object without opening a new control session. 65 * 66 * Return: '0' on Success; Error code otherwise. 67 */ 68 int dpni_close(struct fsl_mc_io *mc_io, 69 uint32_t cmd_flags, 70 uint16_t token) 71 { 72 struct mc_command cmd = { 0 }; 73 74 /* prepare command */ 75 cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE, 76 cmd_flags, 77 token); 78 79 /* send command to mc*/ 80 return mc_send_command(mc_io, &cmd); 81 } 82 83 /** 84 * dpni_create() - Create the DPNI object 85 * @mc_io: Pointer to MC portal's I/O object 86 * @dprc_token: Parent container token; '0' for default container 87 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 88 * @cfg: Configuration structure 89 * @obj_id: Returned object id 90 * 91 * Create the DPNI object, allocate required resources and 92 * perform required initialization. 93 * 94 * The object can be created either by declaring it in the 95 * DPL file, or by calling this function. 96 * 97 * The function accepts an authentication token of a parent 98 * container that this object should be assigned to. The token 99 * can be '0' so the object will be assigned to the default container. 100 * The newly created object can be opened with the returned 101 * object id and using the container's associated tokens and MC portals. 102 * 103 * Return: '0' on Success; Error code otherwise. 104 */ 105 int dpni_create(struct fsl_mc_io *mc_io, 106 uint16_t dprc_token, 107 uint32_t cmd_flags, 108 const struct dpni_cfg *cfg, 109 uint32_t *obj_id) 110 { 111 struct dpni_cmd_create *cmd_params; 112 struct mc_command cmd = { 0 }; 113 int err; 114 115 /* prepare command */ 116 cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE, 117 cmd_flags, 118 dprc_token); 119 cmd_params = (struct dpni_cmd_create *)cmd.params; 120 cmd_params->options = cpu_to_le32(cfg->options); 121 cmd_params->num_queues = cfg->num_queues; 122 cmd_params->num_tcs = cfg->num_tcs; 123 cmd_params->mac_filter_entries = cfg->mac_filter_entries; 124 cmd_params->vlan_filter_entries = cfg->vlan_filter_entries; 125 cmd_params->qos_entries = cfg->qos_entries; 126 cmd_params->fs_entries = cpu_to_le16(cfg->fs_entries); 127 128 /* send command to mc*/ 129 err = mc_send_command(mc_io, &cmd); 130 if (err) 131 return err; 132 133 /* retrieve response parameters */ 134 *obj_id = mc_cmd_read_object_id(&cmd); 135 136 return 0; 137 } 138 139 /** 140 * dpni_destroy() - Destroy the DPNI object and release all its resources. 141 * @mc_io: Pointer to MC portal's I/O object 142 * @dprc_token: Parent container token; '0' for default container 143 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 144 * @object_id: The object id; it must be a valid id within the container that 145 * created this object; 146 * 147 * The function accepts the authentication token of the parent container that 148 * created the object (not the one that currently owns the object). The object 149 * is searched within parent using the provided 'object_id'. 150 * All tokens to the object must be closed before calling destroy. 151 * 152 * Return: '0' on Success; error code otherwise. 153 */ 154 int dpni_destroy(struct fsl_mc_io *mc_io, 155 uint16_t dprc_token, 156 uint32_t cmd_flags, 157 uint32_t object_id) 158 { 159 struct dpni_cmd_destroy *cmd_params; 160 struct mc_command cmd = { 0 }; 161 162 /* prepare command */ 163 cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY, 164 cmd_flags, 165 dprc_token); 166 /* set object id to destroy */ 167 cmd_params = (struct dpni_cmd_destroy *)cmd.params; 168 cmd_params->dpsw_id = cpu_to_le32(object_id); 169 170 /* send command to mc*/ 171 return mc_send_command(mc_io, &cmd); 172 } 173 174 /** 175 * dpni_set_pools() - Set buffer pools configuration 176 * @mc_io: Pointer to MC portal's I/O object 177 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 178 * @token: Token of DPNI object 179 * @cfg: Buffer pools configuration 180 * 181 * mandatory for DPNI operation 182 * warning:Allowed only when DPNI is disabled 183 * 184 * Return: '0' on Success; Error code otherwise. 185 */ 186 int dpni_set_pools(struct fsl_mc_io *mc_io, 187 uint32_t cmd_flags, 188 uint16_t token, 189 const struct dpni_pools_cfg *cfg) 190 { 191 struct mc_command cmd = { 0 }; 192 struct dpni_cmd_set_pools *cmd_params; 193 int i; 194 195 /* prepare command */ 196 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS, 197 cmd_flags, 198 token); 199 cmd_params = (struct dpni_cmd_set_pools *)cmd.params; 200 cmd_params->num_dpbp = cfg->num_dpbp; 201 for (i = 0; i < DPNI_MAX_DPBP; i++) { 202 cmd_params->pool[i].dpbp_id = 203 cpu_to_le16(cfg->pools[i].dpbp_id); 204 cmd_params->pool[i].priority_mask = 205 cfg->pools[i].priority_mask; 206 cmd_params->buffer_size[i] = 207 cpu_to_le16(cfg->pools[i].buffer_size); 208 cmd_params->backup_pool_mask |= 209 DPNI_BACKUP_POOL(cfg->pools[i].backup_pool, i); 210 } 211 212 /* send command to mc*/ 213 return mc_send_command(mc_io, &cmd); 214 } 215 216 /** 217 * dpni_enable() - Enable the DPNI, allow sending and receiving frames. 218 * @mc_io: Pointer to MC portal's I/O object 219 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 220 * @token: Token of DPNI object 221 * 222 * Return: '0' on Success; Error code otherwise. 223 */ 224 int dpni_enable(struct fsl_mc_io *mc_io, 225 uint32_t cmd_flags, 226 uint16_t token) 227 { 228 struct mc_command cmd = { 0 }; 229 230 /* prepare command */ 231 cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE, 232 cmd_flags, 233 token); 234 235 /* send command to mc*/ 236 return mc_send_command(mc_io, &cmd); 237 } 238 239 /** 240 * dpni_disable() - Disable the DPNI, stop sending and receiving frames. 241 * @mc_io: Pointer to MC portal's I/O object 242 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 243 * @token: Token of DPNI object 244 * 245 * Return: '0' on Success; Error code otherwise. 246 */ 247 int dpni_disable(struct fsl_mc_io *mc_io, 248 uint32_t cmd_flags, 249 uint16_t token) 250 { 251 struct mc_command cmd = { 0 }; 252 253 /* prepare command */ 254 cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE, 255 cmd_flags, 256 token); 257 258 /* send command to mc*/ 259 return mc_send_command(mc_io, &cmd); 260 } 261 262 /** 263 * dpni_is_enabled() - Check if the DPNI is enabled. 264 * @mc_io: Pointer to MC portal's I/O object 265 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 266 * @token: Token of DPNI object 267 * @en: Returns '1' if object is enabled; '0' otherwise 268 * 269 * Return: '0' on Success; Error code otherwise. 270 */ 271 int dpni_is_enabled(struct fsl_mc_io *mc_io, 272 uint32_t cmd_flags, 273 uint16_t token, 274 int *en) 275 { 276 struct mc_command cmd = { 0 }; 277 struct dpni_rsp_is_enabled *rsp_params; 278 int err; 279 280 /* prepare command */ 281 cmd.header = mc_encode_cmd_header(DPNI_CMDID_IS_ENABLED, 282 cmd_flags, 283 token); 284 285 /* send command to mc*/ 286 err = mc_send_command(mc_io, &cmd); 287 if (err) 288 return err; 289 290 /* retrieve response parameters */ 291 rsp_params = (struct dpni_rsp_is_enabled *)cmd.params; 292 *en = dpni_get_field(rsp_params->enabled, ENABLE); 293 294 return 0; 295 } 296 297 /** 298 * dpni_reset() - Reset the DPNI, returns the object to initial state. 299 * @mc_io: Pointer to MC portal's I/O object 300 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 301 * @token: Token of DPNI object 302 * 303 * Return: '0' on Success; Error code otherwise. 304 */ 305 int dpni_reset(struct fsl_mc_io *mc_io, 306 uint32_t cmd_flags, 307 uint16_t token) 308 { 309 struct mc_command cmd = { 0 }; 310 311 /* prepare command */ 312 cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET, 313 cmd_flags, 314 token); 315 316 /* send command to mc*/ 317 return mc_send_command(mc_io, &cmd); 318 } 319 320 /** 321 * dpni_set_irq_enable() - Set overall interrupt state. 322 * @mc_io: Pointer to MC portal's I/O object 323 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 324 * @token: Token of DPNI object 325 * @irq_index: The interrupt index to configure 326 * @en: Interrupt state: - enable = 1, disable = 0 327 * 328 * Allows GPP software to control when interrupts are generated. 329 * Each interrupt can have up to 32 causes. The enable/disable control's the 330 * overall interrupt state. if the interrupt is disabled no causes will cause 331 * an interrupt. 332 * 333 * Return: '0' on Success; Error code otherwise. 334 */ 335 int dpni_set_irq_enable(struct fsl_mc_io *mc_io, 336 uint32_t cmd_flags, 337 uint16_t token, 338 uint8_t irq_index, 339 uint8_t en) 340 { 341 struct mc_command cmd = { 0 }; 342 struct dpni_cmd_set_irq_enable *cmd_params; 343 344 /* prepare command */ 345 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_ENABLE, 346 cmd_flags, 347 token); 348 cmd_params = (struct dpni_cmd_set_irq_enable *)cmd.params; 349 dpni_set_field(cmd_params->enable, ENABLE, en); 350 cmd_params->irq_index = irq_index; 351 352 /* send command to mc*/ 353 return mc_send_command(mc_io, &cmd); 354 } 355 356 /** 357 * dpni_get_irq_enable() - Get overall interrupt state 358 * @mc_io: Pointer to MC portal's I/O object 359 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 360 * @token: Token of DPNI object 361 * @irq_index: The interrupt index to configure 362 * @en: Returned interrupt state - enable = 1, disable = 0 363 * 364 * Return: '0' on Success; Error code otherwise. 365 */ 366 int dpni_get_irq_enable(struct fsl_mc_io *mc_io, 367 uint32_t cmd_flags, 368 uint16_t token, 369 uint8_t irq_index, 370 uint8_t *en) 371 { 372 struct mc_command cmd = { 0 }; 373 struct dpni_cmd_get_irq_enable *cmd_params; 374 struct dpni_rsp_get_irq_enable *rsp_params; 375 376 int err; 377 378 /* prepare command */ 379 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_ENABLE, 380 cmd_flags, 381 token); 382 cmd_params = (struct dpni_cmd_get_irq_enable *)cmd.params; 383 cmd_params->irq_index = irq_index; 384 385 /* send command to mc*/ 386 err = mc_send_command(mc_io, &cmd); 387 if (err) 388 return err; 389 390 /* retrieve response parameters */ 391 rsp_params = (struct dpni_rsp_get_irq_enable *)cmd.params; 392 *en = dpni_get_field(rsp_params->enabled, ENABLE); 393 394 return 0; 395 } 396 397 /** 398 * dpni_set_irq_mask() - Set interrupt mask. 399 * @mc_io: Pointer to MC portal's I/O object 400 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 401 * @token: Token of DPNI object 402 * @irq_index: The interrupt index to configure 403 * @mask: Event mask to trigger interrupt; 404 * each bit: 405 * 0 = ignore event 406 * 1 = consider event for asserting IRQ 407 * 408 * Every interrupt can have up to 32 causes and the interrupt model supports 409 * masking/unmasking each cause independently 410 * 411 * Return: '0' on Success; Error code otherwise. 412 */ 413 int dpni_set_irq_mask(struct fsl_mc_io *mc_io, 414 uint32_t cmd_flags, 415 uint16_t token, 416 uint8_t irq_index, 417 uint32_t mask) 418 { 419 struct mc_command cmd = { 0 }; 420 struct dpni_cmd_set_irq_mask *cmd_params; 421 422 /* prepare command */ 423 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_IRQ_MASK, 424 cmd_flags, 425 token); 426 cmd_params = (struct dpni_cmd_set_irq_mask *)cmd.params; 427 cmd_params->mask = cpu_to_le32(mask); 428 cmd_params->irq_index = irq_index; 429 430 /* send command to mc*/ 431 return mc_send_command(mc_io, &cmd); 432 } 433 434 /** 435 * dpni_get_irq_mask() - Get interrupt mask. 436 * @mc_io: Pointer to MC portal's I/O object 437 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 438 * @token: Token of DPNI object 439 * @irq_index: The interrupt index to configure 440 * @mask: Returned event mask to trigger interrupt 441 * 442 * Every interrupt can have up to 32 causes and the interrupt model supports 443 * masking/unmasking each cause independently 444 * 445 * Return: '0' on Success; Error code otherwise. 446 */ 447 int dpni_get_irq_mask(struct fsl_mc_io *mc_io, 448 uint32_t cmd_flags, 449 uint16_t token, 450 uint8_t irq_index, 451 uint32_t *mask) 452 { 453 struct mc_command cmd = { 0 }; 454 struct dpni_cmd_get_irq_mask *cmd_params; 455 struct dpni_rsp_get_irq_mask *rsp_params; 456 int err; 457 458 /* prepare command */ 459 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_MASK, 460 cmd_flags, 461 token); 462 cmd_params = (struct dpni_cmd_get_irq_mask *)cmd.params; 463 cmd_params->irq_index = irq_index; 464 465 /* send command to mc*/ 466 err = mc_send_command(mc_io, &cmd); 467 if (err) 468 return err; 469 470 /* retrieve response parameters */ 471 rsp_params = (struct dpni_rsp_get_irq_mask *)cmd.params; 472 *mask = le32_to_cpu(rsp_params->mask); 473 474 return 0; 475 } 476 477 /** 478 * dpni_get_irq_status() - Get the current status of any pending interrupts. 479 * @mc_io: Pointer to MC portal's I/O object 480 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 481 * @token: Token of DPNI object 482 * @irq_index: The interrupt index to configure 483 * @status: Returned interrupts status - one bit per cause: 484 * 0 = no interrupt pending 485 * 1 = interrupt pending 486 * 487 * Return: '0' on Success; Error code otherwise. 488 */ 489 int dpni_get_irq_status(struct fsl_mc_io *mc_io, 490 uint32_t cmd_flags, 491 uint16_t token, 492 uint8_t irq_index, 493 uint32_t *status) 494 { 495 struct mc_command cmd = { 0 }; 496 struct dpni_cmd_get_irq_status *cmd_params; 497 struct dpni_rsp_get_irq_status *rsp_params; 498 int err; 499 500 /* prepare command */ 501 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_IRQ_STATUS, 502 cmd_flags, 503 token); 504 cmd_params = (struct dpni_cmd_get_irq_status *)cmd.params; 505 cmd_params->status = cpu_to_le32(*status); 506 cmd_params->irq_index = irq_index; 507 508 /* send command to mc*/ 509 err = mc_send_command(mc_io, &cmd); 510 if (err) 511 return err; 512 513 /* retrieve response parameters */ 514 rsp_params = (struct dpni_rsp_get_irq_status *)cmd.params; 515 *status = le32_to_cpu(rsp_params->status); 516 517 return 0; 518 } 519 520 /** 521 * dpni_clear_irq_status() - Clear a pending interrupt's status 522 * @mc_io: Pointer to MC portal's I/O object 523 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 524 * @token: Token of DPNI object 525 * @irq_index: The interrupt index to configure 526 * @status: bits to clear (W1C) - one bit per cause: 527 * 0 = don't change 528 * 1 = clear status bit 529 * 530 * Return: '0' on Success; Error code otherwise. 531 */ 532 int dpni_clear_irq_status(struct fsl_mc_io *mc_io, 533 uint32_t cmd_flags, 534 uint16_t token, 535 uint8_t irq_index, 536 uint32_t status) 537 { 538 struct mc_command cmd = { 0 }; 539 struct dpni_cmd_clear_irq_status *cmd_params; 540 541 /* prepare command */ 542 cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLEAR_IRQ_STATUS, 543 cmd_flags, 544 token); 545 cmd_params = (struct dpni_cmd_clear_irq_status *)cmd.params; 546 cmd_params->irq_index = irq_index; 547 cmd_params->status = cpu_to_le32(status); 548 549 /* send command to mc*/ 550 return mc_send_command(mc_io, &cmd); 551 } 552 553 /** 554 * dpni_get_attributes() - Retrieve DPNI attributes. 555 * @mc_io: Pointer to MC portal's I/O object 556 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 557 * @token: Token of DPNI object 558 * @attr: Object's attributes 559 * 560 * Return: '0' on Success; Error code otherwise. 561 */ 562 int dpni_get_attributes(struct fsl_mc_io *mc_io, 563 uint32_t cmd_flags, 564 uint16_t token, 565 struct dpni_attr *attr) 566 { 567 struct mc_command cmd = { 0 }; 568 struct dpni_rsp_get_attr *rsp_params; 569 570 int err; 571 572 /* prepare command */ 573 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR, 574 cmd_flags, 575 token); 576 577 /* send command to mc*/ 578 err = mc_send_command(mc_io, &cmd); 579 if (err) 580 return err; 581 582 /* retrieve response parameters */ 583 rsp_params = (struct dpni_rsp_get_attr *)cmd.params; 584 attr->options = le32_to_cpu(rsp_params->options); 585 attr->num_queues = rsp_params->num_queues; 586 attr->num_rx_tcs = rsp_params->num_rx_tcs; 587 attr->num_tx_tcs = rsp_params->num_tx_tcs; 588 attr->mac_filter_entries = rsp_params->mac_filter_entries; 589 attr->vlan_filter_entries = rsp_params->vlan_filter_entries; 590 attr->qos_entries = rsp_params->qos_entries; 591 attr->fs_entries = le16_to_cpu(rsp_params->fs_entries); 592 attr->qos_key_size = rsp_params->qos_key_size; 593 attr->fs_key_size = rsp_params->fs_key_size; 594 attr->wriop_version = le16_to_cpu(rsp_params->wriop_version); 595 596 return 0; 597 } 598 599 /** 600 * dpni_set_errors_behavior() - Set errors behavior 601 * @mc_io: Pointer to MC portal's I/O object 602 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 603 * @token: Token of DPNI object 604 * @cfg: Errors configuration 605 * 606 * This function may be called numerous times with different 607 * error masks 608 * 609 * Return: '0' on Success; Error code otherwise. 610 */ 611 int dpni_set_errors_behavior(struct fsl_mc_io *mc_io, 612 uint32_t cmd_flags, 613 uint16_t token, 614 struct dpni_error_cfg *cfg) 615 { 616 struct mc_command cmd = { 0 }; 617 struct dpni_cmd_set_errors_behavior *cmd_params; 618 619 /* prepare command */ 620 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_ERRORS_BEHAVIOR, 621 cmd_flags, 622 token); 623 cmd_params = (struct dpni_cmd_set_errors_behavior *)cmd.params; 624 cmd_params->errors = cpu_to_le32(cfg->errors); 625 dpni_set_field(cmd_params->flags, ERROR_ACTION, cfg->error_action); 626 dpni_set_field(cmd_params->flags, FRAME_ANN, cfg->set_frame_annotation); 627 628 /* send command to mc*/ 629 return mc_send_command(mc_io, &cmd); 630 } 631 632 /** 633 * dpni_get_buffer_layout() - Retrieve buffer layout attributes. 634 * @mc_io: Pointer to MC portal's I/O object 635 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 636 * @token: Token of DPNI object 637 * @qtype: Type of queue to retrieve configuration for 638 * @layout: Returns buffer layout attributes 639 * 640 * Return: '0' on Success; Error code otherwise. 641 */ 642 int dpni_get_buffer_layout(struct fsl_mc_io *mc_io, 643 uint32_t cmd_flags, 644 uint16_t token, 645 enum dpni_queue_type qtype, 646 struct dpni_buffer_layout *layout) 647 { 648 struct mc_command cmd = { 0 }; 649 struct dpni_cmd_get_buffer_layout *cmd_params; 650 struct dpni_rsp_get_buffer_layout *rsp_params; 651 int err; 652 653 /* prepare command */ 654 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_BUFFER_LAYOUT, 655 cmd_flags, 656 token); 657 cmd_params = (struct dpni_cmd_get_buffer_layout *)cmd.params; 658 cmd_params->qtype = qtype; 659 660 /* send command to mc*/ 661 err = mc_send_command(mc_io, &cmd); 662 if (err) 663 return err; 664 665 /* retrieve response parameters */ 666 rsp_params = (struct dpni_rsp_get_buffer_layout *)cmd.params; 667 layout->pass_timestamp = dpni_get_field(rsp_params->flags, PASS_TS); 668 layout->pass_parser_result = dpni_get_field(rsp_params->flags, PASS_PR); 669 layout->pass_frame_status = dpni_get_field(rsp_params->flags, PASS_FS); 670 layout->private_data_size = le16_to_cpu(rsp_params->private_data_size); 671 layout->data_align = le16_to_cpu(rsp_params->data_align); 672 layout->data_head_room = le16_to_cpu(rsp_params->head_room); 673 layout->data_tail_room = le16_to_cpu(rsp_params->tail_room); 674 675 return 0; 676 } 677 678 /** 679 * dpni_set_buffer_layout() - Set buffer layout configuration. 680 * @mc_io: Pointer to MC portal's I/O object 681 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 682 * @token: Token of DPNI object 683 * @qtype: Type of queue this configuration applies to 684 * @layout: Buffer layout configuration 685 * 686 * Return: '0' on Success; Error code otherwise. 687 * 688 * @warning Allowed only when DPNI is disabled 689 */ 690 int dpni_set_buffer_layout(struct fsl_mc_io *mc_io, 691 uint32_t cmd_flags, 692 uint16_t token, 693 enum dpni_queue_type qtype, 694 const struct dpni_buffer_layout *layout) 695 { 696 struct mc_command cmd = { 0 }; 697 struct dpni_cmd_set_buffer_layout *cmd_params; 698 699 /* prepare command */ 700 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT, 701 cmd_flags, 702 token); 703 cmd_params = (struct dpni_cmd_set_buffer_layout *)cmd.params; 704 cmd_params->qtype = qtype; 705 cmd_params->options = cpu_to_le16(layout->options); 706 dpni_set_field(cmd_params->flags, PASS_TS, layout->pass_timestamp); 707 dpni_set_field(cmd_params->flags, PASS_PR, layout->pass_parser_result); 708 dpni_set_field(cmd_params->flags, PASS_FS, layout->pass_frame_status); 709 cmd_params->private_data_size = cpu_to_le16(layout->private_data_size); 710 cmd_params->data_align = cpu_to_le16(layout->data_align); 711 cmd_params->head_room = cpu_to_le16(layout->data_head_room); 712 cmd_params->tail_room = cpu_to_le16(layout->data_tail_room); 713 714 /* send command to mc*/ 715 return mc_send_command(mc_io, &cmd); 716 } 717 718 /** 719 * dpni_set_offload() - Set DPNI offload configuration. 720 * @mc_io: Pointer to MC portal's I/O object 721 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 722 * @token: Token of DPNI object 723 * @type: Type of DPNI offload 724 * @config: Offload configuration. 725 * For checksum offloads, non-zero value enables the offload 726 * 727 * Return: '0' on Success; Error code otherwise. 728 * 729 * @warning Allowed only when DPNI is disabled 730 */ 731 732 int dpni_set_offload(struct fsl_mc_io *mc_io, 733 uint32_t cmd_flags, 734 uint16_t token, 735 enum dpni_offload type, 736 uint32_t config) 737 { 738 struct mc_command cmd = { 0 }; 739 struct dpni_cmd_set_offload *cmd_params; 740 741 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_OFFLOAD, 742 cmd_flags, 743 token); 744 cmd_params = (struct dpni_cmd_set_offload *)cmd.params; 745 cmd_params->dpni_offload = type; 746 cmd_params->config = cpu_to_le32(config); 747 748 return mc_send_command(mc_io, &cmd); 749 } 750 751 /** 752 * dpni_get_offload() - Get DPNI offload configuration. 753 * @mc_io: Pointer to MC portal's I/O object 754 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 755 * @token: Token of DPNI object 756 * @type: Type of DPNI offload 757 * @config: Offload configuration. 758 * For checksum offloads, a value of 1 indicates that the 759 * offload is enabled. 760 * 761 * Return: '0' on Success; Error code otherwise. 762 * 763 * @warning Allowed only when DPNI is disabled 764 */ 765 int dpni_get_offload(struct fsl_mc_io *mc_io, 766 uint32_t cmd_flags, 767 uint16_t token, 768 enum dpni_offload type, 769 uint32_t *config) 770 { 771 struct mc_command cmd = { 0 }; 772 struct dpni_cmd_get_offload *cmd_params; 773 struct dpni_rsp_get_offload *rsp_params; 774 int err; 775 776 /* prepare command */ 777 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_OFFLOAD, 778 cmd_flags, 779 token); 780 cmd_params = (struct dpni_cmd_get_offload *)cmd.params; 781 cmd_params->dpni_offload = type; 782 783 /* send command to mc*/ 784 err = mc_send_command(mc_io, &cmd); 785 if (err) 786 return err; 787 788 /* retrieve response parameters */ 789 rsp_params = (struct dpni_rsp_get_offload *)cmd.params; 790 *config = le32_to_cpu(rsp_params->config); 791 792 return 0; 793 } 794 795 /** 796 * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used 797 * for enqueue operations 798 * @mc_io: Pointer to MC portal's I/O object 799 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 800 * @token: Token of DPNI object 801 * @qtype: Type of queue to receive QDID for 802 * @qdid: Returned virtual QDID value that should be used as an argument 803 * in all enqueue operations 804 * 805 * Return: '0' on Success; Error code otherwise. 806 */ 807 int dpni_get_qdid(struct fsl_mc_io *mc_io, 808 uint32_t cmd_flags, 809 uint16_t token, 810 enum dpni_queue_type qtype, 811 uint16_t *qdid) 812 { 813 struct mc_command cmd = { 0 }; 814 struct dpni_cmd_get_qdid *cmd_params; 815 struct dpni_rsp_get_qdid *rsp_params; 816 int err; 817 818 /* prepare command */ 819 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID, 820 cmd_flags, 821 token); 822 cmd_params = (struct dpni_cmd_get_qdid *)cmd.params; 823 cmd_params->qtype = qtype; 824 825 /* send command to mc*/ 826 err = mc_send_command(mc_io, &cmd); 827 if (err) 828 return err; 829 830 /* retrieve response parameters */ 831 rsp_params = (struct dpni_rsp_get_qdid *)cmd.params; 832 *qdid = le16_to_cpu(rsp_params->qdid); 833 834 return 0; 835 } 836 837 /** 838 * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer) 839 * @mc_io: Pointer to MC portal's I/O object 840 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 841 * @token: Token of DPNI object 842 * @data_offset: Tx data offset (from start of buffer) 843 * 844 * Return: '0' on Success; Error code otherwise. 845 */ 846 int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io, 847 uint32_t cmd_flags, 848 uint16_t token, 849 uint16_t *data_offset) 850 { 851 struct mc_command cmd = { 0 }; 852 struct dpni_rsp_get_tx_data_offset *rsp_params; 853 int err; 854 855 /* prepare command */ 856 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET, 857 cmd_flags, 858 token); 859 860 /* send command to mc*/ 861 err = mc_send_command(mc_io, &cmd); 862 if (err) 863 return err; 864 865 /* retrieve response parameters */ 866 rsp_params = (struct dpni_rsp_get_tx_data_offset *)cmd.params; 867 *data_offset = le16_to_cpu(rsp_params->data_offset); 868 869 return 0; 870 } 871 872 /** 873 * dpni_set_link_cfg() - set the link configuration. 874 * @mc_io: Pointer to MC portal's I/O object 875 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 876 * @token: Token of DPNI object 877 * @cfg: Link configuration 878 * 879 * Return: '0' on Success; Error code otherwise. 880 */ 881 int dpni_set_link_cfg(struct fsl_mc_io *mc_io, 882 uint32_t cmd_flags, 883 uint16_t token, 884 const struct dpni_link_cfg *cfg) 885 { 886 struct mc_command cmd = { 0 }; 887 struct dpni_cmd_set_link_cfg *cmd_params; 888 889 /* prepare command */ 890 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG, 891 cmd_flags, 892 token); 893 cmd_params = (struct dpni_cmd_set_link_cfg *)cmd.params; 894 cmd_params->rate = cpu_to_le32(cfg->rate); 895 cmd_params->options = cpu_to_le64(cfg->options); 896 897 /* send command to mc*/ 898 return mc_send_command(mc_io, &cmd); 899 } 900 901 /** 902 * dpni_get_link_state() - Return the link state (either up or down) 903 * @mc_io: Pointer to MC portal's I/O object 904 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 905 * @token: Token of DPNI object 906 * @state: Returned link state; 907 * 908 * Return: '0' on Success; Error code otherwise. 909 */ 910 int dpni_get_link_state(struct fsl_mc_io *mc_io, 911 uint32_t cmd_flags, 912 uint16_t token, 913 struct dpni_link_state *state) 914 { 915 struct mc_command cmd = { 0 }; 916 struct dpni_rsp_get_link_state *rsp_params; 917 int err; 918 919 /* prepare command */ 920 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE, 921 cmd_flags, 922 token); 923 924 /* send command to mc*/ 925 err = mc_send_command(mc_io, &cmd); 926 if (err) 927 return err; 928 929 /* retrieve response parameters */ 930 rsp_params = (struct dpni_rsp_get_link_state *)cmd.params; 931 state->up = dpni_get_field(rsp_params->flags, LINK_STATE); 932 state->rate = le32_to_cpu(rsp_params->rate); 933 state->options = le64_to_cpu(rsp_params->options); 934 935 return 0; 936 } 937 938 /** 939 * dpni_set_max_frame_length() - Set the maximum received frame length. 940 * @mc_io: Pointer to MC portal's I/O object 941 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 942 * @token: Token of DPNI object 943 * @max_frame_length: Maximum received frame length (in bytes); 944 * frame is discarded if its length exceeds this value 945 * 946 * Return: '0' on Success; Error code otherwise. 947 */ 948 int dpni_set_max_frame_length(struct fsl_mc_io *mc_io, 949 uint32_t cmd_flags, 950 uint16_t token, 951 uint16_t max_frame_length) 952 { 953 struct mc_command cmd = { 0 }; 954 struct dpni_cmd_set_max_frame_length *cmd_params; 955 956 /* prepare command */ 957 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MAX_FRAME_LENGTH, 958 cmd_flags, 959 token); 960 cmd_params = (struct dpni_cmd_set_max_frame_length *)cmd.params; 961 cmd_params->max_frame_length = cpu_to_le16(max_frame_length); 962 963 /* send command to mc*/ 964 return mc_send_command(mc_io, &cmd); 965 } 966 967 /** 968 * dpni_get_max_frame_length() - Get the maximum received frame length. 969 * @mc_io: Pointer to MC portal's I/O object 970 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 971 * @token: Token of DPNI object 972 * @max_frame_length: Maximum received frame length (in bytes); 973 * frame is discarded if its length exceeds this value 974 * 975 * Return: '0' on Success; Error code otherwise. 976 */ 977 int dpni_get_max_frame_length(struct fsl_mc_io *mc_io, 978 uint32_t cmd_flags, 979 uint16_t token, 980 uint16_t *max_frame_length) 981 { 982 struct mc_command cmd = { 0 }; 983 struct dpni_rsp_get_max_frame_length *rsp_params; 984 int err; 985 986 /* prepare command */ 987 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MAX_FRAME_LENGTH, 988 cmd_flags, 989 token); 990 991 /* send command to mc*/ 992 err = mc_send_command(mc_io, &cmd); 993 if (err) 994 return err; 995 996 /* retrieve response parameters */ 997 rsp_params = (struct dpni_rsp_get_max_frame_length *)cmd.params; 998 *max_frame_length = le16_to_cpu(rsp_params->max_frame_length); 999 1000 return 0; 1001 } 1002 1003 /** 1004 * dpni_set_multicast_promisc() - Enable/disable multicast promiscuous mode 1005 * @mc_io: Pointer to MC portal's I/O object 1006 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1007 * @token: Token of DPNI object 1008 * @en: Set to '1' to enable; '0' to disable 1009 * 1010 * Return: '0' on Success; Error code otherwise. 1011 */ 1012 int dpni_set_multicast_promisc(struct fsl_mc_io *mc_io, 1013 uint32_t cmd_flags, 1014 uint16_t token, 1015 int en) 1016 { 1017 struct mc_command cmd = { 0 }; 1018 struct dpni_cmd_set_multicast_promisc *cmd_params; 1019 1020 /* prepare command */ 1021 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_MCAST_PROMISC, 1022 cmd_flags, 1023 token); 1024 cmd_params = (struct dpni_cmd_set_multicast_promisc *)cmd.params; 1025 dpni_set_field(cmd_params->enable, ENABLE, en); 1026 1027 /* send command to mc*/ 1028 return mc_send_command(mc_io, &cmd); 1029 } 1030 1031 /** 1032 * dpni_get_multicast_promisc() - Get multicast promiscuous mode 1033 * @mc_io: Pointer to MC portal's I/O object 1034 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1035 * @token: Token of DPNI object 1036 * @en: Returns '1' if enabled; '0' otherwise 1037 * 1038 * Return: '0' on Success; Error code otherwise. 1039 */ 1040 int dpni_get_multicast_promisc(struct fsl_mc_io *mc_io, 1041 uint32_t cmd_flags, 1042 uint16_t token, 1043 int *en) 1044 { 1045 struct mc_command cmd = { 0 }; 1046 struct dpni_rsp_get_multicast_promisc *rsp_params; 1047 int err; 1048 1049 /* prepare command */ 1050 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_MCAST_PROMISC, 1051 cmd_flags, 1052 token); 1053 1054 /* send command to mc*/ 1055 err = mc_send_command(mc_io, &cmd); 1056 if (err) 1057 return err; 1058 1059 /* retrieve response parameters */ 1060 rsp_params = (struct dpni_rsp_get_multicast_promisc *)cmd.params; 1061 *en = dpni_get_field(rsp_params->enabled, ENABLE); 1062 1063 return 0; 1064 } 1065 1066 /** 1067 * dpni_set_unicast_promisc() - Enable/disable unicast promiscuous mode 1068 * @mc_io: Pointer to MC portal's I/O object 1069 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1070 * @token: Token of DPNI object 1071 * @en: Set to '1' to enable; '0' to disable 1072 * 1073 * Return: '0' on Success; Error code otherwise. 1074 */ 1075 int dpni_set_unicast_promisc(struct fsl_mc_io *mc_io, 1076 uint32_t cmd_flags, 1077 uint16_t token, 1078 int en) 1079 { 1080 struct mc_command cmd = { 0 }; 1081 struct dpni_cmd_set_unicast_promisc *cmd_params; 1082 1083 /* prepare command */ 1084 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_UNICAST_PROMISC, 1085 cmd_flags, 1086 token); 1087 cmd_params = (struct dpni_cmd_set_unicast_promisc *)cmd.params; 1088 dpni_set_field(cmd_params->enable, ENABLE, en); 1089 1090 /* send command to mc*/ 1091 return mc_send_command(mc_io, &cmd); 1092 } 1093 1094 /** 1095 * dpni_get_unicast_promisc() - Get unicast promiscuous mode 1096 * @mc_io: Pointer to MC portal's I/O object 1097 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1098 * @token: Token of DPNI object 1099 * @en: Returns '1' if enabled; '0' otherwise 1100 * 1101 * Return: '0' on Success; Error code otherwise. 1102 */ 1103 int dpni_get_unicast_promisc(struct fsl_mc_io *mc_io, 1104 uint32_t cmd_flags, 1105 uint16_t token, 1106 int *en) 1107 { 1108 struct mc_command cmd = { 0 }; 1109 struct dpni_rsp_get_unicast_promisc *rsp_params; 1110 int err; 1111 1112 /* prepare command */ 1113 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_UNICAST_PROMISC, 1114 cmd_flags, 1115 token); 1116 1117 /* send command to mc*/ 1118 err = mc_send_command(mc_io, &cmd); 1119 if (err) 1120 return err; 1121 1122 /* retrieve response parameters */ 1123 rsp_params = (struct dpni_rsp_get_unicast_promisc *)cmd.params; 1124 *en = dpni_get_field(rsp_params->enabled, ENABLE); 1125 1126 return 0; 1127 } 1128 1129 /** 1130 * dpni_set_primary_mac_addr() - Set the primary MAC address 1131 * @mc_io: Pointer to MC portal's I/O object 1132 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1133 * @token: Token of DPNI object 1134 * @mac_addr: MAC address to set as primary address 1135 * 1136 * Return: '0' on Success; Error code otherwise. 1137 */ 1138 int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io, 1139 uint32_t cmd_flags, 1140 uint16_t token, 1141 const uint8_t mac_addr[6]) 1142 { 1143 struct mc_command cmd = { 0 }; 1144 struct dpni_cmd_set_primary_mac_addr *cmd_params; 1145 int i; 1146 1147 /* prepare command */ 1148 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC, 1149 cmd_flags, 1150 token); 1151 cmd_params = (struct dpni_cmd_set_primary_mac_addr *)cmd.params; 1152 for (i = 0; i < 6; i++) 1153 cmd_params->mac_addr[i] = mac_addr[5 - i]; 1154 1155 /* send command to mc*/ 1156 return mc_send_command(mc_io, &cmd); 1157 } 1158 1159 /** 1160 * dpni_get_primary_mac_addr() - Get the primary MAC address 1161 * @mc_io: Pointer to MC portal's I/O object 1162 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1163 * @token: Token of DPNI object 1164 * @mac_addr: Returned MAC address 1165 * 1166 * Return: '0' on Success; Error code otherwise. 1167 */ 1168 int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io, 1169 uint32_t cmd_flags, 1170 uint16_t token, 1171 uint8_t mac_addr[6]) 1172 { 1173 struct mc_command cmd = { 0 }; 1174 struct dpni_rsp_get_primary_mac_addr *rsp_params; 1175 int i, err; 1176 1177 /* prepare command */ 1178 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC, 1179 cmd_flags, 1180 token); 1181 1182 /* send command to mc*/ 1183 err = mc_send_command(mc_io, &cmd); 1184 if (err) 1185 return err; 1186 1187 /* retrieve response parameters */ 1188 rsp_params = (struct dpni_rsp_get_primary_mac_addr *)cmd.params; 1189 for (i = 0; i < 6; i++) 1190 mac_addr[5 - i] = rsp_params->mac_addr[i]; 1191 1192 return 0; 1193 } 1194 1195 /** 1196 * dpni_add_mac_addr() - Add MAC address filter 1197 * @mc_io: Pointer to MC portal's I/O object 1198 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1199 * @token: Token of DPNI object 1200 * @mac_addr: MAC address to add 1201 * 1202 * Return: '0' on Success; Error code otherwise. 1203 */ 1204 int dpni_add_mac_addr(struct fsl_mc_io *mc_io, 1205 uint32_t cmd_flags, 1206 uint16_t token, 1207 const uint8_t mac_addr[6]) 1208 { 1209 struct mc_command cmd = { 0 }; 1210 struct dpni_cmd_add_mac_addr *cmd_params; 1211 int i; 1212 1213 /* prepare command */ 1214 cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR, 1215 cmd_flags, 1216 token); 1217 cmd_params = (struct dpni_cmd_add_mac_addr *)cmd.params; 1218 for (i = 0; i < 6; i++) 1219 cmd_params->mac_addr[i] = mac_addr[5 - i]; 1220 1221 /* send command to mc*/ 1222 return mc_send_command(mc_io, &cmd); 1223 } 1224 1225 /** 1226 * dpni_remove_mac_addr() - Remove MAC address filter 1227 * @mc_io: Pointer to MC portal's I/O object 1228 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1229 * @token: Token of DPNI object 1230 * @mac_addr: MAC address to remove 1231 * 1232 * Return: '0' on Success; Error code otherwise. 1233 */ 1234 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io, 1235 uint32_t cmd_flags, 1236 uint16_t token, 1237 const uint8_t mac_addr[6]) 1238 { 1239 struct mc_command cmd = { 0 }; 1240 struct dpni_cmd_remove_mac_addr *cmd_params; 1241 int i; 1242 1243 /* prepare command */ 1244 cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR, 1245 cmd_flags, 1246 token); 1247 cmd_params = (struct dpni_cmd_remove_mac_addr *)cmd.params; 1248 for (i = 0; i < 6; i++) 1249 cmd_params->mac_addr[i] = mac_addr[5 - i]; 1250 1251 /* send command to mc*/ 1252 return mc_send_command(mc_io, &cmd); 1253 } 1254 1255 /** 1256 * dpni_clear_mac_filters() - Clear all unicast and/or multicast MAC filters 1257 * @mc_io: Pointer to MC portal's I/O object 1258 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1259 * @token: Token of DPNI object 1260 * @unicast: Set to '1' to clear unicast addresses 1261 * @multicast: Set to '1' to clear multicast addresses 1262 * 1263 * The primary MAC address is not cleared by this operation. 1264 * 1265 * Return: '0' on Success; Error code otherwise. 1266 */ 1267 int dpni_clear_mac_filters(struct fsl_mc_io *mc_io, 1268 uint32_t cmd_flags, 1269 uint16_t token, 1270 int unicast, 1271 int multicast) 1272 { 1273 struct mc_command cmd = { 0 }; 1274 struct dpni_cmd_clear_mac_filters *cmd_params; 1275 1276 /* prepare command */ 1277 cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_MAC_FILTERS, 1278 cmd_flags, 1279 token); 1280 cmd_params = (struct dpni_cmd_clear_mac_filters *)cmd.params; 1281 dpni_set_field(cmd_params->flags, UNICAST_FILTERS, unicast); 1282 dpni_set_field(cmd_params->flags, MULTICAST_FILTERS, multicast); 1283 1284 /* send command to mc*/ 1285 return mc_send_command(mc_io, &cmd); 1286 } 1287 1288 /** 1289 * dpni_get_port_mac_addr() - Retrieve MAC address associated to the physical 1290 * port the DPNI is attached to 1291 * @mc_io: Pointer to MC portal's I/O object 1292 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1293 * @token: Token of DPNI object 1294 * @mac_addr: MAC address of the physical port, if any, otherwise 0 1295 * 1296 * The primary MAC address is not cleared by this operation. 1297 * 1298 * Return: '0' on Success; Error code otherwise. 1299 */ 1300 int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io, 1301 uint32_t cmd_flags, 1302 uint16_t token, 1303 uint8_t mac_addr[6]) 1304 { 1305 struct mc_command cmd = { 0 }; 1306 struct dpni_rsp_get_port_mac_addr *rsp_params; 1307 int i, err; 1308 1309 /* prepare command */ 1310 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PORT_MAC_ADDR, 1311 cmd_flags, 1312 token); 1313 1314 /* send command to mc*/ 1315 err = mc_send_command(mc_io, &cmd); 1316 if (err) 1317 return err; 1318 1319 /* retrieve response parameters */ 1320 rsp_params = (struct dpni_rsp_get_port_mac_addr *)cmd.params; 1321 for (i = 0; i < 6; i++) 1322 mac_addr[5 - i] = rsp_params->mac_addr[i]; 1323 1324 return 0; 1325 } 1326 1327 /** 1328 * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode 1329 * @mc_io: Pointer to MC portal's I/O object 1330 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1331 * @token: Token of DPNI object 1332 * @en: Set to '1' to enable; '0' to disable 1333 * 1334 * Return: '0' on Success; Error code otherwise. 1335 */ 1336 int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io, 1337 uint32_t cmd_flags, 1338 uint16_t token, 1339 int en) 1340 { 1341 struct dpni_cmd_enable_vlan_filter *cmd_params; 1342 struct mc_command cmd = { 0 }; 1343 1344 /* prepare command */ 1345 cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER, 1346 cmd_flags, 1347 token); 1348 cmd_params = (struct dpni_cmd_enable_vlan_filter *)cmd.params; 1349 dpni_set_field(cmd_params->en, ENABLE, en); 1350 1351 /* send command to mc*/ 1352 return mc_send_command(mc_io, &cmd); 1353 } 1354 1355 /** 1356 * dpni_add_vlan_id() - Add VLAN ID filter 1357 * @mc_io: Pointer to MC portal's I/O object 1358 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1359 * @token: Token of DPNI object 1360 * @vlan_id: VLAN ID to add 1361 * 1362 * Return: '0' on Success; Error code otherwise. 1363 */ 1364 int dpni_add_vlan_id(struct fsl_mc_io *mc_io, 1365 uint32_t cmd_flags, 1366 uint16_t token, 1367 uint16_t vlan_id) 1368 { 1369 struct dpni_cmd_vlan_id *cmd_params; 1370 struct mc_command cmd = { 0 }; 1371 1372 /* prepare command */ 1373 cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID, 1374 cmd_flags, 1375 token); 1376 cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 1377 cmd_params->vlan_id = cpu_to_le16(vlan_id); 1378 1379 /* send command to mc*/ 1380 return mc_send_command(mc_io, &cmd); 1381 } 1382 1383 /** 1384 * dpni_remove_vlan_id() - Remove VLAN ID filter 1385 * @mc_io: Pointer to MC portal's I/O object 1386 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1387 * @token: Token of DPNI object 1388 * @vlan_id: VLAN ID to remove 1389 * 1390 * Return: '0' on Success; Error code otherwise. 1391 */ 1392 int dpni_remove_vlan_id(struct fsl_mc_io *mc_io, 1393 uint32_t cmd_flags, 1394 uint16_t token, 1395 uint16_t vlan_id) 1396 { 1397 struct dpni_cmd_vlan_id *cmd_params; 1398 struct mc_command cmd = { 0 }; 1399 1400 /* prepare command */ 1401 cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID, 1402 cmd_flags, 1403 token); 1404 cmd_params = (struct dpni_cmd_vlan_id *)cmd.params; 1405 cmd_params->vlan_id = cpu_to_le16(vlan_id); 1406 1407 /* send command to mc*/ 1408 return mc_send_command(mc_io, &cmd); 1409 } 1410 1411 /** 1412 * dpni_clear_vlan_filters() - Clear all VLAN filters 1413 * @mc_io: Pointer to MC portal's I/O object 1414 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1415 * @token: Token of DPNI object 1416 * 1417 * Return: '0' on Success; Error code otherwise. 1418 */ 1419 int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io, 1420 uint32_t cmd_flags, 1421 uint16_t token) 1422 { 1423 struct mc_command cmd = { 0 }; 1424 1425 /* prepare command */ 1426 cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS, 1427 cmd_flags, 1428 token); 1429 1430 /* send command to mc*/ 1431 return mc_send_command(mc_io, &cmd); 1432 } 1433 1434 /** 1435 * dpni_set_rx_tc_dist() - Set Rx traffic class distribution configuration 1436 * @mc_io: Pointer to MC portal's I/O object 1437 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1438 * @token: Token of DPNI object 1439 * @tc_id: Traffic class selection (0-7) 1440 * @cfg: Traffic class distribution configuration 1441 * 1442 * warning: if 'dist_mode != DPNI_DIST_MODE_NONE', call dpkg_prepare_key_cfg() 1443 * first to prepare the key_cfg_iova parameter 1444 * 1445 * Return: '0' on Success; error code otherwise. 1446 */ 1447 int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io, 1448 uint32_t cmd_flags, 1449 uint16_t token, 1450 uint8_t tc_id, 1451 const struct dpni_rx_tc_dist_cfg *cfg) 1452 { 1453 struct mc_command cmd = { 0 }; 1454 struct dpni_cmd_set_rx_tc_dist *cmd_params; 1455 1456 /* prepare command */ 1457 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_TC_DIST, 1458 cmd_flags, 1459 token); 1460 cmd_params = (struct dpni_cmd_set_rx_tc_dist *)cmd.params; 1461 cmd_params->dist_size = cpu_to_le16(cfg->dist_size); 1462 cmd_params->tc_id = tc_id; 1463 cmd_params->default_flow_id = cpu_to_le16(cfg->fs_cfg.default_flow_id); 1464 cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova); 1465 dpni_set_field(cmd_params->flags, 1466 DIST_MODE, 1467 cfg->dist_mode); 1468 dpni_set_field(cmd_params->flags, 1469 MISS_ACTION, 1470 cfg->fs_cfg.miss_action); 1471 dpni_set_field(cmd_params->keep_hash_key, 1472 KEEP_HASH_KEY, 1473 cfg->fs_cfg.keep_hash_key); 1474 1475 /* send command to mc*/ 1476 return mc_send_command(mc_io, &cmd); 1477 } 1478 1479 /** 1480 * dpni_set_tx_confirmation_mode() - Tx confirmation mode 1481 * @mc_io: Pointer to MC portal's I/O object 1482 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1483 * @token: Token of DPNI object 1484 * @mode: Tx confirmation mode 1485 * 1486 * This function is useful only when 'DPNI_OPT_TX_CONF_DISABLED' is not 1487 * selected at DPNI creation. 1488 * Calling this function with 'mode' set to DPNI_CONF_DISABLE disables all 1489 * transmit confirmation (including the private confirmation queues), regardless 1490 * of previous settings; Note that in this case, Tx error frames are still 1491 * enqueued to the general transmit errors queue. 1492 * Calling this function with 'mode' set to DPNI_CONF_SINGLE switches all 1493 * Tx confirmations to a shared Tx conf queue. 'index' field in dpni_get_queue 1494 * command will be ignored. 1495 * 1496 * Return: '0' on Success; Error code otherwise. 1497 */ 1498 int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io, 1499 uint32_t cmd_flags, 1500 uint16_t token, 1501 enum dpni_confirmation_mode mode) 1502 { 1503 struct dpni_tx_confirmation_mode *cmd_params; 1504 struct mc_command cmd = { 0 }; 1505 1506 /* prepare command */ 1507 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE, 1508 cmd_flags, 1509 token); 1510 cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params; 1511 cmd_params->confirmation_mode = mode; 1512 1513 /* send command to mc*/ 1514 return mc_send_command(mc_io, &cmd); 1515 } 1516 1517 /** 1518 * dpni_set_congestion_notification() - Set traffic class congestion 1519 * notification configuration 1520 * @mc_io: Pointer to MC portal's I/O object 1521 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1522 * @token: Token of DPNI object 1523 * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported 1524 * @tc_id: Traffic class selection (0-7) 1525 * @cfg: congestion notification configuration 1526 * 1527 * Return: '0' on Success; error code otherwise. 1528 */ 1529 int dpni_set_congestion_notification(struct fsl_mc_io *mc_io, 1530 uint32_t cmd_flags, 1531 uint16_t token, 1532 enum dpni_queue_type qtype, 1533 uint8_t tc_id, 1534 const struct dpni_congestion_notification_cfg *cfg) 1535 { 1536 struct dpni_cmd_set_congestion_notification *cmd_params; 1537 struct mc_command cmd = { 0 }; 1538 1539 /* prepare command */ 1540 cmd.header = mc_encode_cmd_header( 1541 DPNI_CMDID_SET_CONGESTION_NOTIFICATION, 1542 cmd_flags, 1543 token); 1544 cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params; 1545 cmd_params->qtype = qtype; 1546 cmd_params->tc = tc_id; 1547 cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id); 1548 cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode); 1549 cmd_params->dest_priority = cfg->dest_cfg.priority; 1550 cmd_params->message_iova = cpu_to_le64(cfg->message_iova); 1551 cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx); 1552 cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry); 1553 cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit); 1554 dpni_set_field(cmd_params->type_units, 1555 DEST_TYPE, 1556 cfg->dest_cfg.dest_type); 1557 dpni_set_field(cmd_params->type_units, 1558 CONG_UNITS, 1559 cfg->units); 1560 1561 /* send command to mc*/ 1562 return mc_send_command(mc_io, &cmd); 1563 } 1564 1565 /** 1566 * dpni_get_congestion_notification() - Get traffic class congestion 1567 * notification configuration 1568 * @mc_io: Pointer to MC portal's I/O object 1569 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1570 * @token: Token of DPNI object 1571 * @qtype: Type of queue - Rx, Tx and Tx confirm types are supported 1572 * @tc_id: Traffic class selection (0-7) 1573 * @cfg: congestion notification configuration 1574 * 1575 * Return: '0' on Success; error code otherwise. 1576 */ 1577 int dpni_get_congestion_notification(struct fsl_mc_io *mc_io, 1578 uint32_t cmd_flags, 1579 uint16_t token, 1580 enum dpni_queue_type qtype, 1581 uint8_t tc_id, 1582 struct dpni_congestion_notification_cfg *cfg) 1583 { 1584 struct dpni_rsp_get_congestion_notification *rsp_params; 1585 struct dpni_cmd_get_congestion_notification *cmd_params; 1586 struct mc_command cmd = { 0 }; 1587 int err; 1588 1589 /* prepare command */ 1590 cmd.header = mc_encode_cmd_header( 1591 DPNI_CMDID_GET_CONGESTION_NOTIFICATION, 1592 cmd_flags, 1593 token); 1594 cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params; 1595 cmd_params->qtype = qtype; 1596 cmd_params->tc = tc_id; 1597 1598 /* send command to mc*/ 1599 err = mc_send_command(mc_io, &cmd); 1600 if (err) 1601 return err; 1602 1603 rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params; 1604 cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS); 1605 cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry); 1606 cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit); 1607 cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx); 1608 cfg->message_iova = le64_to_cpu(rsp_params->message_iova); 1609 cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode); 1610 cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id); 1611 cfg->dest_cfg.priority = rsp_params->dest_priority; 1612 cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units, 1613 DEST_TYPE); 1614 1615 return 0; 1616 } 1617 1618 /** 1619 * dpni_get_api_version() - Get Data Path Network Interface API version 1620 * @mc_io: Pointer to MC portal's I/O object 1621 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1622 * @major_ver: Major version of data path network interface API 1623 * @minor_ver: Minor version of data path network interface API 1624 * 1625 * Return: '0' on Success; Error code otherwise. 1626 */ 1627 int dpni_get_api_version(struct fsl_mc_io *mc_io, 1628 uint32_t cmd_flags, 1629 uint16_t *major_ver, 1630 uint16_t *minor_ver) 1631 { 1632 struct dpni_rsp_get_api_version *rsp_params; 1633 struct mc_command cmd = { 0 }; 1634 int err; 1635 1636 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION, 1637 cmd_flags, 1638 0); 1639 1640 err = mc_send_command(mc_io, &cmd); 1641 if (err) 1642 return err; 1643 1644 rsp_params = (struct dpni_rsp_get_api_version *)cmd.params; 1645 *major_ver = le16_to_cpu(rsp_params->major); 1646 *minor_ver = le16_to_cpu(rsp_params->minor); 1647 1648 return 0; 1649 } 1650 1651 /** 1652 * dpni_set_queue() - Set queue parameters 1653 * @mc_io: Pointer to MC portal's I/O object 1654 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1655 * @token: Token of DPNI object 1656 * @qtype: Type of queue - all queue types are supported, although 1657 * the command is ignored for Tx 1658 * @tc: Traffic class, in range 0 to NUM_TCS - 1 1659 * @index: Selects the specific queue out of the set allocated for the 1660 * same TC. Value must be in range 0 to NUM_QUEUES - 1 1661 * @options: A combination of DPNI_QUEUE_OPT_ values that control what 1662 * configuration options are set on the queue 1663 * @queue: Queue structure 1664 * 1665 * Return: '0' on Success; Error code otherwise. 1666 */ 1667 int dpni_set_queue(struct fsl_mc_io *mc_io, 1668 uint32_t cmd_flags, 1669 uint16_t token, 1670 enum dpni_queue_type qtype, 1671 uint8_t tc, 1672 uint8_t index, 1673 uint8_t options, 1674 const struct dpni_queue *queue) 1675 { 1676 struct mc_command cmd = { 0 }; 1677 struct dpni_cmd_set_queue *cmd_params; 1678 1679 /* prepare command */ 1680 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE, 1681 cmd_flags, 1682 token); 1683 cmd_params = (struct dpni_cmd_set_queue *)cmd.params; 1684 cmd_params->qtype = qtype; 1685 cmd_params->tc = tc; 1686 cmd_params->index = index; 1687 cmd_params->options = options; 1688 cmd_params->dest_id = cpu_to_le32(queue->destination.id); 1689 cmd_params->dest_prio = queue->destination.priority; 1690 dpni_set_field(cmd_params->flags, DEST_TYPE, queue->destination.type); 1691 dpni_set_field(cmd_params->flags, STASH_CTRL, queue->flc.stash_control); 1692 dpni_set_field(cmd_params->flags, HOLD_ACTIVE, 1693 queue->destination.hold_active); 1694 cmd_params->flc = cpu_to_le64(queue->flc.value); 1695 cmd_params->user_context = cpu_to_le64(queue->user_context); 1696 1697 /* send command to mc */ 1698 return mc_send_command(mc_io, &cmd); 1699 } 1700 1701 /** 1702 * dpni_get_queue() - Get queue parameters 1703 * @mc_io: Pointer to MC portal's I/O object 1704 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1705 * @token: Token of DPNI object 1706 * @qtype: Type of queue - all queue types are supported 1707 * @tc: Traffic class, in range 0 to NUM_TCS - 1 1708 * @index: Selects the specific queue out of the set allocated for the 1709 * same TC. Value must be in range 0 to NUM_QUEUES - 1 1710 * @queue: Queue configuration structure 1711 * @qid: Queue identification 1712 * 1713 * Return: '0' on Success; Error code otherwise. 1714 */ 1715 int dpni_get_queue(struct fsl_mc_io *mc_io, 1716 uint32_t cmd_flags, 1717 uint16_t token, 1718 enum dpni_queue_type qtype, 1719 uint8_t tc, 1720 uint8_t index, 1721 struct dpni_queue *queue, 1722 struct dpni_queue_id *qid) 1723 { 1724 struct mc_command cmd = { 0 }; 1725 struct dpni_cmd_get_queue *cmd_params; 1726 struct dpni_rsp_get_queue *rsp_params; 1727 int err; 1728 1729 /* prepare command */ 1730 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE, 1731 cmd_flags, 1732 token); 1733 cmd_params = (struct dpni_cmd_get_queue *)cmd.params; 1734 cmd_params->qtype = qtype; 1735 cmd_params->tc = tc; 1736 cmd_params->index = index; 1737 1738 /* send command to mc */ 1739 err = mc_send_command(mc_io, &cmd); 1740 if (err) 1741 return err; 1742 1743 /* retrieve response parameters */ 1744 rsp_params = (struct dpni_rsp_get_queue *)cmd.params; 1745 queue->destination.id = le32_to_cpu(rsp_params->dest_id); 1746 queue->destination.priority = rsp_params->dest_prio; 1747 queue->destination.type = dpni_get_field(rsp_params->flags, 1748 DEST_TYPE); 1749 queue->flc.stash_control = dpni_get_field(rsp_params->flags, 1750 STASH_CTRL); 1751 queue->destination.hold_active = dpni_get_field(rsp_params->flags, 1752 HOLD_ACTIVE); 1753 queue->flc.value = le64_to_cpu(rsp_params->flc); 1754 queue->user_context = le64_to_cpu(rsp_params->user_context); 1755 qid->fqid = le32_to_cpu(rsp_params->fqid); 1756 qid->qdbin = le16_to_cpu(rsp_params->qdbin); 1757 1758 return 0; 1759 } 1760 1761 /** 1762 * dpni_get_statistics() - Get DPNI statistics 1763 * @mc_io: Pointer to MC portal's I/O object 1764 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1765 * @token: Token of DPNI object 1766 * @page: Selects the statistics page to retrieve, see 1767 * DPNI_GET_STATISTICS output. Pages are numbered 0 to 2. 1768 * @param: Custom parameter for some pages used to select 1769 * a certain statistic source, for example the TC. 1770 * @stat: Structure containing the statistics 1771 * 1772 * Return: '0' on Success; Error code otherwise. 1773 */ 1774 int dpni_get_statistics(struct fsl_mc_io *mc_io, 1775 uint32_t cmd_flags, 1776 uint16_t token, 1777 uint8_t page, 1778 uint8_t param, 1779 union dpni_statistics *stat) 1780 { 1781 struct mc_command cmd = { 0 }; 1782 struct dpni_cmd_get_statistics *cmd_params; 1783 struct dpni_rsp_get_statistics *rsp_params; 1784 int i, err; 1785 1786 /* prepare command */ 1787 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS, 1788 cmd_flags, 1789 token); 1790 cmd_params = (struct dpni_cmd_get_statistics *)cmd.params; 1791 cmd_params->page_number = page; 1792 cmd_params->param = param; 1793 1794 /* send command to mc */ 1795 err = mc_send_command(mc_io, &cmd); 1796 if (err) 1797 return err; 1798 1799 /* retrieve response parameters */ 1800 rsp_params = (struct dpni_rsp_get_statistics *)cmd.params; 1801 for (i = 0; i < DPNI_STATISTICS_CNT; i++) 1802 stat->raw.counter[i] = le64_to_cpu(rsp_params->counter[i]); 1803 1804 return 0; 1805 } 1806 1807 /** 1808 * dpni_reset_statistics() - Clears DPNI statistics 1809 * @mc_io: Pointer to MC portal's I/O object 1810 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1811 * @token: Token of DPNI object 1812 * 1813 * Return: '0' on Success; Error code otherwise. 1814 */ 1815 int dpni_reset_statistics(struct fsl_mc_io *mc_io, 1816 uint32_t cmd_flags, 1817 uint16_t token) 1818 { 1819 struct mc_command cmd = { 0 }; 1820 1821 /* prepare command */ 1822 cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS, 1823 cmd_flags, 1824 token); 1825 1826 /* send command to mc*/ 1827 return mc_send_command(mc_io, &cmd); 1828 } 1829 1830 /** 1831 * dpni_set_taildrop() - Set taildrop per queue or TC 1832 * 1833 * Setting a per-TC taildrop (cg_point = DPNI_CP_GROUP) will reset any current 1834 * congestion notification or early drop (WRED) configuration previously applied 1835 * to the same TC. 1836 * 1837 * @mc_io: Pointer to MC portal's I/O object 1838 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1839 * @token: Token of DPNI object 1840 * @cg_point: Congestion point, DPNI_CP_QUEUE is only supported in 1841 * combination with DPNI_QUEUE_RX. 1842 * @q_type: Queue type, can be DPNI_QUEUE_RX or DPNI_QUEUE_TX. 1843 * @tc: Traffic class to apply this taildrop to 1844 * @q_index: Index of the queue if the DPNI supports multiple queues for 1845 * traffic distribution. 1846 * Ignored if CONGESTION_POINT is not DPNI_CP_QUEUE. 1847 * @taildrop: Taildrop structure 1848 * 1849 * Return: '0' on Success; Error code otherwise. 1850 */ 1851 int dpni_set_taildrop(struct fsl_mc_io *mc_io, 1852 uint32_t cmd_flags, 1853 uint16_t token, 1854 enum dpni_congestion_point cg_point, 1855 enum dpni_queue_type qtype, 1856 uint8_t tc, 1857 uint8_t index, 1858 struct dpni_taildrop *taildrop) 1859 { 1860 struct mc_command cmd = { 0 }; 1861 struct dpni_cmd_set_taildrop *cmd_params; 1862 1863 /* prepare command */ 1864 cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TAILDROP, 1865 cmd_flags, 1866 token); 1867 cmd_params = (struct dpni_cmd_set_taildrop *)cmd.params; 1868 cmd_params->congestion_point = cg_point; 1869 cmd_params->qtype = qtype; 1870 cmd_params->tc = tc; 1871 cmd_params->index = index; 1872 cmd_params->units = taildrop->units; 1873 cmd_params->threshold = cpu_to_le32(taildrop->threshold); 1874 dpni_set_field(cmd_params->enable_oal_lo, ENABLE, taildrop->enable); 1875 dpni_set_field(cmd_params->enable_oal_lo, OAL_LO, taildrop->oal); 1876 dpni_set_field(cmd_params->oal_hi, 1877 OAL_HI, 1878 taildrop->oal >> DPNI_OAL_LO_SIZE); 1879 1880 /* send command to mc */ 1881 return mc_send_command(mc_io, &cmd); 1882 } 1883 1884 /** 1885 * dpni_get_taildrop() - Get taildrop information 1886 * @mc_io: Pointer to MC portal's I/O object 1887 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1888 * @token: Token of DPNI object 1889 * @cg_point: Congestion point 1890 * @q_type: Queue type on which the taildrop is configured. 1891 * Only Rx queues are supported for now 1892 * @tc: Traffic class to apply this taildrop to 1893 * @q_index: Index of the queue if the DPNI supports multiple queues for 1894 * traffic distribution. Ignored if CONGESTION_POINT is not 0. 1895 * @taildrop: Taildrop structure 1896 * 1897 * Return: '0' on Success; Error code otherwise. 1898 */ 1899 int dpni_get_taildrop(struct fsl_mc_io *mc_io, 1900 uint32_t cmd_flags, 1901 uint16_t token, 1902 enum dpni_congestion_point cg_point, 1903 enum dpni_queue_type qtype, 1904 uint8_t tc, 1905 uint8_t index, 1906 struct dpni_taildrop *taildrop) 1907 { 1908 struct mc_command cmd = { 0 }; 1909 struct dpni_cmd_get_taildrop *cmd_params; 1910 struct dpni_rsp_get_taildrop *rsp_params; 1911 uint8_t oal_lo, oal_hi; 1912 int err; 1913 1914 /* prepare command */ 1915 cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TAILDROP, 1916 cmd_flags, 1917 token); 1918 cmd_params = (struct dpni_cmd_get_taildrop *)cmd.params; 1919 cmd_params->congestion_point = cg_point; 1920 cmd_params->qtype = qtype; 1921 cmd_params->tc = tc; 1922 cmd_params->index = index; 1923 1924 /* send command to mc */ 1925 err = mc_send_command(mc_io, &cmd); 1926 if (err) 1927 return err; 1928 1929 /* retrieve response parameters */ 1930 rsp_params = (struct dpni_rsp_get_taildrop *)cmd.params; 1931 taildrop->enable = dpni_get_field(rsp_params->enable_oal_lo, ENABLE); 1932 taildrop->units = rsp_params->units; 1933 taildrop->threshold = le32_to_cpu(rsp_params->threshold); 1934 oal_lo = dpni_get_field(rsp_params->enable_oal_lo, OAL_LO); 1935 oal_hi = dpni_get_field(rsp_params->oal_hi, OAL_HI); 1936 taildrop->oal = oal_hi << DPNI_OAL_LO_SIZE | oal_lo; 1937 1938 /* Fill the first 4 bits, 'oal' is a 2's complement value of 12 bits */ 1939 if (taildrop->oal >= 0x0800) 1940 taildrop->oal |= 0xF000; 1941 1942 return 0; 1943 } 1944