diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2015-02-23 04:20:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-23 15:08:31 -0500 |
commit | 78fad34eb8b22ce588b9ebdab39965210588e4b5 (patch) | |
tree | 29ed8642455eab4c32ba35ca727540bc364eb00a /drivers/net/ethernet/emulex | |
parent | b7853d73e39b099bbee149cac4c34dbf98f3fefa (diff) |
be2net: move adapter fields alloc/free code to new routines
The members of be_adapter struct were being allocated in two separate
routines -- be_ctrl_init() and be_stats_init(). Also, some other members
were allocated elsewhere. This patch moves the alloc/free code into
be_drv_init/cleanup() routines. The be_pci_map_bars() routine that was
called from be_ctrl_init() is now called directly from be_probe().
The new routine be_drv_init() will now be the place-holder for allocating
memory for any new be_adapter{} members in the future.
Some routines needed to be moved to provide forward definitions for their
calls.
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 408 |
1 files changed, 195 insertions, 213 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index c1553fba7916..ae8ad5502db0 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -4878,6 +4878,130 @@ static void be_netdev_init(struct net_device *netdev) | |||
4878 | netdev->ethtool_ops = &be_ethtool_ops; | 4878 | netdev->ethtool_ops = &be_ethtool_ops; |
4879 | } | 4879 | } |
4880 | 4880 | ||
4881 | static int lancer_recover_func(struct be_adapter *adapter) | ||
4882 | { | ||
4883 | struct device *dev = &adapter->pdev->dev; | ||
4884 | int status; | ||
4885 | |||
4886 | status = lancer_test_and_set_rdy_state(adapter); | ||
4887 | if (status) | ||
4888 | goto err; | ||
4889 | |||
4890 | if (netif_running(adapter->netdev)) | ||
4891 | be_close(adapter->netdev); | ||
4892 | |||
4893 | be_clear(adapter); | ||
4894 | |||
4895 | be_clear_all_error(adapter); | ||
4896 | |||
4897 | status = be_setup(adapter); | ||
4898 | if (status) | ||
4899 | goto err; | ||
4900 | |||
4901 | if (netif_running(adapter->netdev)) { | ||
4902 | status = be_open(adapter->netdev); | ||
4903 | if (status) | ||
4904 | goto err; | ||
4905 | } | ||
4906 | |||
4907 | dev_err(dev, "Adapter recovery successful\n"); | ||
4908 | return 0; | ||
4909 | err: | ||
4910 | if (status == -EAGAIN) | ||
4911 | dev_err(dev, "Waiting for resource provisioning\n"); | ||
4912 | else | ||
4913 | dev_err(dev, "Adapter recovery failed\n"); | ||
4914 | |||
4915 | return status; | ||
4916 | } | ||
4917 | |||
4918 | static void be_func_recovery_task(struct work_struct *work) | ||
4919 | { | ||
4920 | struct be_adapter *adapter = | ||
4921 | container_of(work, struct be_adapter, func_recovery_work.work); | ||
4922 | int status = 0; | ||
4923 | |||
4924 | be_detect_error(adapter); | ||
4925 | |||
4926 | if (adapter->hw_error && lancer_chip(adapter)) { | ||
4927 | rtnl_lock(); | ||
4928 | netif_device_detach(adapter->netdev); | ||
4929 | rtnl_unlock(); | ||
4930 | |||
4931 | status = lancer_recover_func(adapter); | ||
4932 | if (!status) | ||
4933 | netif_device_attach(adapter->netdev); | ||
4934 | } | ||
4935 | |||
4936 | /* In Lancer, for all errors other than provisioning error (-EAGAIN), | ||
4937 | * no need to attempt further recovery. | ||
4938 | */ | ||
4939 | if (!status || status == -EAGAIN) | ||
4940 | schedule_delayed_work(&adapter->func_recovery_work, | ||
4941 | msecs_to_jiffies(1000)); | ||
4942 | } | ||
4943 | |||
4944 | static void be_log_sfp_info(struct be_adapter *adapter) | ||
4945 | { | ||
4946 | int status; | ||
4947 | |||
4948 | status = be_cmd_query_sfp_info(adapter); | ||
4949 | if (!status) { | ||
4950 | dev_err(&adapter->pdev->dev, | ||
4951 | "Unqualified SFP+ detected on %c from %s part no: %s", | ||
4952 | adapter->port_name, adapter->phy.vendor_name, | ||
4953 | adapter->phy.vendor_pn); | ||
4954 | } | ||
4955 | adapter->flags &= ~BE_FLAGS_EVT_INCOMPATIBLE_SFP; | ||
4956 | } | ||
4957 | |||
4958 | static void be_worker(struct work_struct *work) | ||
4959 | { | ||
4960 | struct be_adapter *adapter = | ||
4961 | container_of(work, struct be_adapter, work.work); | ||
4962 | struct be_rx_obj *rxo; | ||
4963 | int i; | ||
4964 | |||
4965 | /* when interrupts are not yet enabled, just reap any pending | ||
4966 | * mcc completions | ||
4967 | */ | ||
4968 | if (!netif_running(adapter->netdev)) { | ||
4969 | local_bh_disable(); | ||
4970 | be_process_mcc(adapter); | ||
4971 | local_bh_enable(); | ||
4972 | goto reschedule; | ||
4973 | } | ||
4974 | |||
4975 | if (!adapter->stats_cmd_sent) { | ||
4976 | if (lancer_chip(adapter)) | ||
4977 | lancer_cmd_get_pport_stats(adapter, | ||
4978 | &adapter->stats_cmd); | ||
4979 | else | ||
4980 | be_cmd_get_stats(adapter, &adapter->stats_cmd); | ||
4981 | } | ||
4982 | |||
4983 | if (be_physfn(adapter) && | ||
4984 | MODULO(adapter->work_counter, adapter->be_get_temp_freq) == 0) | ||
4985 | be_cmd_get_die_temperature(adapter); | ||
4986 | |||
4987 | for_all_rx_queues(adapter, rxo, i) { | ||
4988 | /* Replenish RX-queues starved due to memory | ||
4989 | * allocation failures. | ||
4990 | */ | ||
4991 | if (rxo->rx_post_starved) | ||
4992 | be_post_rx_frags(rxo, GFP_KERNEL, MAX_RX_POST); | ||
4993 | } | ||
4994 | |||
4995 | be_eqd_update(adapter); | ||
4996 | |||
4997 | if (adapter->flags & BE_FLAGS_EVT_INCOMPATIBLE_SFP) | ||
4998 | be_log_sfp_info(adapter); | ||
4999 | |||
5000 | reschedule: | ||
5001 | adapter->work_counter++; | ||
5002 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); | ||
5003 | } | ||
5004 | |||
4881 | static void be_unmap_pci_bars(struct be_adapter *adapter) | 5005 | static void be_unmap_pci_bars(struct be_adapter *adapter) |
4882 | { | 5006 | { |
4883 | if (adapter->csr) | 5007 | if (adapter->csr) |
@@ -4909,6 +5033,12 @@ static int be_roce_map_pci_bars(struct be_adapter *adapter) | |||
4909 | static int be_map_pci_bars(struct be_adapter *adapter) | 5033 | static int be_map_pci_bars(struct be_adapter *adapter) |
4910 | { | 5034 | { |
4911 | u8 __iomem *addr; | 5035 | u8 __iomem *addr; |
5036 | u32 sli_intf; | ||
5037 | |||
5038 | pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); | ||
5039 | adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >> | ||
5040 | SLI_INTF_FAMILY_SHIFT; | ||
5041 | adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; | ||
4912 | 5042 | ||
4913 | if (BEx_chip(adapter) && be_physfn(adapter)) { | 5043 | if (BEx_chip(adapter) && be_physfn(adapter)) { |
4914 | adapter->csr = pci_iomap(adapter->pdev, 2, 0); | 5044 | adapter->csr = pci_iomap(adapter->pdev, 2, 0); |
@@ -4930,109 +5060,93 @@ pci_map_err: | |||
4930 | return -ENOMEM; | 5060 | return -ENOMEM; |
4931 | } | 5061 | } |
4932 | 5062 | ||
4933 | static void be_ctrl_cleanup(struct be_adapter *adapter) | 5063 | static void be_drv_cleanup(struct be_adapter *adapter) |
4934 | { | 5064 | { |
4935 | struct be_dma_mem *mem = &adapter->mbox_mem_alloced; | 5065 | struct be_dma_mem *mem = &adapter->mbox_mem_alloced; |
4936 | 5066 | struct device *dev = &adapter->pdev->dev; | |
4937 | be_unmap_pci_bars(adapter); | ||
4938 | 5067 | ||
4939 | if (mem->va) | 5068 | if (mem->va) |
4940 | dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, | 5069 | dma_free_coherent(dev, mem->size, mem->va, mem->dma); |
4941 | mem->dma); | ||
4942 | 5070 | ||
4943 | mem = &adapter->rx_filter; | 5071 | mem = &adapter->rx_filter; |
4944 | if (mem->va) | 5072 | if (mem->va) |
4945 | dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va, | 5073 | dma_free_coherent(dev, mem->size, mem->va, mem->dma); |
4946 | mem->dma); | 5074 | |
5075 | mem = &adapter->stats_cmd; | ||
5076 | if (mem->va) | ||
5077 | dma_free_coherent(dev, mem->size, mem->va, mem->dma); | ||
4947 | } | 5078 | } |
4948 | 5079 | ||
4949 | static int be_ctrl_init(struct be_adapter *adapter) | 5080 | /* Allocate and initialize various fields in be_adapter struct */ |
5081 | static int be_drv_init(struct be_adapter *adapter) | ||
4950 | { | 5082 | { |
4951 | struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; | 5083 | struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced; |
4952 | struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; | 5084 | struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem; |
4953 | struct be_dma_mem *rx_filter = &adapter->rx_filter; | 5085 | struct be_dma_mem *rx_filter = &adapter->rx_filter; |
4954 | u32 sli_intf; | 5086 | struct be_dma_mem *stats_cmd = &adapter->stats_cmd; |
4955 | int status; | 5087 | struct device *dev = &adapter->pdev->dev; |
4956 | 5088 | int status = 0; | |
4957 | pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf); | ||
4958 | adapter->sli_family = (sli_intf & SLI_INTF_FAMILY_MASK) >> | ||
4959 | SLI_INTF_FAMILY_SHIFT; | ||
4960 | adapter->virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; | ||
4961 | |||
4962 | status = be_map_pci_bars(adapter); | ||
4963 | if (status) | ||
4964 | goto done; | ||
4965 | 5089 | ||
4966 | mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16; | 5090 | mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16; |
4967 | mbox_mem_alloc->va = dma_alloc_coherent(&adapter->pdev->dev, | 5091 | mbox_mem_alloc->va = dma_alloc_coherent(dev, mbox_mem_alloc->size, |
4968 | mbox_mem_alloc->size, | ||
4969 | &mbox_mem_alloc->dma, | 5092 | &mbox_mem_alloc->dma, |
4970 | GFP_KERNEL); | 5093 | GFP_KERNEL); |
4971 | if (!mbox_mem_alloc->va) { | 5094 | if (!mbox_mem_alloc->va) |
4972 | status = -ENOMEM; | 5095 | return -ENOMEM; |
4973 | goto unmap_pci_bars; | 5096 | |
4974 | } | ||
4975 | mbox_mem_align->size = sizeof(struct be_mcc_mailbox); | 5097 | mbox_mem_align->size = sizeof(struct be_mcc_mailbox); |
4976 | mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16); | 5098 | mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16); |
4977 | mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16); | 5099 | mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16); |
4978 | memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox)); | 5100 | memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox)); |
4979 | 5101 | ||
4980 | rx_filter->size = sizeof(struct be_cmd_req_rx_filter); | 5102 | rx_filter->size = sizeof(struct be_cmd_req_rx_filter); |
4981 | rx_filter->va = dma_zalloc_coherent(&adapter->pdev->dev, | 5103 | rx_filter->va = dma_zalloc_coherent(dev, rx_filter->size, |
4982 | rx_filter->size, &rx_filter->dma, | 5104 | &rx_filter->dma, GFP_KERNEL); |
4983 | GFP_KERNEL); | ||
4984 | if (!rx_filter->va) { | 5105 | if (!rx_filter->va) { |
4985 | status = -ENOMEM; | 5106 | status = -ENOMEM; |
4986 | goto free_mbox; | 5107 | goto free_mbox; |
4987 | } | 5108 | } |
4988 | 5109 | ||
5110 | if (lancer_chip(adapter)) | ||
5111 | stats_cmd->size = sizeof(struct lancer_cmd_req_pport_stats); | ||
5112 | else if (BE2_chip(adapter)) | ||
5113 | stats_cmd->size = sizeof(struct be_cmd_req_get_stats_v0); | ||
5114 | else if (BE3_chip(adapter)) | ||
5115 | stats_cmd->size = sizeof(struct be_cmd_req_get_stats_v1); | ||
5116 | else | ||
5117 | stats_cmd->size = sizeof(struct be_cmd_req_get_stats_v2); | ||
5118 | stats_cmd->va = dma_zalloc_coherent(dev, stats_cmd->size, | ||
5119 | &stats_cmd->dma, GFP_KERNEL); | ||
5120 | if (!stats_cmd->va) { | ||
5121 | status = -ENOMEM; | ||
5122 | goto free_rx_filter; | ||
5123 | } | ||
5124 | |||
4989 | mutex_init(&adapter->mbox_lock); | 5125 | mutex_init(&adapter->mbox_lock); |
4990 | spin_lock_init(&adapter->mcc_lock); | 5126 | spin_lock_init(&adapter->mcc_lock); |
4991 | spin_lock_init(&adapter->mcc_cq_lock); | 5127 | spin_lock_init(&adapter->mcc_cq_lock); |
4992 | |||
4993 | init_completion(&adapter->et_cmd_compl); | 5128 | init_completion(&adapter->et_cmd_compl); |
4994 | pci_save_state(adapter->pdev); | ||
4995 | return 0; | ||
4996 | |||
4997 | free_mbox: | ||
4998 | dma_free_coherent(&adapter->pdev->dev, mbox_mem_alloc->size, | ||
4999 | mbox_mem_alloc->va, mbox_mem_alloc->dma); | ||
5000 | 5129 | ||
5001 | unmap_pci_bars: | 5130 | pci_save_state(adapter->pdev); |
5002 | be_unmap_pci_bars(adapter); | ||
5003 | |||
5004 | done: | ||
5005 | return status; | ||
5006 | } | ||
5007 | |||
5008 | static void be_stats_cleanup(struct be_adapter *adapter) | ||
5009 | { | ||
5010 | struct be_dma_mem *cmd = &adapter->stats_cmd; | ||
5011 | 5131 | ||
5012 | if (cmd->va) | 5132 | INIT_DELAYED_WORK(&adapter->work, be_worker); |
5013 | dma_free_coherent(&adapter->pdev->dev, cmd->size, | 5133 | INIT_DELAYED_WORK(&adapter->func_recovery_work, be_func_recovery_task); |
5014 | cmd->va, cmd->dma); | ||
5015 | } | ||
5016 | 5134 | ||
5017 | static int be_stats_init(struct be_adapter *adapter) | 5135 | adapter->rx_fc = true; |
5018 | { | 5136 | adapter->tx_fc = true; |
5019 | struct be_dma_mem *cmd = &adapter->stats_cmd; | ||
5020 | 5137 | ||
5021 | if (lancer_chip(adapter)) | 5138 | /* Must be a power of 2 or else MODULO will BUG_ON */ |
5022 | cmd->size = sizeof(struct lancer_cmd_req_pport_stats); | 5139 | adapter->be_get_temp_freq = 64; |
5023 | else if (BE2_chip(adapter)) | 5140 | adapter->cfg_num_qs = netif_get_num_default_rss_queues(); |
5024 | cmd->size = sizeof(struct be_cmd_req_get_stats_v0); | ||
5025 | else if (BE3_chip(adapter)) | ||
5026 | cmd->size = sizeof(struct be_cmd_req_get_stats_v1); | ||
5027 | else | ||
5028 | /* ALL non-BE ASICs */ | ||
5029 | cmd->size = sizeof(struct be_cmd_req_get_stats_v2); | ||
5030 | 5141 | ||
5031 | cmd->va = dma_zalloc_coherent(&adapter->pdev->dev, cmd->size, &cmd->dma, | ||
5032 | GFP_KERNEL); | ||
5033 | if (!cmd->va) | ||
5034 | return -ENOMEM; | ||
5035 | return 0; | 5142 | return 0; |
5143 | |||
5144 | free_rx_filter: | ||
5145 | dma_free_coherent(dev, rx_filter->size, rx_filter->va, rx_filter->dma); | ||
5146 | free_mbox: | ||
5147 | dma_free_coherent(dev, mbox_mem_alloc->size, mbox_mem_alloc->va, | ||
5148 | mbox_mem_alloc->dma); | ||
5149 | return status; | ||
5036 | } | 5150 | } |
5037 | 5151 | ||
5038 | static void be_remove(struct pci_dev *pdev) | 5152 | static void be_remove(struct pci_dev *pdev) |
@@ -5054,9 +5168,8 @@ static void be_remove(struct pci_dev *pdev) | |||
5054 | /* tell fw we're done with firing cmds */ | 5168 | /* tell fw we're done with firing cmds */ |
5055 | be_cmd_fw_clean(adapter); | 5169 | be_cmd_fw_clean(adapter); |
5056 | 5170 | ||
5057 | be_stats_cleanup(adapter); | 5171 | be_unmap_pci_bars(adapter); |
5058 | 5172 | be_drv_cleanup(adapter); | |
5059 | be_ctrl_cleanup(adapter); | ||
5060 | 5173 | ||
5061 | pci_disable_pcie_error_reporting(pdev); | 5174 | pci_disable_pcie_error_reporting(pdev); |
5062 | 5175 | ||
@@ -5074,141 +5187,15 @@ static int be_get_initial_config(struct be_adapter *adapter) | |||
5074 | if (status) | 5187 | if (status) |
5075 | return status; | 5188 | return status; |
5076 | 5189 | ||
5077 | /* Must be a power of 2 or else MODULO will BUG_ON */ | ||
5078 | adapter->be_get_temp_freq = 64; | ||
5079 | |||
5080 | if (BEx_chip(adapter)) { | 5190 | if (BEx_chip(adapter)) { |
5081 | level = be_cmd_get_fw_log_level(adapter); | 5191 | level = be_cmd_get_fw_log_level(adapter); |
5082 | adapter->msg_enable = | 5192 | adapter->msg_enable = |
5083 | level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0; | 5193 | level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0; |
5084 | } | 5194 | } |
5085 | 5195 | ||
5086 | adapter->cfg_num_qs = netif_get_num_default_rss_queues(); | ||
5087 | return 0; | ||
5088 | } | ||
5089 | |||
5090 | static int lancer_recover_func(struct be_adapter *adapter) | ||
5091 | { | ||
5092 | struct device *dev = &adapter->pdev->dev; | ||
5093 | int status; | ||
5094 | |||
5095 | status = lancer_test_and_set_rdy_state(adapter); | ||
5096 | if (status) | ||
5097 | goto err; | ||
5098 | |||
5099 | if (netif_running(adapter->netdev)) | ||
5100 | be_close(adapter->netdev); | ||
5101 | |||
5102 | be_clear(adapter); | ||
5103 | |||
5104 | be_clear_all_error(adapter); | ||
5105 | |||
5106 | status = be_setup(adapter); | ||
5107 | if (status) | ||
5108 | goto err; | ||
5109 | |||
5110 | if (netif_running(adapter->netdev)) { | ||
5111 | status = be_open(adapter->netdev); | ||
5112 | if (status) | ||
5113 | goto err; | ||
5114 | } | ||
5115 | |||
5116 | dev_err(dev, "Adapter recovery successful\n"); | ||
5117 | return 0; | 5196 | return 0; |
5118 | err: | ||
5119 | if (status == -EAGAIN) | ||
5120 | dev_err(dev, "Waiting for resource provisioning\n"); | ||
5121 | else | ||
5122 | dev_err(dev, "Adapter recovery failed\n"); | ||
5123 | |||
5124 | return status; | ||
5125 | } | 5197 | } |
5126 | 5198 | ||
5127 | static void be_func_recovery_task(struct work_struct *work) | ||
5128 | { | ||
5129 | struct be_adapter *adapter = | ||
5130 | container_of(work, struct be_adapter, func_recovery_work.work); | ||
5131 | int status = 0; | ||
5132 | |||
5133 | be_detect_error(adapter); | ||
5134 | |||
5135 | if (adapter->hw_error && lancer_chip(adapter)) { | ||
5136 | rtnl_lock(); | ||
5137 | netif_device_detach(adapter->netdev); | ||
5138 | rtnl_unlock(); | ||
5139 | |||
5140 | status = lancer_recover_func(adapter); | ||
5141 | if (!status) | ||
5142 | netif_device_attach(adapter->netdev); | ||
5143 | } | ||
5144 | |||
5145 | /* In Lancer, for all errors other than provisioning error (-EAGAIN), | ||
5146 | * no need to attempt further recovery. | ||
5147 | */ | ||
5148 | if (!status || status == -EAGAIN) | ||
5149 | schedule_delayed_work(&adapter->func_recovery_work, | ||
5150 | msecs_to_jiffies(1000)); | ||
5151 | } | ||
5152 | |||
5153 | static void be_log_sfp_info(struct be_adapter *adapter) | ||
5154 | { | ||
5155 | int status; | ||
5156 | |||
5157 | status = be_cmd_query_sfp_info(adapter); | ||
5158 | if (!status) { | ||
5159 | dev_err(&adapter->pdev->dev, | ||
5160 | "Unqualified SFP+ detected on %c from %s part no: %s", | ||
5161 | adapter->port_name, adapter->phy.vendor_name, | ||
5162 | adapter->phy.vendor_pn); | ||
5163 | } | ||
5164 | adapter->flags &= ~BE_FLAGS_EVT_INCOMPATIBLE_SFP; | ||
5165 | } | ||
5166 | |||
5167 | static void be_worker(struct work_struct *work) | ||
5168 | { | ||
5169 | struct be_adapter *adapter = | ||
5170 | container_of(work, struct be_adapter, work.work); | ||
5171 | struct be_rx_obj *rxo; | ||
5172 | int i; | ||
5173 | |||
5174 | /* when interrupts are not yet enabled, just reap any pending | ||
5175 | * mcc completions */ | ||
5176 | if (!netif_running(adapter->netdev)) { | ||
5177 | local_bh_disable(); | ||
5178 | be_process_mcc(adapter); | ||
5179 | local_bh_enable(); | ||
5180 | goto reschedule; | ||
5181 | } | ||
5182 | |||
5183 | if (!adapter->stats_cmd_sent) { | ||
5184 | if (lancer_chip(adapter)) | ||
5185 | lancer_cmd_get_pport_stats(adapter, | ||
5186 | &adapter->stats_cmd); | ||
5187 | else | ||
5188 | be_cmd_get_stats(adapter, &adapter->stats_cmd); | ||
5189 | } | ||
5190 | |||
5191 | if (be_physfn(adapter) && | ||
5192 | MODULO(adapter->work_counter, adapter->be_get_temp_freq) == 0) | ||
5193 | be_cmd_get_die_temperature(adapter); | ||
5194 | |||
5195 | for_all_rx_queues(adapter, rxo, i) { | ||
5196 | /* Replenish RX-queues starved due to memory | ||
5197 | * allocation failures. | ||
5198 | */ | ||
5199 | if (rxo->rx_post_starved) | ||
5200 | be_post_rx_frags(rxo, GFP_KERNEL, MAX_RX_POST); | ||
5201 | } | ||
5202 | |||
5203 | be_eqd_update(adapter); | ||
5204 | |||
5205 | if (adapter->flags & BE_FLAGS_EVT_INCOMPATIBLE_SFP) | ||
5206 | be_log_sfp_info(adapter); | ||
5207 | |||
5208 | reschedule: | ||
5209 | adapter->work_counter++; | ||
5210 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); | ||
5211 | } | ||
5212 | 5199 | ||
5213 | /* If any VFs are already enabled don't FLR the PF */ | 5200 | /* If any VFs are already enabled don't FLR the PF */ |
5214 | static bool be_reset_required(struct be_adapter *adapter) | 5201 | static bool be_reset_required(struct be_adapter *adapter) |
@@ -5314,21 +5301,25 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) | |||
5314 | if (!status) | 5301 | if (!status) |
5315 | dev_info(&pdev->dev, "PCIe error reporting enabled\n"); | 5302 | dev_info(&pdev->dev, "PCIe error reporting enabled\n"); |
5316 | 5303 | ||
5317 | status = be_ctrl_init(adapter); | 5304 | status = be_map_pci_bars(adapter); |
5318 | if (status) | 5305 | if (status) |
5319 | goto free_netdev; | 5306 | goto free_netdev; |
5320 | 5307 | ||
5308 | status = be_drv_init(adapter); | ||
5309 | if (status) | ||
5310 | goto unmap_bars; | ||
5311 | |||
5321 | /* sync up with fw's ready state */ | 5312 | /* sync up with fw's ready state */ |
5322 | if (be_physfn(adapter)) { | 5313 | if (be_physfn(adapter)) { |
5323 | status = be_fw_wait_ready(adapter); | 5314 | status = be_fw_wait_ready(adapter); |
5324 | if (status) | 5315 | if (status) |
5325 | goto ctrl_clean; | 5316 | goto drv_cleanup; |
5326 | } | 5317 | } |
5327 | 5318 | ||
5328 | if (be_reset_required(adapter)) { | 5319 | if (be_reset_required(adapter)) { |
5329 | status = be_cmd_reset_function(adapter); | 5320 | status = be_cmd_reset_function(adapter); |
5330 | if (status) | 5321 | if (status) |
5331 | goto ctrl_clean; | 5322 | goto drv_cleanup; |
5332 | 5323 | ||
5333 | /* Wait for interrupts to quiesce after an FLR */ | 5324 | /* Wait for interrupts to quiesce after an FLR */ |
5334 | msleep(100); | 5325 | msleep(100); |
@@ -5340,24 +5331,15 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) | |||
5340 | /* tell fw we're ready to fire cmds */ | 5331 | /* tell fw we're ready to fire cmds */ |
5341 | status = be_cmd_fw_init(adapter); | 5332 | status = be_cmd_fw_init(adapter); |
5342 | if (status) | 5333 | if (status) |
5343 | goto ctrl_clean; | 5334 | goto drv_cleanup; |
5344 | |||
5345 | status = be_stats_init(adapter); | ||
5346 | if (status) | ||
5347 | goto ctrl_clean; | ||
5348 | 5335 | ||
5349 | status = be_get_initial_config(adapter); | 5336 | status = be_get_initial_config(adapter); |
5350 | if (status) | 5337 | if (status) |
5351 | goto stats_clean; | 5338 | goto drv_cleanup; |
5352 | |||
5353 | INIT_DELAYED_WORK(&adapter->work, be_worker); | ||
5354 | INIT_DELAYED_WORK(&adapter->func_recovery_work, be_func_recovery_task); | ||
5355 | adapter->rx_fc = true; | ||
5356 | adapter->tx_fc = true; | ||
5357 | 5339 | ||
5358 | status = be_setup(adapter); | 5340 | status = be_setup(adapter); |
5359 | if (status) | 5341 | if (status) |
5360 | goto stats_clean; | 5342 | goto drv_cleanup; |
5361 | 5343 | ||
5362 | be_netdev_init(netdev); | 5344 | be_netdev_init(netdev); |
5363 | status = register_netdev(netdev); | 5345 | status = register_netdev(netdev); |
@@ -5376,10 +5358,10 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) | |||
5376 | 5358 | ||
5377 | unsetup: | 5359 | unsetup: |
5378 | be_clear(adapter); | 5360 | be_clear(adapter); |
5379 | stats_clean: | 5361 | drv_cleanup: |
5380 | be_stats_cleanup(adapter); | 5362 | be_drv_cleanup(adapter); |
5381 | ctrl_clean: | 5363 | unmap_bars: |
5382 | be_ctrl_cleanup(adapter); | 5364 | be_unmap_pci_bars(adapter); |
5383 | free_netdev: | 5365 | free_netdev: |
5384 | free_netdev(netdev); | 5366 | free_netdev(netdev); |
5385 | rel_reg: | 5367 | rel_reg: |