qlcnic: Remove holding api lock while taking the dump
With the change in logic for taking FW dump across multiple drivers, there is no need to hold onto the api lock anymore in the fw dump path. Instead use rtnl_lock() to synchronize the access to FW dump data structs. Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								602ca6f00a
							
						
					
				
			
			
				commit
				
					
						287e38aa1a
					
				
			
		
					 2 changed files with 5 additions and 9 deletions
				
			
		|  | @ -986,8 +986,6 @@ qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump, | ||||||
| 	struct qlcnic_adapter *adapter = netdev_priv(netdev); | 	struct qlcnic_adapter *adapter = netdev_priv(netdev); | ||||||
| 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; | 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; | ||||||
| 
 | 
 | ||||||
| 	if (qlcnic_api_lock(adapter)) |  | ||||||
| 		return -EIO; |  | ||||||
| 	if (!fw_dump->clr) { | 	if (!fw_dump->clr) { | ||||||
| 		netdev_info(netdev, "Dump not available\n"); | 		netdev_info(netdev, "Dump not available\n"); | ||||||
| 		qlcnic_api_unlock(adapter); | 		qlcnic_api_unlock(adapter); | ||||||
|  | @ -1009,7 +1007,6 @@ qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump, | ||||||
| 	vfree(fw_dump->data); | 	vfree(fw_dump->data); | ||||||
| 	fw_dump->data = NULL; | 	fw_dump->data = NULL; | ||||||
| 	fw_dump->clr = 0; | 	fw_dump->clr = 0; | ||||||
| 	qlcnic_api_unlock(adapter); |  | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -1032,10 +1029,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val) | ||||||
| 				ret = -EINVAL; | 				ret = -EINVAL; | ||||||
| 				goto out; | 				goto out; | ||||||
| 		} | 		} | ||||||
| 		if (qlcnic_api_lock(adapter)) |  | ||||||
| 			return -EIO; |  | ||||||
| 		fw_dump->tmpl_hdr->drv_cap_mask = val->flag & 0xff; | 		fw_dump->tmpl_hdr->drv_cap_mask = val->flag & 0xff; | ||||||
| 		qlcnic_api_unlock(adapter); |  | ||||||
| 		netdev_info(netdev, "Driver mask changed to: 0x%x\n", | 		netdev_info(netdev, "Driver mask changed to: 0x%x\n", | ||||||
| 			fw_dump->tmpl_hdr->drv_cap_mask); | 			fw_dump->tmpl_hdr->drv_cap_mask); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -2846,13 +2846,15 @@ skip_ack_check: | ||||||
| 			set_bit(__QLCNIC_START_FW, &adapter->state); | 			set_bit(__QLCNIC_START_FW, &adapter->state); | ||||||
| 			QLCDB(adapter, DRV, "Restarting fw\n"); | 			QLCDB(adapter, DRV, "Restarting fw\n"); | ||||||
| 			qlcnic_idc_debug_info(adapter, 0); | 			qlcnic_idc_debug_info(adapter, 0); | ||||||
| 			QLCDB(adapter, DRV, "Take FW dump\n"); |  | ||||||
| 			qlcnic_dump_fw(adapter); |  | ||||||
| 			adapter->flags &= ~QLCNIC_FW_RESET_OWNER; |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		qlcnic_api_unlock(adapter); | 		qlcnic_api_unlock(adapter); | ||||||
| 
 | 
 | ||||||
|  | 		rtnl_lock(); | ||||||
|  | 		QLCDB(adapter, DRV, "Take FW dump\n"); | ||||||
|  | 		qlcnic_dump_fw(adapter); | ||||||
|  | 		adapter->flags &= ~QLCNIC_FW_RESET_OWNER; | ||||||
|  | 		rtnl_unlock(); | ||||||
| 		if (!adapter->nic_ops->start_firmware(adapter)) { | 		if (!adapter->nic_ops->start_firmware(adapter)) { | ||||||
| 			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); | 			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); | ||||||
| 			adapter->fw_wait_cnt = 0; | 			adapter->fw_wait_cnt = 0; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Anirban Chakraborty
				Anirban Chakraborty