Release 4.4.18-openpower1

  - v4.4.18 stable release
  - drop 'scsi: ignore errors from scsi_dh_add_device()' as this is
    included in the upstream stable release
  - drop 'drivers/drm/ast: Update VGA Ownership register value' as
    this was found to not fix the issue it was claimed to have fixed

Signed-off-by: Joel Stanley <joel@jms.id.au>
diff --git a/openpower/linux/0005-net-mlx5-Add-pci-shutdown-callback.patch b/openpower/linux/0005-net-mlx5-Add-pci-shutdown-callback.patch
new file mode 100644
index 0000000..0e4c61a
--- /dev/null
+++ b/openpower/linux/0005-net-mlx5-Add-pci-shutdown-callback.patch
@@ -0,0 +1,161 @@
+From 029b63c53cbd2092288ecb68e2304d880332a81f Mon Sep 17 00:00:00 2001
+From: Carol L Soto <clsoto@linux.vnet.ibm.com>
+Date: Tue, 12 Jul 2016 17:04:07 -0500
+Subject: [PATCH 5/9] net/mlx5: Add pci shutdown callback
+
+Backport of commit 5fc7197d3a256 ("net/mlx5: Add pci shutdown callback")
+so we can use for the OpenPower kernel.
+
+This patch introduces kexec support for mlx5.
+When switching kernels, kexec() calls shutdown, which unloads
+the driver and cleans its resources.
+
+In addition, remove unregister netdev from shutdown flow. This will
+allow a clean shutdown, even if some netdev clients did not release their
+reference from this netdev. Releasing The HW resources only is enough as
+the kernel is shutting down
+
+Signed-off-by: Majd Dibbiny <majd@mellanox.com>
+Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
+Signed-off-by: Haggai Abramovsky <hagaya@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Carol L Soto <clsoto@linux.vnet.ibm.com>
+(cherry picked from commit 5fc7197d3a256d9c5de3134870304b24892a4908)
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 15 +++++++++++++--
+ drivers/net/ethernet/mellanox/mlx5/core/main.c    | 23 +++++++++++++++++++----
+ include/linux/mlx5/driver.h                       |  7 ++++---
+ 3 files changed, 36 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+index cbd17e25beeb..887a54c8e98b 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+@@ -2241,7 +2241,16 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
+ 	schedule_work(&priv->set_rx_mode_work);
+ 	mlx5e_disable_async_events(priv);
+ 	flush_scheduled_work();
+-	unregister_netdev(netdev);
++	if (test_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &mdev->intf_state)) {
++		netif_device_detach(netdev);
++		mutex_lock(&priv->state_lock);
++		if (test_bit(MLX5E_STATE_OPENED, &priv->state))
++			mlx5e_close_locked(netdev);
++		mutex_unlock(&priv->state_lock);
++	} else {
++		unregister_netdev(netdev);
++	}
++
+ 	mlx5e_destroy_flow_tables(priv);
+ 	mlx5e_destroy_tirs(priv);
+ 	mlx5e_destroy_rqt(priv, MLX5E_SINGLE_RQ_RQT);
+@@ -2252,7 +2261,9 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
+ 	mlx5_dealloc_transport_domain(priv->mdev, priv->tdn);
+ 	mlx5_core_dealloc_pd(priv->mdev, priv->pdn);
+ 	mlx5_unmap_free_uar(priv->mdev, &priv->cq_uar);
+-	free_netdev(netdev);
++
++	if (!test_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &mdev->intf_state))
++		free_netdev(netdev);
+ }
+ 
+ static void *mlx5e_get_netdev(void *vpriv)
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 6cf6d93d8831..8a371bdb823e 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -914,7 +914,7 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+ 	int err;
+ 
+ 	mutex_lock(&dev->intf_state_mutex);
+-	if (dev->interface_state == MLX5_INTERFACE_STATE_UP) {
++	if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
+ 		dev_warn(&dev->pdev->dev, "%s: interface is up, NOP\n",
+ 			 __func__);
+ 		goto out;
+@@ -1063,7 +1063,8 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+ 	if (err)
+ 		pr_info("failed request module on %s\n", MLX5_IB_MOD);
+ 
+-	dev->interface_state = MLX5_INTERFACE_STATE_UP;
++	clear_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state);
++	set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
+ out:
+ 	mutex_unlock(&dev->intf_state_mutex);
+ 
+@@ -1125,7 +1126,7 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+ 	int err = 0;
+ 
+ 	mutex_lock(&dev->intf_state_mutex);
+-	if (dev->interface_state == MLX5_INTERFACE_STATE_DOWN) {
++	if (test_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state)) {
+ 		dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n",
+ 			 __func__);
+ 		goto out;
+@@ -1155,7 +1156,8 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
+ 	mlx5_cmd_cleanup(dev);
+ 
+ out:
+-	dev->interface_state = MLX5_INTERFACE_STATE_DOWN;
++	clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
++	set_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state);
+ 	mutex_unlock(&dev->intf_state_mutex);
+ 	return err;
+ }
+@@ -1365,6 +1367,18 @@ static const struct pci_error_handlers mlx5_err_handler = {
+ 	.resume		= mlx5_pci_resume
+ };
+ 
++static void shutdown(struct pci_dev *pdev)
++{
++	struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
++	struct mlx5_priv *priv = &dev->priv;
++
++	dev_info(&pdev->dev, "Shutdown was called\n");
++	/* Notify mlx5 clients that the kernel is being shut down */
++	set_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &dev->intf_state);
++	mlx5_unload_one(dev, priv);
++	mlx5_pci_disable_device(dev);
++}
++
+ static const struct pci_device_id mlx5_core_pci_table[] = {
+ 	{ PCI_VDEVICE(MELLANOX, 0x1011) }, /* Connect-IB */
+ 	{ PCI_VDEVICE(MELLANOX, 0x1012) }, /* Connect-IB VF */
+@@ -1382,6 +1396,7 @@ static struct pci_driver mlx5_core_driver = {
+ 	.id_table       = mlx5_core_pci_table,
+ 	.probe          = init_one,
+ 	.remove         = remove_one,
++	.shutdown       = shutdown,
+ 	.err_handler	= &mlx5_err_handler
+ };
+ 
+diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
+index 412aa988c6ad..dc26d9942120 100644
+--- a/include/linux/mlx5/driver.h
++++ b/include/linux/mlx5/driver.h
+@@ -493,8 +493,9 @@ enum mlx5_device_state {
+ };
+ 
+ enum mlx5_interface_state {
+-	MLX5_INTERFACE_STATE_DOWN,
+-	MLX5_INTERFACE_STATE_UP,
++	MLX5_INTERFACE_STATE_DOWN = BIT(0),
++	MLX5_INTERFACE_STATE_UP = BIT(1),
++	MLX5_INTERFACE_STATE_SHUTDOWN = BIT(2),
+ };
+ 
+ enum mlx5_pci_status {
+@@ -518,7 +519,7 @@ struct mlx5_core_dev {
+ 	enum mlx5_device_state	state;
+ 	/* sync interface state */
+ 	struct mutex		intf_state_mutex;
+-	enum mlx5_interface_state interface_state;
++	unsigned long		intf_state;
+ 	void			(*event) (struct mlx5_core_dev *dev,
+ 					  enum mlx5_dev_event event,
+ 					  unsigned long param);
+-- 
+2.8.1
+