diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpio/gpiolib-acpi.c | 56 | ||||
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 30 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 8 | ||||
| -rw-r--r-- | drivers/vhost/vhost.c | 9 | 
8 files changed, 81 insertions, 34 deletions
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index e2232cbcec8b..addd9fecc198 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -25,6 +25,7 @@  struct acpi_gpio_event {  	struct list_head node; +	struct list_head initial_sync_list;  	acpi_handle handle;  	unsigned int pin;  	unsigned int irq; @@ -50,6 +51,9 @@ struct acpi_gpio_chip {  	struct list_head events;  }; +static LIST_HEAD(acpi_gpio_initial_sync_list); +static DEFINE_MUTEX(acpi_gpio_initial_sync_list_lock); +  static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)  {  	if (!gc->parent) @@ -85,6 +89,21 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)  	return gpiochip_get_desc(chip, pin);  } +static void acpi_gpio_add_to_initial_sync_list(struct acpi_gpio_event *event) +{ +	mutex_lock(&acpi_gpio_initial_sync_list_lock); +	list_add(&event->initial_sync_list, &acpi_gpio_initial_sync_list); +	mutex_unlock(&acpi_gpio_initial_sync_list_lock); +} + +static void acpi_gpio_del_from_initial_sync_list(struct acpi_gpio_event *event) +{ +	mutex_lock(&acpi_gpio_initial_sync_list_lock); +	if (!list_empty(&event->initial_sync_list)) +		list_del_init(&event->initial_sync_list); +	mutex_unlock(&acpi_gpio_initial_sync_list_lock); +} +  static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)  {  	struct acpi_gpio_event *event = data; @@ -136,7 +155,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,  	irq_handler_t handler = NULL;  	struct gpio_desc *desc;  	unsigned long irqflags; -	int ret, pin, irq; +	int ret, pin, irq, value;  	if (!acpi_gpio_get_irq_resource(ares, &agpio))  		return AE_OK; @@ -167,6 +186,8 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,  	gpiod_direction_input(desc); +	value = gpiod_get_value(desc); +  	ret = gpiochip_lock_as_irq(chip, pin);  	if (ret) {  		dev_err(chip->parent, "Failed to lock GPIO as interrupt\n"); @@ -208,6 +229,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,  	event->irq = irq;  	event->pin = pin;  	event->desc = desc; +	INIT_LIST_HEAD(&event->initial_sync_list);  	ret = request_threaded_irq(event->irq, NULL, handler, irqflags,  				   "ACPI:Event", event); @@ -222,6 +244,18 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,  		enable_irq_wake(irq);  	list_add_tail(&event->node, &acpi_gpio->events); + +	/* +	 * Make sure we trigger the initial state of the IRQ when using RISING +	 * or FALLING.  Note we run the handlers on late_init, the AML code +	 * may refer to OperationRegions from other (builtin) drivers which +	 * may be probed after us. +	 */ +	if (handler == acpi_gpio_irq_handler && +	    (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || +	     ((irqflags & IRQF_TRIGGER_FALLING) && value == 0))) +		acpi_gpio_add_to_initial_sync_list(event); +  	return AE_OK;  fail_free_event: @@ -294,6 +328,8 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)  	list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {  		struct gpio_desc *desc; +		acpi_gpio_del_from_initial_sync_list(event); +  		if (irqd_is_wakeup_set(irq_get_irq_data(event->irq)))  			disable_irq_wake(event->irq); @@ -1158,3 +1194,21 @@ bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id)  	return con_id == NULL;  } + +/* Sync the initial state of handlers after all builtin drivers have probed */ +static int acpi_gpio_initial_sync(void) +{ +	struct acpi_gpio_event *event, *ep; + +	mutex_lock(&acpi_gpio_initial_sync_list_lock); +	list_for_each_entry_safe(event, ep, &acpi_gpio_initial_sync_list, +				 initial_sync_list) { +		acpi_evaluate_object(event->handle, NULL, NULL, NULL); +		list_del_init(&event->initial_sync_list); +	} +	mutex_unlock(&acpi_gpio_initial_sync_list_lock); + +	return 0; +} +/* We must use _sync so that this runs after the first deferred_probe run */ +late_initcall_sync(acpi_gpio_initial_sync); diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c index 956860a69797..3bdab972420b 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c @@ -762,7 +762,7 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self,  	hw_atl_rpfl2promiscuous_mode_en_set(self, IS_FILTER_ENABLED(IFF_PROMISC));  	hw_atl_rpfl2multicast_flr_en_set(self, -					 IS_FILTER_ENABLED(IFF_MULTICAST), 0); +					 IS_FILTER_ENABLED(IFF_ALLMULTI), 0);  	hw_atl_rpfl2_accept_all_mc_packets_set(self,  					       IS_FILTER_ENABLED(IFF_ALLMULTI)); diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c index 5d08d2aeb172..e337da6ba2a4 100644 --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c @@ -1083,6 +1083,8 @@ static int bgx_lmac_enable(struct bgx *bgx, u8 lmacid)  	lmac->dmacs_count = (RX_DMAC_COUNT / bgx->lmac_count);  	lmac->dmacs = kcalloc(lmac->dmacs_count, sizeof(*lmac->dmacs),  			      GFP_KERNEL); +	if (!lmac->dmacs) +		return -ENOMEM;  	/* Enable lmac */  	bgx_reg_modify(bgx, lmacid, BGX_CMRX_CFG, CMR_EN); diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c index 00fc5f1afb1d..7dddb9e748b8 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c @@ -1038,10 +1038,8 @@ static void mk_act_open_req(struct filter_entry *f, struct sk_buff *skb,  	OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, qid_filterid));  	req->local_port = cpu_to_be16(f->fs.val.lport);  	req->peer_port = cpu_to_be16(f->fs.val.fport); -	req->local_ip = f->fs.val.lip[0] | f->fs.val.lip[1] << 8 | -		f->fs.val.lip[2] << 16 | f->fs.val.lip[3] << 24; -	req->peer_ip = f->fs.val.fip[0] | f->fs.val.fip[1] << 8 | -		f->fs.val.fip[2] << 16 | f->fs.val.fip[3] << 24; +	memcpy(&req->local_ip, f->fs.val.lip, 4); +	memcpy(&req->peer_ip, f->fs.val.fip, 4);  	req->opt0 = cpu_to_be64(NAGLE_V(f->fs.newvlan == VLAN_REMOVE ||  					f->fs.newvlan == VLAN_REWRITE) |  				DELACK_V(f->fs.hitcnts) | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index eb9eb7aa953a..405236cf0b04 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -858,8 +858,6 @@ struct mlx5e_profile {  		mlx5e_fp_handle_rx_cqe handle_rx_cqe;  		mlx5e_fp_handle_rx_cqe handle_rx_cqe_mpwqe;  	} rx_handlers; -	void	(*netdev_registered_init)(struct mlx5e_priv *priv); -	void    (*netdev_registered_remove)(struct mlx5e_priv *priv);  	int	max_tc;  }; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index e33afa8d2417..722998d68564 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c @@ -443,16 +443,12 @@ static int mlx5e_dcbnl_ieee_setapp(struct net_device *dev, struct dcb_app *app)  	bool is_new;  	int err; -	if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP) -		return -EINVAL; - -	if (!MLX5_CAP_GEN(priv->mdev, vport_group_manager)) -		return -EINVAL; - -	if (!MLX5_DSCP_SUPPORTED(priv->mdev)) -		return -EINVAL; +	if (!MLX5_CAP_GEN(priv->mdev, vport_group_manager) || +	    !MLX5_DSCP_SUPPORTED(priv->mdev)) +		return -EOPNOTSUPP; -	if (app->protocol >= MLX5E_MAX_DSCP) +	if ((app->selector != IEEE_8021QAZ_APP_SEL_DSCP) || +	    (app->protocol >= MLX5E_MAX_DSCP))  		return -EINVAL;  	/* Save the old entry info */ @@ -500,16 +496,12 @@ static int mlx5e_dcbnl_ieee_delapp(struct net_device *dev, struct dcb_app *app)  	struct mlx5e_priv *priv = netdev_priv(dev);  	int err; -	if (app->selector != IEEE_8021QAZ_APP_SEL_DSCP) -		return -EINVAL; - -	if (!MLX5_CAP_GEN(priv->mdev, vport_group_manager)) -		return -EINVAL; - -	if (!MLX5_DSCP_SUPPORTED(priv->mdev)) -		return -EINVAL; +	if  (!MLX5_CAP_GEN(priv->mdev, vport_group_manager) || +	     !MLX5_DSCP_SUPPORTED(priv->mdev)) +		return -EOPNOTSUPP; -	if (app->protocol >= MLX5E_MAX_DSCP) +	if ((app->selector != IEEE_8021QAZ_APP_SEL_DSCP) || +	    (app->protocol >= MLX5E_MAX_DSCP))  		return -EINVAL;  	/* Skip if no dscp app entry */ @@ -1146,7 +1138,7 @@ static int mlx5e_set_trust_state(struct mlx5e_priv *priv, u8 trust_state)  {  	int err; -	err =  mlx5_set_trust_state(priv->mdev, trust_state); +	err = mlx5_set_trust_state(priv->mdev, trust_state);  	if (err)  		return err;  	priv->dcbx_dp.trust_state = trust_state; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 3a2c4e548226..dfbcda0d0e08 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -1970,15 +1970,15 @@ static bool actions_match_supported(struct mlx5e_priv *priv,  static bool same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv)  {  	struct mlx5_core_dev *fmdev, *pmdev; -	u16 func_id, peer_id; +	u64 fsystem_guid, psystem_guid;  	fmdev = priv->mdev;  	pmdev = peer_priv->mdev; -	func_id = (u16)((fmdev->pdev->bus->number << 8) | PCI_SLOT(fmdev->pdev->devfn)); -	peer_id = (u16)((pmdev->pdev->bus->number << 8) | PCI_SLOT(pmdev->pdev->devfn)); +	mlx5_query_nic_vport_system_image_guid(fmdev, &fsystem_guid); +	mlx5_query_nic_vport_system_image_guid(pmdev, &psystem_guid); -	return (func_id == peer_id); +	return (fsystem_guid == psystem_guid);  }  static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts, diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index a502f1af4a21..ed3114556fda 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -1560,9 +1560,12 @@ int vhost_init_device_iotlb(struct vhost_dev *d, bool enabled)  	d->iotlb = niotlb;  	for (i = 0; i < d->nvqs; ++i) { -		mutex_lock(&d->vqs[i]->mutex); -		d->vqs[i]->iotlb = niotlb; -		mutex_unlock(&d->vqs[i]->mutex); +		struct vhost_virtqueue *vq = d->vqs[i]; + +		mutex_lock(&vq->mutex); +		vq->iotlb = niotlb; +		__vhost_vq_meta_reset(vq); +		mutex_unlock(&vq->mutex);  	}  	vhost_umem_clean(oiotlb);  | 
