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

cxgb4: Add pci reset handler

This patch implements reset_prepare and reset_done, which are used
for handling FLR.

Signed-off-by: Vishal Kulkarni <vishal@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vishal Kulkarni and committed by
David S. Miller
86e8f298 7b3a768b

+96 -9
+96 -9
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
··· 184 184 LIST_HEAD(adapter_list); 185 185 DEFINE_MUTEX(uld_mutex); 186 186 187 + static int cfg_queues(struct adapter *adap); 188 + 187 189 static void link_report(struct net_device *dev) 188 190 { 189 191 if (!netif_carrier_ok(dev)) ··· 4288 4286 /* 4289 4287 * Phase 0 of initialization: contact FW, obtain config, perform basic init. 4290 4288 */ 4291 - static int adap_init0(struct adapter *adap) 4289 + static int adap_init0(struct adapter *adap, int vpd_skip) 4292 4290 { 4293 - int ret; 4294 - u32 v, port_vec; 4295 - enum dev_state state; 4296 - u32 params[7], val[7]; 4297 4291 struct fw_caps_config_cmd caps_cmd; 4292 + u32 params[7], val[7]; 4293 + enum dev_state state; 4294 + u32 v, port_vec; 4298 4295 int reset = 1; 4296 + int ret; 4299 4297 4300 4298 /* Grab Firmware Device Log parameters as early as possible so we have 4301 4299 * access to it for debugging, etc. ··· 4450 4448 * could have FLASHed a new VPD which won't be read by the firmware 4451 4449 * until we do the RESET ... 4452 4450 */ 4453 - ret = t4_get_vpd_params(adap, &adap->params.vpd); 4454 - if (ret < 0) 4455 - goto bye; 4451 + if (!vpd_skip) { 4452 + ret = t4_get_vpd_params(adap, &adap->params.vpd); 4453 + if (ret < 0) 4454 + goto bye; 4455 + } 4456 4456 4457 4457 /* Find out what ports are available to us. Note that we need to do 4458 4458 * this before calling adap_init0_no_config() since it needs nports ··· 5054 5050 rtnl_unlock(); 5055 5051 } 5056 5052 5053 + static void eeh_reset_prepare(struct pci_dev *pdev) 5054 + { 5055 + struct adapter *adapter = pci_get_drvdata(pdev); 5056 + int i; 5057 + 5058 + if (adapter->pf != 4) 5059 + return; 5060 + 5061 + adapter->flags &= ~CXGB4_FW_OK; 5062 + 5063 + notify_ulds(adapter, CXGB4_STATE_DOWN); 5064 + 5065 + for_each_port(adapter, i) 5066 + if (adapter->port[i]->reg_state == NETREG_REGISTERED) 5067 + cxgb_close(adapter->port[i]); 5068 + 5069 + disable_interrupts(adapter); 5070 + cxgb4_free_mps_ref_entries(adapter); 5071 + 5072 + adap_free_hma_mem(adapter); 5073 + 5074 + if (adapter->flags & CXGB4_FULL_INIT_DONE) 5075 + cxgb_down(adapter); 5076 + } 5077 + 5078 + static void eeh_reset_done(struct pci_dev *pdev) 5079 + { 5080 + struct adapter *adapter = pci_get_drvdata(pdev); 5081 + int err, i; 5082 + 5083 + if (adapter->pf != 4) 5084 + return; 5085 + 5086 + err = t4_wait_dev_ready(adapter->regs); 5087 + if (err < 0) { 5088 + dev_err(adapter->pdev_dev, 5089 + "Device not ready, err %d", err); 5090 + return; 5091 + } 5092 + 5093 + setup_memwin(adapter); 5094 + 5095 + err = adap_init0(adapter, 1); 5096 + if (err) { 5097 + dev_err(adapter->pdev_dev, 5098 + "Adapter init failed, err %d", err); 5099 + return; 5100 + } 5101 + 5102 + setup_memwin_rdma(adapter); 5103 + 5104 + if (adapter->flags & CXGB4_FW_OK) { 5105 + err = t4_port_init(adapter, adapter->pf, adapter->pf, 0); 5106 + if (err) { 5107 + dev_err(adapter->pdev_dev, 5108 + "Port init failed, err %d", err); 5109 + return; 5110 + } 5111 + } 5112 + 5113 + err = cfg_queues(adapter); 5114 + if (err) { 5115 + dev_err(adapter->pdev_dev, 5116 + "Config queues failed, err %d", err); 5117 + return; 5118 + } 5119 + 5120 + cxgb4_init_mps_ref_entries(adapter); 5121 + 5122 + err = setup_fw_sge_queues(adapter); 5123 + if (err) { 5124 + dev_err(adapter->pdev_dev, 5125 + "FW sge queue allocation failed, err %d", err); 5126 + return; 5127 + } 5128 + 5129 + for_each_port(adapter, i) 5130 + if (adapter->port[i]->reg_state == NETREG_REGISTERED) 5131 + cxgb_open(adapter->port[i]); 5132 + } 5133 + 5057 5134 static const struct pci_error_handlers cxgb4_eeh = { 5058 5135 .error_detected = eeh_err_detected, 5059 5136 .slot_reset = eeh_slot_reset, 5060 5137 .resume = eeh_resume, 5138 + .reset_prepare = eeh_reset_prepare, 5139 + .reset_done = eeh_reset_done, 5061 5140 }; 5062 5141 5063 5142 /* Return true if the Link Configuration supports "High Speeds" (those greater ··· 5924 5837 } 5925 5838 5926 5839 setup_memwin(adapter); 5927 - err = adap_init0(adapter); 5840 + err = adap_init0(adapter, 0); 5928 5841 #ifdef CONFIG_DEBUG_FS 5929 5842 bitmap_zero(adapter->sge.blocked_fl, adapter->sge.egr_sz); 5930 5843 #endif