|
60 | 60 |
|
61 | 61 | #include "bnxt_hsi.h" |
62 | 62 | #include "bnxt.h" |
| 63 | +#include "bnxt_hwrm.h" |
63 | 64 | #include "bnxt_ulp.h" |
64 | 65 | #include "bnxt_sriov.h" |
65 | 66 | #include "bnxt_ethtool.h" |
@@ -4549,278 +4550,6 @@ static void bnxt_enable_int(struct bnxt *bp) |
4549 | 4550 | } |
4550 | 4551 | } |
4551 | 4552 |
|
4552 | | -void bnxt_hwrm_cmd_hdr_init(struct bnxt *bp, void *request, u16 req_type, |
4553 | | - u16 cmpl_ring, u16 target_id) |
4554 | | -{ |
4555 | | - struct input *req = request; |
4556 | | - |
4557 | | - req->req_type = cpu_to_le16(req_type); |
4558 | | - req->cmpl_ring = cpu_to_le16(cmpl_ring); |
4559 | | - req->target_id = cpu_to_le16(target_id); |
4560 | | - req->resp_addr = cpu_to_le64(bp->hwrm_cmd_resp_dma_addr); |
4561 | | -} |
4562 | | - |
4563 | | -static int bnxt_hwrm_to_stderr(u32 hwrm_err) |
4564 | | -{ |
4565 | | - switch (hwrm_err) { |
4566 | | - case HWRM_ERR_CODE_SUCCESS: |
4567 | | - return 0; |
4568 | | - case HWRM_ERR_CODE_RESOURCE_LOCKED: |
4569 | | - return -EROFS; |
4570 | | - case HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED: |
4571 | | - return -EACCES; |
4572 | | - case HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR: |
4573 | | - return -ENOSPC; |
4574 | | - case HWRM_ERR_CODE_INVALID_PARAMS: |
4575 | | - case HWRM_ERR_CODE_INVALID_FLAGS: |
4576 | | - case HWRM_ERR_CODE_INVALID_ENABLES: |
4577 | | - case HWRM_ERR_CODE_UNSUPPORTED_TLV: |
4578 | | - case HWRM_ERR_CODE_UNSUPPORTED_OPTION_ERR: |
4579 | | - return -EINVAL; |
4580 | | - case HWRM_ERR_CODE_NO_BUFFER: |
4581 | | - return -ENOMEM; |
4582 | | - case HWRM_ERR_CODE_HOT_RESET_PROGRESS: |
4583 | | - case HWRM_ERR_CODE_BUSY: |
4584 | | - return -EAGAIN; |
4585 | | - case HWRM_ERR_CODE_CMD_NOT_SUPPORTED: |
4586 | | - return -EOPNOTSUPP; |
4587 | | - default: |
4588 | | - return -EIO; |
4589 | | - } |
4590 | | -} |
4591 | | - |
4592 | | -static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, |
4593 | | - int timeout, bool silent) |
4594 | | -{ |
4595 | | - int i, intr_process, rc, tmo_count; |
4596 | | - struct input *req = msg; |
4597 | | - u32 *data = msg; |
4598 | | - u8 *valid; |
4599 | | - u16 cp_ring_id, len = 0; |
4600 | | - struct hwrm_err_output *resp = bp->hwrm_cmd_resp_addr; |
4601 | | - u16 max_req_len = BNXT_HWRM_MAX_REQ_LEN; |
4602 | | - struct hwrm_short_input short_input = {0}; |
4603 | | - u32 doorbell_offset = BNXT_GRCPF_REG_CHIMP_COMM_TRIGGER; |
4604 | | - u32 bar_offset = BNXT_GRCPF_REG_CHIMP_COMM; |
4605 | | - u16 dst = BNXT_HWRM_CHNL_CHIMP; |
4606 | | - |
4607 | | - if (BNXT_NO_FW_ACCESS(bp) && |
4608 | | - le16_to_cpu(req->req_type) != HWRM_FUNC_RESET) |
4609 | | - return -EBUSY; |
4610 | | - |
4611 | | - if (msg_len > BNXT_HWRM_MAX_REQ_LEN) { |
4612 | | - if (msg_len > bp->hwrm_max_ext_req_len || |
4613 | | - !bp->hwrm_short_cmd_req_addr) |
4614 | | - return -EINVAL; |
4615 | | - } |
4616 | | - |
4617 | | - if (bnxt_kong_hwrm_message(bp, req)) { |
4618 | | - dst = BNXT_HWRM_CHNL_KONG; |
4619 | | - bar_offset = BNXT_GRCPF_REG_KONG_COMM; |
4620 | | - doorbell_offset = BNXT_GRCPF_REG_KONG_COMM_TRIGGER; |
4621 | | - } |
4622 | | - |
4623 | | - memset(resp, 0, PAGE_SIZE); |
4624 | | - cp_ring_id = le16_to_cpu(req->cmpl_ring); |
4625 | | - intr_process = (cp_ring_id == INVALID_HW_RING_ID) ? 0 : 1; |
4626 | | - |
4627 | | - req->seq_id = cpu_to_le16(bnxt_get_hwrm_seq_id(bp, dst)); |
4628 | | - /* currently supports only one outstanding message */ |
4629 | | - if (intr_process) |
4630 | | - bp->hwrm_intr_seq_id = le16_to_cpu(req->seq_id); |
4631 | | - |
4632 | | - if ((bp->fw_cap & BNXT_FW_CAP_SHORT_CMD) || |
4633 | | - msg_len > BNXT_HWRM_MAX_REQ_LEN) { |
4634 | | - void *short_cmd_req = bp->hwrm_short_cmd_req_addr; |
4635 | | - u16 max_msg_len; |
4636 | | - |
4637 | | - /* Set boundary for maximum extended request length for short |
4638 | | - * cmd format. If passed up from device use the max supported |
4639 | | - * internal req length. |
4640 | | - */ |
4641 | | - max_msg_len = bp->hwrm_max_ext_req_len; |
4642 | | - |
4643 | | - memcpy(short_cmd_req, req, msg_len); |
4644 | | - if (msg_len < max_msg_len) |
4645 | | - memset(short_cmd_req + msg_len, 0, |
4646 | | - max_msg_len - msg_len); |
4647 | | - |
4648 | | - short_input.req_type = req->req_type; |
4649 | | - short_input.signature = |
4650 | | - cpu_to_le16(SHORT_REQ_SIGNATURE_SHORT_CMD); |
4651 | | - short_input.size = cpu_to_le16(msg_len); |
4652 | | - short_input.req_addr = |
4653 | | - cpu_to_le64(bp->hwrm_short_cmd_req_dma_addr); |
4654 | | - |
4655 | | - data = (u32 *)&short_input; |
4656 | | - msg_len = sizeof(short_input); |
4657 | | - |
4658 | | - /* Sync memory write before updating doorbell */ |
4659 | | - wmb(); |
4660 | | - |
4661 | | - max_req_len = BNXT_HWRM_SHORT_REQ_LEN; |
4662 | | - } |
4663 | | - |
4664 | | - /* Write request msg to hwrm channel */ |
4665 | | - __iowrite32_copy(bp->bar0 + bar_offset, data, msg_len / 4); |
4666 | | - |
4667 | | - for (i = msg_len; i < max_req_len; i += 4) |
4668 | | - writel(0, bp->bar0 + bar_offset + i); |
4669 | | - |
4670 | | - /* Ring channel doorbell */ |
4671 | | - writel(1, bp->bar0 + doorbell_offset); |
4672 | | - |
4673 | | - if (!pci_is_enabled(bp->pdev)) |
4674 | | - return -ENODEV; |
4675 | | - |
4676 | | - if (!timeout) |
4677 | | - timeout = DFLT_HWRM_CMD_TIMEOUT; |
4678 | | - /* Limit timeout to an upper limit */ |
4679 | | - timeout = min(timeout, HWRM_CMD_MAX_TIMEOUT); |
4680 | | - /* convert timeout to usec */ |
4681 | | - timeout *= 1000; |
4682 | | - |
4683 | | - i = 0; |
4684 | | - /* Short timeout for the first few iterations: |
4685 | | - * number of loops = number of loops for short timeout + |
4686 | | - * number of loops for standard timeout. |
4687 | | - */ |
4688 | | - tmo_count = HWRM_SHORT_TIMEOUT_COUNTER; |
4689 | | - timeout = timeout - HWRM_SHORT_MIN_TIMEOUT * HWRM_SHORT_TIMEOUT_COUNTER; |
4690 | | - tmo_count += DIV_ROUND_UP(timeout, HWRM_MIN_TIMEOUT); |
4691 | | - |
4692 | | - if (intr_process) { |
4693 | | - u16 seq_id = bp->hwrm_intr_seq_id; |
4694 | | - |
4695 | | - /* Wait until hwrm response cmpl interrupt is processed */ |
4696 | | - while (bp->hwrm_intr_seq_id != (u16)~seq_id && |
4697 | | - i++ < tmo_count) { |
4698 | | - /* Abort the wait for completion if the FW health |
4699 | | - * check has failed. |
4700 | | - */ |
4701 | | - if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) |
4702 | | - return -EBUSY; |
4703 | | - /* on first few passes, just barely sleep */ |
4704 | | - if (i < HWRM_SHORT_TIMEOUT_COUNTER) { |
4705 | | - usleep_range(HWRM_SHORT_MIN_TIMEOUT, |
4706 | | - HWRM_SHORT_MAX_TIMEOUT); |
4707 | | - } else { |
4708 | | - if (HWRM_WAIT_MUST_ABORT(bp, req)) |
4709 | | - break; |
4710 | | - usleep_range(HWRM_MIN_TIMEOUT, |
4711 | | - HWRM_MAX_TIMEOUT); |
4712 | | - } |
4713 | | - } |
4714 | | - |
4715 | | - if (bp->hwrm_intr_seq_id != (u16)~seq_id) { |
4716 | | - if (!silent) |
4717 | | - netdev_err(bp->dev, "Resp cmpl intr err msg: 0x%x\n", |
4718 | | - le16_to_cpu(req->req_type)); |
4719 | | - return -EBUSY; |
4720 | | - } |
4721 | | - len = le16_to_cpu(resp->resp_len); |
4722 | | - valid = ((u8 *)resp) + len - 1; |
4723 | | - } else { |
4724 | | - int j; |
4725 | | - |
4726 | | - /* Check if response len is updated */ |
4727 | | - for (i = 0; i < tmo_count; i++) { |
4728 | | - /* Abort the wait for completion if the FW health |
4729 | | - * check has failed. |
4730 | | - */ |
4731 | | - if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) |
4732 | | - return -EBUSY; |
4733 | | - len = le16_to_cpu(resp->resp_len); |
4734 | | - if (len) |
4735 | | - break; |
4736 | | - /* on first few passes, just barely sleep */ |
4737 | | - if (i < HWRM_SHORT_TIMEOUT_COUNTER) { |
4738 | | - usleep_range(HWRM_SHORT_MIN_TIMEOUT, |
4739 | | - HWRM_SHORT_MAX_TIMEOUT); |
4740 | | - } else { |
4741 | | - if (HWRM_WAIT_MUST_ABORT(bp, req)) |
4742 | | - goto timeout_abort; |
4743 | | - usleep_range(HWRM_MIN_TIMEOUT, |
4744 | | - HWRM_MAX_TIMEOUT); |
4745 | | - } |
4746 | | - } |
4747 | | - |
4748 | | - if (i >= tmo_count) { |
4749 | | -timeout_abort: |
4750 | | - if (!silent) |
4751 | | - netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n", |
4752 | | - HWRM_TOTAL_TIMEOUT(i), |
4753 | | - le16_to_cpu(req->req_type), |
4754 | | - le16_to_cpu(req->seq_id), len); |
4755 | | - return -EBUSY; |
4756 | | - } |
4757 | | - |
4758 | | - /* Last byte of resp contains valid bit */ |
4759 | | - valid = ((u8 *)resp) + len - 1; |
4760 | | - for (j = 0; j < HWRM_VALID_BIT_DELAY_USEC; j++) { |
4761 | | - /* make sure we read from updated DMA memory */ |
4762 | | - dma_rmb(); |
4763 | | - if (*valid) |
4764 | | - break; |
4765 | | - usleep_range(1, 5); |
4766 | | - } |
4767 | | - |
4768 | | - if (j >= HWRM_VALID_BIT_DELAY_USEC) { |
4769 | | - if (!silent) |
4770 | | - netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n", |
4771 | | - HWRM_TOTAL_TIMEOUT(i), |
4772 | | - le16_to_cpu(req->req_type), |
4773 | | - le16_to_cpu(req->seq_id), len, |
4774 | | - *valid); |
4775 | | - return -EBUSY; |
4776 | | - } |
4777 | | - } |
4778 | | - |
4779 | | - /* Zero valid bit for compatibility. Valid bit in an older spec |
4780 | | - * may become a new field in a newer spec. We must make sure that |
4781 | | - * a new field not implemented by old spec will read zero. |
4782 | | - */ |
4783 | | - *valid = 0; |
4784 | | - rc = le16_to_cpu(resp->error_code); |
4785 | | - if (rc && !silent) |
4786 | | - netdev_err(bp->dev, "hwrm req_type 0x%x seq id 0x%x error 0x%x\n", |
4787 | | - le16_to_cpu(resp->req_type), |
4788 | | - le16_to_cpu(resp->seq_id), rc); |
4789 | | - return bnxt_hwrm_to_stderr(rc); |
4790 | | -} |
4791 | | - |
4792 | | -int _hwrm_send_message(struct bnxt *bp, void *msg, u32 msg_len, int timeout) |
4793 | | -{ |
4794 | | - return bnxt_hwrm_do_send_msg(bp, msg, msg_len, timeout, false); |
4795 | | -} |
4796 | | - |
4797 | | -int _hwrm_send_message_silent(struct bnxt *bp, void *msg, u32 msg_len, |
4798 | | - int timeout) |
4799 | | -{ |
4800 | | - return bnxt_hwrm_do_send_msg(bp, msg, msg_len, timeout, true); |
4801 | | -} |
4802 | | - |
4803 | | -int hwrm_send_message(struct bnxt *bp, void *msg, u32 msg_len, int timeout) |
4804 | | -{ |
4805 | | - int rc; |
4806 | | - |
4807 | | - mutex_lock(&bp->hwrm_cmd_lock); |
4808 | | - rc = _hwrm_send_message(bp, msg, msg_len, timeout); |
4809 | | - mutex_unlock(&bp->hwrm_cmd_lock); |
4810 | | - return rc; |
4811 | | -} |
4812 | | - |
4813 | | -int hwrm_send_message_silent(struct bnxt *bp, void *msg, u32 msg_len, |
4814 | | - int timeout) |
4815 | | -{ |
4816 | | - int rc; |
4817 | | - |
4818 | | - mutex_lock(&bp->hwrm_cmd_lock); |
4819 | | - rc = bnxt_hwrm_do_send_msg(bp, msg, msg_len, timeout, true); |
4820 | | - mutex_unlock(&bp->hwrm_cmd_lock); |
4821 | | - return rc; |
4822 | | -} |
4823 | | - |
4824 | 4553 | int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, int bmap_size, |
4825 | 4554 | bool async_only) |
4826 | 4555 | { |
|
0 commit comments