| 
									
										
										
										
											2013-08-16 15:47:40 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Copyright 2013 Cisco Systems, Inc.  All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you may redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation; version 2 of the License. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
					
						
							|  |  |  |  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
					
						
							|  |  |  |  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
					
						
							|  |  |  |  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | 
					
						
							|  |  |  |  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | 
					
						
							|  |  |  |  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | 
					
						
							|  |  |  |  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
					
						
							|  |  |  |  * SOFTWARE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/netdevice.h>
 | 
					
						
							|  |  |  | #include <linux/spinlock.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "vnic_dev.h"
 | 
					
						
							|  |  |  | #include "vnic_devcmd.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "enic_res.h"
 | 
					
						
							|  |  |  | #include "enic.h"
 | 
					
						
							|  |  |  | #include "enic_api.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf, | 
					
						
							|  |  |  | 	enum vnic_devcmd_cmd cmd, u64 *a0, u64 *a1, int wait) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 	struct enic *enic = netdev_priv(netdev); | 
					
						
							|  |  |  | 	struct vnic_dev *vdev = enic->vdev; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock(&enic->enic_api_lock); | 
					
						
							| 
									
										
										
										
											2014-06-23 16:08:03 +05:30
										 |  |  | 	spin_lock_bh(&enic->devcmd_lock); | 
					
						
							| 
									
										
										
										
											2013-08-16 15:47:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	vnic_dev_cmd_proxy_by_index_start(vdev, vf); | 
					
						
							|  |  |  | 	err = vnic_dev_cmd(vdev, cmd, a0, a1, wait); | 
					
						
							|  |  |  | 	vnic_dev_cmd_proxy_end(vdev); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 16:08:03 +05:30
										 |  |  | 	spin_unlock_bh(&enic->devcmd_lock); | 
					
						
							| 
									
										
										
										
											2013-08-16 15:47:40 -07:00
										 |  |  | 	spin_unlock(&enic->enic_api_lock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return err; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | EXPORT_SYMBOL(enic_api_devcmd_proxy_by_index); |