diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 6 | ||||
| -rw-r--r-- | drivers/net/cxgb3/cxgb3_offload.c | 6 | ||||
| -rw-r--r-- | drivers/net/cxgb3/cxgb3_offload.h | 8 | ||||
| -rw-r--r-- | drivers/net/mlx4/cq.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/eq.c | 77 | ||||
| -rw-r--r-- | drivers/net/mlx4/icm.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/main.c | 37 | ||||
| -rw-r--r-- | drivers/net/mlx4/mcg.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/mlx4.h | 7 | ||||
| -rw-r--r-- | drivers/net/mlx4/mr.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/pd.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/profile.c | 2 | ||||
| -rw-r--r-- | drivers/net/mlx4/qp.c | 2 | ||||
| -rw-r--r-- | drivers/net/mlx4/reset.c | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/srq.c | 2 | ||||
| -rw-r--r-- | drivers/net/tun.c | 22 | 
16 files changed, 69 insertions, 106 deletions
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index fb5df5c6203..c97ab82ec74 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c @@ -1286,6 +1286,7 @@ static int cxgb_open(struct net_device *dev)  	if (!other_ports)  		schedule_chk_task(adapter); +	cxgb3_event_notify(&adapter->tdev, OFFLOAD_PORT_UP, pi->port_id);  	return 0;  } @@ -1318,6 +1319,7 @@ static int cxgb_close(struct net_device *dev)  	if (!adapter->open_device_map)  		cxgb_down(adapter); +	cxgb3_event_notify(&adapter->tdev, OFFLOAD_PORT_DOWN, pi->port_id);  	return 0;  } @@ -2717,7 +2719,7 @@ static int t3_adapter_error(struct adapter *adapter, int reset)  	if (is_offload(adapter) &&  	    test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) { -		cxgb3_err_notify(&adapter->tdev, OFFLOAD_STATUS_DOWN, 0); +		cxgb3_event_notify(&adapter->tdev, OFFLOAD_STATUS_DOWN, 0);  		offload_close(&adapter->tdev);  	} @@ -2782,7 +2784,7 @@ static void t3_resume_ports(struct adapter *adapter)  	}  	if (is_offload(adapter) && !ofld_disable) -		cxgb3_err_notify(&adapter->tdev, OFFLOAD_STATUS_UP, 0); +		cxgb3_event_notify(&adapter->tdev, OFFLOAD_STATUS_UP, 0);  }  /* diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c index f9f54b57b28..75064eea1d8 100644 --- a/drivers/net/cxgb3/cxgb3_offload.c +++ b/drivers/net/cxgb3/cxgb3_offload.c @@ -153,14 +153,14 @@ void cxgb3_remove_clients(struct t3cdev *tdev)  	mutex_unlock(&cxgb3_db_lock);  } -void cxgb3_err_notify(struct t3cdev *tdev, u32 status, u32 error) +void cxgb3_event_notify(struct t3cdev *tdev, u32 event, u32 port)  {  	struct cxgb3_client *client;  	mutex_lock(&cxgb3_db_lock);  	list_for_each_entry(client, &client_list, client_list) { -		if (client->err_handler) -			client->err_handler(tdev, status, error); +		if (client->event_handler) +			client->event_handler(tdev, event, port);  	}  	mutex_unlock(&cxgb3_db_lock);  } diff --git a/drivers/net/cxgb3/cxgb3_offload.h b/drivers/net/cxgb3/cxgb3_offload.h index 55945f422ae..670aa62042d 100644 --- a/drivers/net/cxgb3/cxgb3_offload.h +++ b/drivers/net/cxgb3/cxgb3_offload.h @@ -64,14 +64,16 @@ void cxgb3_register_client(struct cxgb3_client *client);  void cxgb3_unregister_client(struct cxgb3_client *client);  void cxgb3_add_clients(struct t3cdev *tdev);  void cxgb3_remove_clients(struct t3cdev *tdev); -void cxgb3_err_notify(struct t3cdev *tdev, u32 status, u32 error); +void cxgb3_event_notify(struct t3cdev *tdev, u32 event, u32 port);  typedef int (*cxgb3_cpl_handler_func)(struct t3cdev *dev,  				      struct sk_buff *skb, void *ctx);  enum {  	OFFLOAD_STATUS_UP, -	OFFLOAD_STATUS_DOWN +	OFFLOAD_STATUS_DOWN, +	OFFLOAD_PORT_DOWN, +	OFFLOAD_PORT_UP  };  struct cxgb3_client { @@ -82,7 +84,7 @@ struct cxgb3_client {  	int (*redirect)(void *ctx, struct dst_entry *old,  			struct dst_entry *new, struct l2t_entry *l2t);  	struct list_head client_list; -	void (*err_handler)(struct t3cdev *tdev, u32 status, u32 error); +	void (*event_handler)(struct t3cdev *tdev, u32 event, u32 port);  };  /* diff --git a/drivers/net/mlx4/cq.c b/drivers/net/mlx4/cq.c index ac57b6a42c6..ccfe276943f 100644 --- a/drivers/net/mlx4/cq.c +++ b/drivers/net/mlx4/cq.c @@ -34,7 +34,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/hardirq.h>  #include <linux/mlx4/cmd.h> diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c index b9ceddde46c..bffb7995cb7 100644 --- a/drivers/net/mlx4/eq.c +++ b/drivers/net/mlx4/eq.c @@ -31,7 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/mm.h>  #include <linux/dma-mapping.h> @@ -42,6 +41,10 @@  #include "fw.h"  enum { +	MLX4_IRQNAME_SIZE	= 64 +}; + +enum {  	MLX4_NUM_ASYNC_EQE	= 0x100,  	MLX4_NUM_SPARE_EQE	= 0x80,  	MLX4_EQ_ENTRY_SIZE	= 0x20 @@ -526,48 +529,6 @@ static void mlx4_unmap_clr_int(struct mlx4_dev *dev)  	iounmap(priv->clr_base);  } -int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt) -{ -	struct mlx4_priv *priv = mlx4_priv(dev); -	int ret; - -	/* -	 * We assume that mapping one page is enough for the whole EQ -	 * context table.  This is fine with all current HCAs, because -	 * we only use 32 EQs and each EQ uses 64 bytes of context -	 * memory, or 1 KB total. -	 */ -	priv->eq_table.icm_virt = icm_virt; -	priv->eq_table.icm_page = alloc_page(GFP_HIGHUSER); -	if (!priv->eq_table.icm_page) -		return -ENOMEM; -	priv->eq_table.icm_dma  = pci_map_page(dev->pdev, priv->eq_table.icm_page, 0, -					       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); -	if (pci_dma_mapping_error(dev->pdev, priv->eq_table.icm_dma)) { -		__free_page(priv->eq_table.icm_page); -		return -ENOMEM; -	} - -	ret = mlx4_MAP_ICM_page(dev, priv->eq_table.icm_dma, icm_virt); -	if (ret) { -		pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE, -			       PCI_DMA_BIDIRECTIONAL); -		__free_page(priv->eq_table.icm_page); -	} - -	return ret; -} - -void mlx4_unmap_eq_icm(struct mlx4_dev *dev) -{ -	struct mlx4_priv *priv = mlx4_priv(dev); - -	mlx4_UNMAP_ICM(dev, priv->eq_table.icm_virt, 1); -	pci_unmap_page(dev->pdev, priv->eq_table.icm_dma, PAGE_SIZE, -		       PCI_DMA_BIDIRECTIONAL); -	__free_page(priv->eq_table.icm_page); -} -  int mlx4_alloc_eq_table(struct mlx4_dev *dev)  {  	struct mlx4_priv *priv = mlx4_priv(dev); @@ -615,7 +576,9 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)  	priv->eq_table.clr_int  = priv->clr_base +  		(priv->eq_table.inta_pin < 32 ? 4 : 0); -	priv->eq_table.irq_names = kmalloc(16 * dev->caps.num_comp_vectors, GFP_KERNEL); +	priv->eq_table.irq_names = +		kmalloc(MLX4_IRQNAME_SIZE * (dev->caps.num_comp_vectors + 1), +			GFP_KERNEL);  	if (!priv->eq_table.irq_names) {  		err = -ENOMEM;  		goto err_out_bitmap; @@ -638,17 +601,25 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)  		goto err_out_comp;  	if (dev->flags & MLX4_FLAG_MSI_X) { -		static const char async_eq_name[] = "mlx4-async";  		const char *eq_name;  		for (i = 0; i < dev->caps.num_comp_vectors + 1; ++i) {  			if (i < dev->caps.num_comp_vectors) { -				snprintf(priv->eq_table.irq_names + i * 16, 16, -					 "mlx4-comp-%d", i); -				eq_name = priv->eq_table.irq_names + i * 16; -			} else -				eq_name = async_eq_name; +				snprintf(priv->eq_table.irq_names + +					 i * MLX4_IRQNAME_SIZE, +					 MLX4_IRQNAME_SIZE, +					 "mlx4-comp-%d@pci:%s", i, +					 pci_name(dev->pdev)); +			} else { +				snprintf(priv->eq_table.irq_names + +					 i * MLX4_IRQNAME_SIZE, +					 MLX4_IRQNAME_SIZE, +					 "mlx4-async@pci:%s", +					 pci_name(dev->pdev)); +			} +			eq_name = priv->eq_table.irq_names + +				  i * MLX4_IRQNAME_SIZE;  			err = request_irq(priv->eq_table.eq[i].irq,  					  mlx4_msi_x_interrupt, 0, eq_name,  					  priv->eq_table.eq + i); @@ -658,8 +629,12 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)  			priv->eq_table.eq[i].have_irq = 1;  		}  	} else { +		snprintf(priv->eq_table.irq_names, +			 MLX4_IRQNAME_SIZE, +			 DRV_NAME "@pci:%s", +			 pci_name(dev->pdev));  		err = request_irq(dev->pdev->irq, mlx4_interrupt, -				  IRQF_SHARED, DRV_NAME, dev); +				  IRQF_SHARED, priv->eq_table.irq_names, dev);  		if (err)  			goto err_out_async; diff --git a/drivers/net/mlx4/icm.c b/drivers/net/mlx4/icm.c index baf4bf66062..04b382fcb8c 100644 --- a/drivers/net/mlx4/icm.c +++ b/drivers/net/mlx4/icm.c @@ -31,7 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/errno.h>  #include <linux/mm.h>  #include <linux/scatterlist.h> diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index dac621b1e9f..3dd481e77f9 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c @@ -525,7 +525,10 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap,  		goto err_unmap_aux;  	} -	err = mlx4_map_eq_icm(dev, init_hca->eqc_base); +	err = mlx4_init_icm_table(dev, &priv->eq_table.table, +				  init_hca->eqc_base, dev_cap->eqc_entry_sz, +				  dev->caps.num_eqs, dev->caps.num_eqs, +				  0, 0);  	if (err) {  		mlx4_err(dev, "Failed to map EQ context memory, aborting.\n");  		goto err_unmap_cmpt; @@ -668,7 +671,7 @@ err_unmap_mtt:  	mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table);  err_unmap_eq: -	mlx4_unmap_eq_icm(dev); +	mlx4_cleanup_icm_table(dev, &priv->eq_table.table);  err_unmap_cmpt:  	mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table); @@ -698,11 +701,11 @@ static void mlx4_free_icms(struct mlx4_dev *dev)  	mlx4_cleanup_icm_table(dev, &priv->qp_table.qp_table);  	mlx4_cleanup_icm_table(dev, &priv->mr_table.dmpt_table);  	mlx4_cleanup_icm_table(dev, &priv->mr_table.mtt_table); +	mlx4_cleanup_icm_table(dev, &priv->eq_table.table);  	mlx4_cleanup_icm_table(dev, &priv->eq_table.cmpt_table);  	mlx4_cleanup_icm_table(dev, &priv->cq_table.cmpt_table);  	mlx4_cleanup_icm_table(dev, &priv->srq_table.cmpt_table);  	mlx4_cleanup_icm_table(dev, &priv->qp_table.cmpt_table); -	mlx4_unmap_eq_icm(dev);  	mlx4_UNMAP_ICM_AUX(dev);  	mlx4_free_icm(dev, priv->fw.aux_icm, 0); @@ -786,7 +789,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)  	return 0;  err_close: -	mlx4_close_hca(dev); +	mlx4_CLOSE_HCA(dev, 0);  err_free_icm:  	mlx4_free_icms(dev); @@ -1070,18 +1073,12 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)  		goto err_disable_pdev;  	} -	err = pci_request_region(pdev, 0, DRV_NAME); +	err = pci_request_regions(pdev, DRV_NAME);  	if (err) { -		dev_err(&pdev->dev, "Cannot request control region, aborting.\n"); +		dev_err(&pdev->dev, "Couldn't get PCI resources, aborting\n");  		goto err_disable_pdev;  	} -	err = pci_request_region(pdev, 2, DRV_NAME); -	if (err) { -		dev_err(&pdev->dev, "Cannot request UAR region, aborting.\n"); -		goto err_release_bar0; -	} -  	pci_set_master(pdev);  	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); @@ -1090,7 +1087,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)  		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));  		if (err) {  			dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting.\n"); -			goto err_release_bar2; +			goto err_release_regions;  		}  	}  	err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); @@ -1101,7 +1098,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)  		if (err) {  			dev_err(&pdev->dev, "Can't set consistent PCI DMA mask, "  				"aborting.\n"); -			goto err_release_bar2; +			goto err_release_regions;  		}  	} @@ -1110,7 +1107,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)  		dev_err(&pdev->dev, "Device struct alloc failed, "  			"aborting.\n");  		err = -ENOMEM; -		goto err_release_bar2; +		goto err_release_regions;  	}  	dev       = &priv->dev; @@ -1205,11 +1202,8 @@ err_cmd:  err_free_dev:  	kfree(priv); -err_release_bar2: -	pci_release_region(pdev, 2); - -err_release_bar0: -	pci_release_region(pdev, 0); +err_release_regions: +	pci_release_regions(pdev);  err_disable_pdev:  	pci_disable_device(pdev); @@ -1265,8 +1259,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)  			pci_disable_msix(pdev);  		kfree(priv); -		pci_release_region(pdev, 2); -		pci_release_region(pdev, 0); +		pci_release_regions(pdev);  		pci_disable_device(pdev);  		pci_set_drvdata(pdev, NULL);  	} diff --git a/drivers/net/mlx4/mcg.c b/drivers/net/mlx4/mcg.c index 6053c357a47..5ccbce9866f 100644 --- a/drivers/net/mlx4/mcg.c +++ b/drivers/net/mlx4/mcg.c @@ -31,7 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/string.h>  #include <linux/slab.h> diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 5bd79c2b184..bc72d6e4919 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -205,9 +205,7 @@ struct mlx4_eq_table {  	void __iomem	      **uar_map;  	u32			clr_mask;  	struct mlx4_eq	       *eq; -	u64			icm_virt; -	struct page	       *icm_page; -	dma_addr_t		icm_dma; +	struct mlx4_icm_table	table;  	struct mlx4_icm_table	cmpt_table;  	int			have_irq;  	u8			inta_pin; @@ -373,9 +371,6 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,  		      struct mlx4_dev_cap *dev_cap,  		      struct mlx4_init_hca_param *init_hca); -int mlx4_map_eq_icm(struct mlx4_dev *dev, u64 icm_virt); -void mlx4_unmap_eq_icm(struct mlx4_dev *dev); -  int mlx4_cmd_init(struct mlx4_dev *dev);  void mlx4_cmd_cleanup(struct mlx4_dev *dev);  void mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param); diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c index f96948be0a4..ca7ab8e7b4c 100644 --- a/drivers/net/mlx4/mr.c +++ b/drivers/net/mlx4/mr.c @@ -32,7 +32,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/errno.h>  #include <linux/mlx4/cmd.h> diff --git a/drivers/net/mlx4/pd.c b/drivers/net/mlx4/pd.c index 26d1a7a9e37..c4988d6bd5b 100644 --- a/drivers/net/mlx4/pd.c +++ b/drivers/net/mlx4/pd.c @@ -31,7 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/errno.h>  #include <asm/page.h> diff --git a/drivers/net/mlx4/profile.c b/drivers/net/mlx4/profile.c index bd22df95adf..ca25b9dc837 100644 --- a/drivers/net/mlx4/profile.c +++ b/drivers/net/mlx4/profile.c @@ -32,8 +32,6 @@   * SOFTWARE.   */ -#include <linux/init.h> -  #include "mlx4.h"  #include "fw.h" diff --git a/drivers/net/mlx4/qp.c b/drivers/net/mlx4/qp.c index 1c565ef8d17..42ab9fc01d3 100644 --- a/drivers/net/mlx4/qp.c +++ b/drivers/net/mlx4/qp.c @@ -33,8 +33,6 @@   * SOFTWARE.   */ -#include <linux/init.h> -  #include <linux/mlx4/cmd.h>  #include <linux/mlx4/qp.h> diff --git a/drivers/net/mlx4/reset.c b/drivers/net/mlx4/reset.c index 3951b884c0f..e5741dab382 100644 --- a/drivers/net/mlx4/reset.c +++ b/drivers/net/mlx4/reset.c @@ -31,7 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h>  #include <linux/errno.h>  #include <linux/pci.h>  #include <linux/delay.h> diff --git a/drivers/net/mlx4/srq.c b/drivers/net/mlx4/srq.c index fe9f218691f..1377d0dc8f1 100644 --- a/drivers/net/mlx4/srq.c +++ b/drivers/net/mlx4/srq.c @@ -31,8 +31,6 @@   * SOFTWARE.   */ -#include <linux/init.h> -  #include <linux/mlx4/cmd.h>  #include "mlx4.h" diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 42b6c6319bc..87214a257d2 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -130,17 +130,10 @@ static inline struct tun_sock *tun_sk(struct sock *sk)  static int tun_attach(struct tun_struct *tun, struct file *file)  {  	struct tun_file *tfile = file->private_data; -	const struct cred *cred = current_cred();  	int err;  	ASSERT_RTNL(); -	/* Check permissions */ -	if (((tun->owner != -1 && cred->euid != tun->owner) || -	     (tun->group != -1 && !in_egroup_p(tun->group))) && -		!capable(CAP_NET_ADMIN)) -		return -EPERM; -  	netif_tx_lock_bh(tun->dev);  	err = -EINVAL; @@ -926,6 +919,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  	dev = __dev_get_by_name(net, ifr->ifr_name);  	if (dev) { +		const struct cred *cred = current_cred(); +  		if (ifr->ifr_flags & IFF_TUN_EXCL)  			return -EBUSY;  		if ((ifr->ifr_flags & IFF_TUN) && dev->netdev_ops == &tun_netdev_ops) @@ -935,6 +930,14 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  		else  			return -EINVAL; +		if (((tun->owner != -1 && cred->euid != tun->owner) || +		     (tun->group != -1 && !in_egroup_p(tun->group))) && +		    !capable(CAP_NET_ADMIN)) +			return -EPERM; +		err = security_tun_dev_attach(tun->sk); +		if (err < 0) +			return err; +  		err = tun_attach(tun, file);  		if (err < 0)  			return err; @@ -947,6 +950,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  		if (!capable(CAP_NET_ADMIN))  			return -EPERM; +		err = security_tun_dev_create(); +		if (err < 0) +			return err;  		/* Set dev type */  		if (ifr->ifr_flags & IFF_TUN) { @@ -989,6 +995,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  		tun->sk = sk;  		container_of(sk, struct tun_sock, sk)->tun = tun; +		security_tun_dev_post_create(sk); +  		tun_net_init(dev);  		if (strchr(dev->name, '%')) {  |