Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

be2net: fix some cmds to use mccq instead of mbox

All cmds issued to BE after the creation of mccq must now use the mcc-q
(and not mbox) to avoid a hw issue that results in mbox poll timeout.

Signed-off-by: Sathya Perla <sathyap@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Sathya Perla and committed by
David S. Miller
b31c50a7 03f18991

+271 -189
+1
drivers/net/benet/be.h
··· 362 362 extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, 363 363 u16 num_popped); 364 364 extern void be_link_status_update(struct be_adapter *adapter, bool link_up); 365 + extern void netdev_stats_update(struct be_adapter *adapter); 365 366 extern int be_load_fw(struct be_adapter *adapter, u8 *func); 366 367 #endif /* BE_H */
+246 -166
drivers/net/benet/be_cmds.c
··· 59 59 60 60 compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) & 61 61 CQE_STATUS_COMPL_MASK; 62 - if (compl_status != MCC_STATUS_SUCCESS) { 62 + if (compl_status == MCC_STATUS_SUCCESS) { 63 + if (compl->tag0 == OPCODE_ETH_GET_STATISTICS) { 64 + struct be_cmd_resp_get_stats *resp = 65 + adapter->stats.cmd.va; 66 + be_dws_le_to_cpu(&resp->hw_stats, 67 + sizeof(resp->hw_stats)); 68 + netdev_stats_update(adapter); 69 + } 70 + } else if (compl_status != MCC_STATUS_NOT_SUPPORTED) { 63 71 extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) & 64 72 CQE_STATUS_EXTD_MASK; 65 73 dev_warn(&adapter->pdev->dev, 66 74 "Error in cmd completion: status(compl/extd)=%d/%d\n", 67 75 compl_status, extd_status); 68 - return -1; 69 76 } 70 - return 0; 77 + return compl_status; 71 78 } 72 79 73 80 /* Link state evt is a string of bytes; no need for endian swapping */ ··· 104 97 return NULL; 105 98 } 106 99 107 - void be_process_mcc(struct be_adapter *adapter) 100 + int be_process_mcc(struct be_adapter *adapter) 108 101 { 109 102 struct be_mcc_compl *compl; 110 - int num = 0; 103 + int num = 0, status = 0; 111 104 112 105 spin_lock_bh(&adapter->mcc_cq_lock); 113 106 while ((compl = be_mcc_compl_get(adapter))) { ··· 118 111 /* Interpret compl as a async link evt */ 119 112 be_async_link_state_process(adapter, 120 113 (struct be_async_event_link_state *) compl); 121 - } else { 122 - be_mcc_compl_process(adapter, compl); 123 - atomic_dec(&adapter->mcc_obj.q.used); 114 + } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { 115 + status = be_mcc_compl_process(adapter, compl); 116 + atomic_dec(&adapter->mcc_obj.q.used); 124 117 } 125 118 be_mcc_compl_use(compl); 126 119 num++; 127 120 } 121 + 128 122 if (num) 129 123 be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, num); 124 + 130 125 spin_unlock_bh(&adapter->mcc_cq_lock); 126 + return status; 131 127 } 132 128 133 129 /* Wait till no more pending mcc requests are present */ 134 - static void be_mcc_wait_compl(struct be_adapter *adapter) 130 + static int be_mcc_wait_compl(struct be_adapter *adapter) 135 131 { 136 - #define mcc_timeout 50000 /* 5s timeout */ 137 - int i; 132 + #define mcc_timeout 120000 /* 12s timeout */ 133 + int i, status; 138 134 for (i = 0; i < mcc_timeout; i++) { 139 - be_process_mcc(adapter); 135 + status = be_process_mcc(adapter); 136 + if (status) 137 + return status; 138 + 140 139 if (atomic_read(&adapter->mcc_obj.q.used) == 0) 141 140 break; 142 141 udelay(100); 143 142 } 144 - if (i == mcc_timeout) 143 + if (i == mcc_timeout) { 145 144 dev_err(&adapter->pdev->dev, "mccq poll timed out\n"); 145 + return -1; 146 + } 147 + return 0; 146 148 } 147 149 148 150 /* Notify MCC requests and wait for completion */ 149 - static void be_mcc_notify_wait(struct be_adapter *adapter) 151 + static int be_mcc_notify_wait(struct be_adapter *adapter) 150 152 { 151 153 be_mcc_notify(adapter); 152 - be_mcc_wait_compl(adapter); 154 + return be_mcc_wait_compl(adapter); 153 155 } 154 156 155 157 static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db) ··· 189 173 * Insert the mailbox address into the doorbell in two steps 190 174 * Polls on the mbox doorbell till a command completion (or a timeout) occurs 191 175 */ 192 - static int be_mbox_notify(struct be_adapter *adapter) 176 + static int be_mbox_notify_wait(struct be_adapter *adapter) 193 177 { 194 178 int status; 195 179 u32 val = 0; ··· 197 181 struct be_dma_mem *mbox_mem = &adapter->mbox_mem; 198 182 struct be_mcc_mailbox *mbox = mbox_mem->va; 199 183 struct be_mcc_compl *compl = &mbox->compl; 200 - 201 - memset(compl, 0, sizeof(*compl)); 202 184 203 185 val |= MPU_MAILBOX_DB_HI_MASK; 204 186 /* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */ ··· 324 310 return multiplier; 325 311 } 326 312 327 - static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem) 313 + static inline struct be_mcc_wrb *wrb_from_mbox(struct be_adapter *adapter) 328 314 { 329 - return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb; 315 + struct be_dma_mem *mbox_mem = &adapter->mbox_mem; 316 + struct be_mcc_wrb *wrb 317 + = &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb; 318 + memset(wrb, 0, sizeof(*wrb)); 319 + return wrb; 330 320 } 331 321 332 - static inline struct be_mcc_wrb *wrb_from_mcc(struct be_queue_info *mccq) 322 + static struct be_mcc_wrb *wrb_from_mccq(struct be_adapter *adapter) 333 323 { 334 - struct be_mcc_wrb *wrb = NULL; 335 - if (atomic_read(&mccq->used) < mccq->len) { 336 - wrb = queue_head_node(mccq); 337 - queue_head_inc(mccq); 338 - atomic_inc(&mccq->used); 339 - memset(wrb, 0, sizeof(*wrb)); 340 - } 324 + struct be_queue_info *mccq = &adapter->mcc_obj.q; 325 + struct be_mcc_wrb *wrb; 326 + 327 + BUG_ON(atomic_read(&mccq->used) >= mccq->len); 328 + wrb = queue_head_node(mccq); 329 + queue_head_inc(mccq); 330 + atomic_inc(&mccq->used); 331 + memset(wrb, 0, sizeof(*wrb)); 341 332 return wrb; 342 333 } 343 334 344 335 int be_cmd_eq_create(struct be_adapter *adapter, 345 336 struct be_queue_info *eq, int eq_delay) 346 337 { 347 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 348 - struct be_cmd_req_eq_create *req = embedded_payload(wrb); 349 - struct be_cmd_resp_eq_create *resp = embedded_payload(wrb); 338 + struct be_mcc_wrb *wrb; 339 + struct be_cmd_req_eq_create *req; 350 340 struct be_dma_mem *q_mem = &eq->dma_mem; 351 341 int status; 352 342 353 343 spin_lock(&adapter->mbox_lock); 354 - memset(wrb, 0, sizeof(*wrb)); 344 + 345 + wrb = wrb_from_mbox(adapter); 346 + req = embedded_payload(wrb); 355 347 356 348 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 357 349 ··· 379 359 380 360 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 381 361 382 - status = be_mbox_notify(adapter); 362 + status = be_mbox_notify_wait(adapter); 383 363 if (!status) { 364 + struct be_cmd_resp_eq_create *resp = embedded_payload(wrb); 384 365 eq->id = le16_to_cpu(resp->eq_id); 385 366 eq->created = true; 386 367 } 368 + 387 369 spin_unlock(&adapter->mbox_lock); 388 370 return status; 389 371 } 390 372 373 + /* Uses mbox */ 391 374 int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, 392 375 u8 type, bool permanent, u32 if_handle) 393 376 { 394 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 395 - struct be_cmd_req_mac_query *req = embedded_payload(wrb); 396 - struct be_cmd_resp_mac_query *resp = embedded_payload(wrb); 377 + struct be_mcc_wrb *wrb; 378 + struct be_cmd_req_mac_query *req; 397 379 int status; 398 380 399 381 spin_lock(&adapter->mbox_lock); 400 - memset(wrb, 0, sizeof(*wrb)); 382 + 383 + wrb = wrb_from_mbox(adapter); 384 + req = embedded_payload(wrb); 401 385 402 386 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 403 387 ··· 412 388 if (permanent) { 413 389 req->permanent = 1; 414 390 } else { 415 - req->if_id = cpu_to_le16((u16)if_handle); 391 + req->if_id = cpu_to_le16((u16) if_handle); 416 392 req->permanent = 0; 417 393 } 418 394 419 - status = be_mbox_notify(adapter); 420 - if (!status) 395 + status = be_mbox_notify_wait(adapter); 396 + if (!status) { 397 + struct be_cmd_resp_mac_query *resp = embedded_payload(wrb); 421 398 memcpy(mac_addr, resp->mac.addr, ETH_ALEN); 399 + } 422 400 423 401 spin_unlock(&adapter->mbox_lock); 424 402 return status; 425 403 } 426 404 405 + /* Uses synchronous MCCQ */ 427 406 int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, 428 407 u32 if_id, u32 *pmac_id) 429 408 { 430 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 431 - struct be_cmd_req_pmac_add *req = embedded_payload(wrb); 409 + struct be_mcc_wrb *wrb; 410 + struct be_cmd_req_pmac_add *req; 432 411 int status; 433 412 434 - spin_lock(&adapter->mbox_lock); 435 - memset(wrb, 0, sizeof(*wrb)); 413 + spin_lock_bh(&adapter->mcc_lock); 414 + 415 + wrb = wrb_from_mccq(adapter); 416 + req = embedded_payload(wrb); 436 417 437 418 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 438 419 ··· 447 418 req->if_id = cpu_to_le32(if_id); 448 419 memcpy(req->mac_address, mac_addr, ETH_ALEN); 449 420 450 - status = be_mbox_notify(adapter); 421 + status = be_mcc_notify_wait(adapter); 451 422 if (!status) { 452 423 struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb); 453 424 *pmac_id = le32_to_cpu(resp->pmac_id); 454 425 } 455 426 456 - spin_unlock(&adapter->mbox_lock); 427 + spin_unlock_bh(&adapter->mcc_lock); 457 428 return status; 458 429 } 459 430 431 + /* Uses synchronous MCCQ */ 460 432 int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id) 461 433 { 462 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 463 - struct be_cmd_req_pmac_del *req = embedded_payload(wrb); 434 + struct be_mcc_wrb *wrb; 435 + struct be_cmd_req_pmac_del *req; 464 436 int status; 465 437 466 - spin_lock(&adapter->mbox_lock); 467 - memset(wrb, 0, sizeof(*wrb)); 438 + spin_lock_bh(&adapter->mcc_lock); 439 + 440 + wrb = wrb_from_mccq(adapter); 441 + req = embedded_payload(wrb); 468 442 469 443 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 470 444 ··· 477 445 req->if_id = cpu_to_le32(if_id); 478 446 req->pmac_id = cpu_to_le32(pmac_id); 479 447 480 - status = be_mbox_notify(adapter); 481 - spin_unlock(&adapter->mbox_lock); 448 + status = be_mcc_notify_wait(adapter); 449 + 450 + spin_unlock_bh(&adapter->mcc_lock); 482 451 483 452 return status; 484 453 } 485 454 455 + /* Uses Mbox */ 486 456 int be_cmd_cq_create(struct be_adapter *adapter, 487 457 struct be_queue_info *cq, struct be_queue_info *eq, 488 458 bool sol_evts, bool no_delay, int coalesce_wm) 489 459 { 490 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 491 - struct be_cmd_req_cq_create *req = embedded_payload(wrb); 492 - struct be_cmd_resp_cq_create *resp = embedded_payload(wrb); 460 + struct be_mcc_wrb *wrb; 461 + struct be_cmd_req_cq_create *req; 493 462 struct be_dma_mem *q_mem = &cq->dma_mem; 494 - void *ctxt = &req->context; 463 + void *ctxt; 495 464 int status; 496 465 497 466 spin_lock(&adapter->mbox_lock); 498 - memset(wrb, 0, sizeof(*wrb)); 467 + 468 + wrb = wrb_from_mbox(adapter); 469 + req = embedded_payload(wrb); 470 + ctxt = &req->context; 499 471 500 472 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 501 473 ··· 522 486 523 487 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 524 488 525 - status = be_mbox_notify(adapter); 489 + status = be_mbox_notify_wait(adapter); 526 490 if (!status) { 491 + struct be_cmd_resp_cq_create *resp = embedded_payload(wrb); 527 492 cq->id = le16_to_cpu(resp->cq_id); 528 493 cq->created = true; 529 494 } 495 + 530 496 spin_unlock(&adapter->mbox_lock); 531 497 532 498 return status; ··· 546 508 struct be_queue_info *mccq, 547 509 struct be_queue_info *cq) 548 510 { 549 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 550 - struct be_cmd_req_mcc_create *req = embedded_payload(wrb); 511 + struct be_mcc_wrb *wrb; 512 + struct be_cmd_req_mcc_create *req; 551 513 struct be_dma_mem *q_mem = &mccq->dma_mem; 552 - void *ctxt = &req->context; 514 + void *ctxt; 553 515 int status; 554 516 555 517 spin_lock(&adapter->mbox_lock); 556 - memset(wrb, 0, sizeof(*wrb)); 518 + 519 + wrb = wrb_from_mbox(adapter); 520 + req = embedded_payload(wrb); 521 + ctxt = &req->context; 557 522 558 523 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 559 524 ··· 575 534 576 535 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 577 536 578 - status = be_mbox_notify(adapter); 537 + status = be_mbox_notify_wait(adapter); 579 538 if (!status) { 580 539 struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb); 581 540 mccq->id = le16_to_cpu(resp->id); ··· 590 549 struct be_queue_info *txq, 591 550 struct be_queue_info *cq) 592 551 { 593 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 594 - struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb); 552 + struct be_mcc_wrb *wrb; 553 + struct be_cmd_req_eth_tx_create *req; 595 554 struct be_dma_mem *q_mem = &txq->dma_mem; 596 - void *ctxt = &req->context; 555 + void *ctxt; 597 556 int status; 598 - u32 len_encoded; 599 557 600 558 spin_lock(&adapter->mbox_lock); 601 - memset(wrb, 0, sizeof(*wrb)); 559 + 560 + wrb = wrb_from_mbox(adapter); 561 + req = embedded_payload(wrb); 562 + ctxt = &req->context; 602 563 603 564 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 604 565 ··· 611 568 req->ulp_num = BE_ULP1_NUM; 612 569 req->type = BE_ETH_TX_RING_TYPE_STANDARD; 613 570 614 - len_encoded = fls(txq->len); /* log2(len) + 1 */ 615 - if (len_encoded == 16) 616 - len_encoded = 0; 617 - AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded); 571 + AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, 572 + be_encoded_q_len(txq->len)); 618 573 AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt, 619 574 be_pci_func(adapter)); 620 575 AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1); ··· 622 581 623 582 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 624 583 625 - status = be_mbox_notify(adapter); 584 + status = be_mbox_notify_wait(adapter); 626 585 if (!status) { 627 586 struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb); 628 587 txq->id = le16_to_cpu(resp->cid); 629 588 txq->created = true; 630 589 } 590 + 631 591 spin_unlock(&adapter->mbox_lock); 632 592 633 593 return status; 634 594 } 635 595 596 + /* Uses mbox */ 636 597 int be_cmd_rxq_create(struct be_adapter *adapter, 637 598 struct be_queue_info *rxq, u16 cq_id, u16 frag_size, 638 599 u16 max_frame_size, u32 if_id, u32 rss) 639 600 { 640 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 641 - struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb); 601 + struct be_mcc_wrb *wrb; 602 + struct be_cmd_req_eth_rx_create *req; 642 603 struct be_dma_mem *q_mem = &rxq->dma_mem; 643 604 int status; 644 605 645 606 spin_lock(&adapter->mbox_lock); 646 - memset(wrb, 0, sizeof(*wrb)); 607 + 608 + wrb = wrb_from_mbox(adapter); 609 + req = embedded_payload(wrb); 647 610 648 611 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 649 612 ··· 662 617 req->max_frame_size = cpu_to_le16(max_frame_size); 663 618 req->rss_queue = cpu_to_le32(rss); 664 619 665 - status = be_mbox_notify(adapter); 620 + status = be_mbox_notify_wait(adapter); 666 621 if (!status) { 667 622 struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb); 668 623 rxq->id = le16_to_cpu(resp->id); 669 624 rxq->created = true; 670 625 } 626 + 671 627 spin_unlock(&adapter->mbox_lock); 672 628 673 629 return status; 674 630 } 675 631 676 - /* Generic destroyer function for all types of queues */ 632 + /* Generic destroyer function for all types of queues 633 + * Uses Mbox 634 + */ 677 635 int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q, 678 636 int queue_type) 679 637 { 680 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 681 - struct be_cmd_req_q_destroy *req = embedded_payload(wrb); 638 + struct be_mcc_wrb *wrb; 639 + struct be_cmd_req_q_destroy *req; 682 640 u8 subsys = 0, opcode = 0; 683 641 int status; 684 642 685 643 spin_lock(&adapter->mbox_lock); 686 644 687 - memset(wrb, 0, sizeof(*wrb)); 645 + wrb = wrb_from_mbox(adapter); 646 + req = embedded_payload(wrb); 647 + 688 648 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 689 649 690 650 switch (queue_type) { ··· 719 669 be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req)); 720 670 req->id = cpu_to_le16(q->id); 721 671 722 - status = be_mbox_notify(adapter); 672 + status = be_mbox_notify_wait(adapter); 723 673 724 674 spin_unlock(&adapter->mbox_lock); 725 675 726 676 return status; 727 677 } 728 678 729 - /* Create an rx filtering policy configuration on an i/f */ 679 + /* Create an rx filtering policy configuration on an i/f 680 + * Uses mbox 681 + */ 730 682 int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, 731 683 bool pmac_invalid, u32 *if_handle, u32 *pmac_id) 732 684 { 733 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 734 - struct be_cmd_req_if_create *req = embedded_payload(wrb); 685 + struct be_mcc_wrb *wrb; 686 + struct be_cmd_req_if_create *req; 735 687 int status; 736 688 737 689 spin_lock(&adapter->mbox_lock); 738 - memset(wrb, 0, sizeof(*wrb)); 690 + 691 + wrb = wrb_from_mbox(adapter); 692 + req = embedded_payload(wrb); 739 693 740 694 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 741 695 ··· 748 694 749 695 req->capability_flags = cpu_to_le32(flags); 750 696 req->enable_flags = cpu_to_le32(flags); 697 + req->pmac_invalid = pmac_invalid; 751 698 if (!pmac_invalid) 752 699 memcpy(req->mac_addr, mac, ETH_ALEN); 753 700 754 - status = be_mbox_notify(adapter); 701 + status = be_mbox_notify_wait(adapter); 755 702 if (!status) { 756 703 struct be_cmd_resp_if_create *resp = embedded_payload(wrb); 757 704 *if_handle = le32_to_cpu(resp->interface_id); ··· 764 709 return status; 765 710 } 766 711 712 + /* Uses mbox */ 767 713 int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id) 768 714 { 769 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 770 - struct be_cmd_req_if_destroy *req = embedded_payload(wrb); 715 + struct be_mcc_wrb *wrb; 716 + struct be_cmd_req_if_destroy *req; 771 717 int status; 772 718 773 719 spin_lock(&adapter->mbox_lock); 774 - memset(wrb, 0, sizeof(*wrb)); 720 + 721 + wrb = wrb_from_mbox(adapter); 722 + req = embedded_payload(wrb); 775 723 776 724 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 777 725 ··· 782 724 OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req)); 783 725 784 726 req->interface_id = cpu_to_le32(interface_id); 785 - status = be_mbox_notify(adapter); 727 + 728 + status = be_mbox_notify_wait(adapter); 786 729 787 730 spin_unlock(&adapter->mbox_lock); 788 731 ··· 792 733 793 734 /* Get stats is a non embedded command: the request is not embedded inside 794 735 * WRB but is a separate dma memory block 736 + * Uses asynchronous MCC 795 737 */ 796 738 int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) 797 739 { 798 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 799 - struct be_cmd_req_get_stats *req = nonemb_cmd->va; 800 - struct be_sge *sge = nonembedded_sgl(wrb); 801 - int status; 740 + struct be_mcc_wrb *wrb; 741 + struct be_cmd_req_get_stats *req; 742 + struct be_sge *sge; 802 743 803 - spin_lock(&adapter->mbox_lock); 804 - memset(wrb, 0, sizeof(*wrb)); 744 + spin_lock_bh(&adapter->mcc_lock); 805 745 806 - memset(req, 0, sizeof(*req)); 746 + wrb = wrb_from_mccq(adapter); 747 + req = nonemb_cmd->va; 748 + sge = nonembedded_sgl(wrb); 807 749 808 750 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); 751 + wrb->tag0 = OPCODE_ETH_GET_STATISTICS; 809 752 810 753 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, 811 754 OPCODE_ETH_GET_STATISTICS, sizeof(*req)); ··· 815 754 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF); 816 755 sge->len = cpu_to_le32(nonemb_cmd->size); 817 756 818 - status = be_mbox_notify(adapter); 819 - if (!status) { 820 - struct be_cmd_resp_get_stats *resp = nonemb_cmd->va; 821 - be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats)); 822 - } 757 + be_mcc_notify(adapter); 823 758 824 - spin_unlock(&adapter->mbox_lock); 825 - return status; 759 + spin_unlock_bh(&adapter->mcc_lock); 760 + return 0; 826 761 } 827 762 763 + /* Uses synchronous mcc */ 828 764 int be_cmd_link_status_query(struct be_adapter *adapter, 829 765 bool *link_up) 830 766 { 831 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 832 - struct be_cmd_req_link_status *req = embedded_payload(wrb); 767 + struct be_mcc_wrb *wrb; 768 + struct be_cmd_req_link_status *req; 833 769 int status; 834 770 835 - spin_lock(&adapter->mbox_lock); 771 + spin_lock_bh(&adapter->mcc_lock); 772 + 773 + wrb = wrb_from_mccq(adapter); 774 + req = embedded_payload(wrb); 836 775 837 776 *link_up = false; 838 - memset(wrb, 0, sizeof(*wrb)); 839 777 840 778 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 841 779 842 780 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 843 781 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req)); 844 782 845 - status = be_mbox_notify(adapter); 783 + status = be_mcc_notify_wait(adapter); 846 784 if (!status) { 847 785 struct be_cmd_resp_link_status *resp = embedded_payload(wrb); 848 786 if (resp->mac_speed != PHY_LINK_SPEED_ZERO) 849 787 *link_up = true; 850 788 } 851 789 852 - spin_unlock(&adapter->mbox_lock); 790 + spin_unlock_bh(&adapter->mcc_lock); 853 791 return status; 854 792 } 855 793 794 + /* Uses Mbox */ 856 795 int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) 857 796 { 858 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 859 - struct be_cmd_req_get_fw_version *req = embedded_payload(wrb); 797 + struct be_mcc_wrb *wrb; 798 + struct be_cmd_req_get_fw_version *req; 860 799 int status; 861 800 862 801 spin_lock(&adapter->mbox_lock); 863 - memset(wrb, 0, sizeof(*wrb)); 802 + 803 + wrb = wrb_from_mbox(adapter); 804 + req = embedded_payload(wrb); 864 805 865 806 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 866 807 867 808 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 868 809 OPCODE_COMMON_GET_FW_VERSION, sizeof(*req)); 869 810 870 - status = be_mbox_notify(adapter); 811 + status = be_mbox_notify_wait(adapter); 871 812 if (!status) { 872 813 struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); 873 814 strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN); ··· 879 816 return status; 880 817 } 881 818 882 - /* set the EQ delay interval of an EQ to specified value */ 819 + /* set the EQ delay interval of an EQ to specified value 820 + * Uses async mcc 821 + */ 883 822 int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd) 884 823 { 885 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 886 - struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb); 887 - int status; 824 + struct be_mcc_wrb *wrb; 825 + struct be_cmd_req_modify_eq_delay *req; 888 826 889 - spin_lock(&adapter->mbox_lock); 890 - memset(wrb, 0, sizeof(*wrb)); 827 + spin_lock_bh(&adapter->mcc_lock); 828 + 829 + wrb = wrb_from_mccq(adapter); 830 + req = embedded_payload(wrb); 891 831 892 832 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 893 833 ··· 902 836 req->delay[0].phase = 0; 903 837 req->delay[0].delay_multiplier = cpu_to_le32(eqd); 904 838 905 - status = be_mbox_notify(adapter); 839 + be_mcc_notify(adapter); 906 840 907 - spin_unlock(&adapter->mbox_lock); 908 - return status; 841 + spin_unlock_bh(&adapter->mcc_lock); 842 + return 0; 909 843 } 910 844 845 + /* Uses sycnhronous mcc */ 911 846 int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, 912 847 u32 num, bool untagged, bool promiscuous) 913 848 { 914 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 915 - struct be_cmd_req_vlan_config *req = embedded_payload(wrb); 849 + struct be_mcc_wrb *wrb; 850 + struct be_cmd_req_vlan_config *req; 916 851 int status; 917 852 918 - spin_lock(&adapter->mbox_lock); 919 - memset(wrb, 0, sizeof(*wrb)); 853 + spin_lock_bh(&adapter->mcc_lock); 854 + 855 + wrb = wrb_from_mccq(adapter); 856 + req = embedded_payload(wrb); 920 857 921 858 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 922 859 ··· 935 866 req->num_vlan * sizeof(vtag_array[0])); 936 867 } 937 868 938 - status = be_mbox_notify(adapter); 869 + status = be_mcc_notify_wait(adapter); 939 870 940 - spin_unlock(&adapter->mbox_lock); 871 + spin_unlock_bh(&adapter->mcc_lock); 941 872 return status; 942 873 } 943 874 944 - /* Use MCC for this command as it may be called in BH context */ 875 + /* Uses MCC for this command as it may be called in BH context 876 + * Uses synchronous mcc 877 + */ 945 878 int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) 946 879 { 947 880 struct be_mcc_wrb *wrb; 948 881 struct be_cmd_req_promiscuous_config *req; 882 + int status; 949 883 950 884 spin_lock_bh(&adapter->mcc_lock); 951 885 952 - wrb = wrb_from_mcc(&adapter->mcc_obj.q); 953 - BUG_ON(!wrb); 954 - 886 + wrb = wrb_from_mccq(adapter); 955 887 req = embedded_payload(wrb); 956 888 957 889 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); ··· 965 895 else 966 896 req->port0_promiscuous = en; 967 897 968 - be_mcc_notify_wait(adapter); 898 + status = be_mcc_notify_wait(adapter); 969 899 970 900 spin_unlock_bh(&adapter->mcc_lock); 971 - return 0; 901 + return status; 972 902 } 973 903 974 904 /* 975 - * Use MCC for this command as it may be called in BH context 905 + * Uses MCC for this command as it may be called in BH context 976 906 * (mc == NULL) => multicast promiscous 977 907 */ 978 908 int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id, ··· 984 914 985 915 spin_lock_bh(&adapter->mcc_lock); 986 916 987 - wrb = wrb_from_mcc(&adapter->mcc_obj.q); 988 - BUG_ON(!wrb); 989 - 917 + wrb = wrb_from_mccq(adapter); 990 918 req = embedded_payload(wrb); 991 919 992 920 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); ··· 1012 944 return 0; 1013 945 } 1014 946 947 + /* Uses synchrounous mcc */ 1015 948 int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc) 1016 949 { 1017 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 1018 - struct be_cmd_req_set_flow_control *req = embedded_payload(wrb); 950 + struct be_mcc_wrb *wrb; 951 + struct be_cmd_req_set_flow_control *req; 1019 952 int status; 1020 953 1021 - spin_lock(&adapter->mbox_lock); 954 + spin_lock_bh(&adapter->mcc_lock); 1022 955 1023 - memset(wrb, 0, sizeof(*wrb)); 956 + wrb = wrb_from_mccq(adapter); 957 + req = embedded_payload(wrb); 1024 958 1025 959 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1026 960 ··· 1032 962 req->tx_flow_control = cpu_to_le16((u16)tx_fc); 1033 963 req->rx_flow_control = cpu_to_le16((u16)rx_fc); 1034 964 1035 - status = be_mbox_notify(adapter); 965 + status = be_mcc_notify_wait(adapter); 1036 966 1037 - spin_unlock(&adapter->mbox_lock); 967 + spin_unlock_bh(&adapter->mcc_lock); 1038 968 return status; 1039 969 } 1040 970 971 + /* Uses sycn mcc */ 1041 972 int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc) 1042 973 { 1043 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 1044 - struct be_cmd_req_get_flow_control *req = embedded_payload(wrb); 974 + struct be_mcc_wrb *wrb; 975 + struct be_cmd_req_get_flow_control *req; 1045 976 int status; 1046 977 1047 - spin_lock(&adapter->mbox_lock); 978 + spin_lock_bh(&adapter->mcc_lock); 1048 979 1049 - memset(wrb, 0, sizeof(*wrb)); 980 + wrb = wrb_from_mccq(adapter); 981 + req = embedded_payload(wrb); 1050 982 1051 983 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1052 984 1053 985 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1054 986 OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req)); 1055 987 1056 - status = be_mbox_notify(adapter); 988 + status = be_mcc_notify_wait(adapter); 1057 989 if (!status) { 1058 990 struct be_cmd_resp_get_flow_control *resp = 1059 991 embedded_payload(wrb); ··· 1063 991 *rx_fc = le16_to_cpu(resp->rx_flow_control); 1064 992 } 1065 993 1066 - spin_unlock(&adapter->mbox_lock); 994 + spin_unlock_bh(&adapter->mcc_lock); 1067 995 return status; 1068 996 } 1069 997 998 + /* Uses mbox */ 1070 999 int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num) 1071 1000 { 1072 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 1073 - struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb); 1001 + struct be_mcc_wrb *wrb; 1002 + struct be_cmd_req_query_fw_cfg *req; 1074 1003 int status; 1075 1004 1076 1005 spin_lock(&adapter->mbox_lock); 1077 1006 1078 - memset(wrb, 0, sizeof(*wrb)); 1007 + wrb = wrb_from_mbox(adapter); 1008 + req = embedded_payload(wrb); 1079 1009 1080 1010 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1081 1011 1082 1012 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1083 1013 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req)); 1084 1014 1085 - status = be_mbox_notify(adapter); 1015 + status = be_mbox_notify_wait(adapter); 1086 1016 if (!status) { 1087 1017 struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb); 1088 1018 *port_num = le32_to_cpu(resp->phys_port); ··· 1094 1020 return status; 1095 1021 } 1096 1022 1023 + /* Uses mbox */ 1097 1024 int be_cmd_reset_function(struct be_adapter *adapter) 1098 1025 { 1099 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 1100 - struct be_cmd_req_hdr *req = embedded_payload(wrb); 1026 + struct be_mcc_wrb *wrb; 1027 + struct be_cmd_req_hdr *req; 1101 1028 int status; 1102 1029 1103 1030 spin_lock(&adapter->mbox_lock); 1104 1031 1105 - memset(wrb, 0, sizeof(*wrb)); 1032 + wrb = wrb_from_mbox(adapter); 1033 + req = embedded_payload(wrb); 1106 1034 1107 1035 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1108 1036 1109 1037 be_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON, 1110 1038 OPCODE_COMMON_FUNCTION_RESET, sizeof(*req)); 1111 1039 1112 - status = be_mbox_notify(adapter); 1040 + status = be_mbox_notify_wait(adapter); 1113 1041 1114 1042 spin_unlock(&adapter->mbox_lock); 1115 1043 return status; ··· 1120 1044 int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, 1121 1045 u32 flash_type, u32 flash_opcode, u32 buf_size) 1122 1046 { 1123 - struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); 1047 + struct be_mcc_wrb *wrb; 1124 1048 struct be_cmd_write_flashrom *req = cmd->va; 1125 - struct be_sge *sge = nonembedded_sgl(wrb); 1049 + struct be_sge *sge; 1126 1050 int status; 1127 1051 1128 - spin_lock(&adapter->mbox_lock); 1129 - memset(wrb, 0, sizeof(*wrb)); 1052 + spin_lock_bh(&adapter->mcc_lock); 1053 + 1054 + wrb = wrb_from_mccq(adapter); 1055 + req = embedded_payload(wrb); 1056 + sge = nonembedded_sgl(wrb); 1057 + 1130 1058 be_wrb_hdr_prepare(wrb, cmd->size, false, 1); 1131 1059 1132 1060 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, ··· 1143 1063 req->params.op_code = cpu_to_le32(flash_opcode); 1144 1064 req->params.data_buf_size = cpu_to_le32(buf_size); 1145 1065 1146 - status = be_mbox_notify(adapter); 1066 + status = be_mcc_notify_wait(adapter); 1147 1067 1148 - spin_unlock(&adapter->mbox_lock); 1068 + spin_unlock_bh(&adapter->mcc_lock); 1149 1069 return status; 1150 1070 }
+3 -2
drivers/net/benet/be_cmds.h
··· 61 61 /* The command is completing because the queue was getting flushed */ 62 62 MCC_STATUS_QUEUE_FLUSHING = 0x4, 63 63 /* The command is completing with a DMA error */ 64 - MCC_STATUS_DMA_FAILED = 0x5 64 + MCC_STATUS_DMA_FAILED = 0x5, 65 + MCC_STATUS_NOT_SUPPORTED = 0x66 65 66 }; 66 67 67 68 #define CQE_STATUS_COMPL_MASK 0xFFFF ··· 762 761 u32 *tx_fc, u32 *rx_fc); 763 762 extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num); 764 763 extern int be_cmd_reset_function(struct be_adapter *adapter); 765 - extern void be_process_mcc(struct be_adapter *adapter); 764 + extern int be_process_mcc(struct be_adapter *adapter); 766 765 extern int be_cmd_write_flashrom(struct be_adapter *adapter, 767 766 struct be_dma_mem *cmd, u32 flash_oper, 768 767 u32 flash_opcode, u32 buf_size);
+21 -21
drivers/net/benet/be_main.c
··· 135 135 return status; 136 136 } 137 137 138 - static void netdev_stats_update(struct be_adapter *adapter) 138 + void netdev_stats_update(struct be_adapter *adapter) 139 139 { 140 140 struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va); 141 141 struct be_rxf_stats *rxf_stats = &hw_stats->rxf; ··· 431 431 } 432 432 433 433 static netdev_tx_t be_xmit(struct sk_buff *skb, 434 - struct net_device *netdev) 435 - 434 + struct net_device *netdev) 436 435 { 437 436 struct be_adapter *adapter = netdev_priv(netdev); 438 437 struct be_tx_obj *tx_obj = &adapter->tx_obj; ··· 489 490 * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured, 490 491 * set the BE in promiscuous VLAN mode. 491 492 */ 492 - static void be_vid_config(struct net_device *netdev) 493 + static int be_vid_config(struct be_adapter *adapter) 493 494 { 494 - struct be_adapter *adapter = netdev_priv(netdev); 495 495 u16 vtag[BE_NUM_VLANS_SUPPORTED]; 496 496 u16 ntags = 0, i; 497 + int status; 497 498 498 499 if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) { 499 500 /* Construct VLAN Table to give to HW */ ··· 503 504 ntags++; 504 505 } 505 506 } 506 - be_cmd_vlan_config(adapter, adapter->if_handle, 507 - vtag, ntags, 1, 0); 507 + status = be_cmd_vlan_config(adapter, adapter->if_handle, 508 + vtag, ntags, 1, 0); 508 509 } else { 509 - be_cmd_vlan_config(adapter, adapter->if_handle, 510 - NULL, 0, 1, 1); 510 + status = be_cmd_vlan_config(adapter, adapter->if_handle, 511 + NULL, 0, 1, 1); 511 512 } 513 + return status; 512 514 } 513 515 514 516 static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp) ··· 532 532 adapter->num_vlans++; 533 533 adapter->vlan_tag[vid] = 1; 534 534 535 - be_vid_config(netdev); 535 + be_vid_config(adapter); 536 536 } 537 537 538 538 static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) ··· 543 543 adapter->vlan_tag[vid] = 0; 544 544 545 545 vlan_group_set_device(adapter->vlan_grp, vid, NULL); 546 - be_vid_config(netdev); 546 + be_vid_config(adapter); 547 547 } 548 548 549 549 static void be_set_multicast_list(struct net_device *netdev) ··· 1444 1444 { 1445 1445 struct be_adapter *adapter = 1446 1446 container_of(work, struct be_adapter, work.work); 1447 - int status; 1448 1447 1449 - /* Get Stats */ 1450 - status = be_cmd_get_stats(adapter, &adapter->stats.cmd); 1451 - if (!status) 1452 - netdev_stats_update(adapter); 1448 + be_cmd_get_stats(adapter, &adapter->stats.cmd); 1453 1449 1454 1450 /* Set EQ delay */ 1455 1451 be_rx_eqd_update(adapter); ··· 1618 1622 if (status != 0) 1619 1623 goto do_none; 1620 1624 1621 - be_vid_config(netdev); 1622 - 1623 - status = be_cmd_set_flow_control(adapter, true, true); 1624 - if (status != 0) 1625 - goto if_destroy; 1626 1625 1627 1626 status = be_tx_queues_create(adapter); 1628 1627 if (status != 0) ··· 1631 1640 if (status != 0) 1632 1641 goto rx_qs_destroy; 1633 1642 1643 + status = be_vid_config(adapter); 1644 + if (status != 0) 1645 + goto mccqs_destroy; 1646 + 1647 + status = be_cmd_set_flow_control(adapter, true, true); 1648 + if (status != 0) 1649 + goto mccqs_destroy; 1634 1650 return 0; 1635 1651 1652 + mccqs_destroy: 1653 + be_mcc_queues_destroy(adapter); 1636 1654 rx_qs_destroy: 1637 1655 be_rx_queues_destroy(adapter); 1638 1656 tx_qs_destroy: