@@ -4125,12 +4125,58 @@ static const struct pci_error_handlers mlx4_err_handler = {
41254125 .resume = mlx4_pci_resume ,
41264126};
41274127
4128+ static int mlx4_suspend (struct pci_dev * pdev , pm_message_t state )
4129+ {
4130+ struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
4131+ struct mlx4_dev * dev = persist -> dev ;
4132+
4133+ mlx4_err (dev , "suspend was called\n" );
4134+ mutex_lock (& persist -> interface_state_mutex );
4135+ if (persist -> interface_state & MLX4_INTERFACE_STATE_UP )
4136+ mlx4_unload_one (pdev );
4137+ mutex_unlock (& persist -> interface_state_mutex );
4138+
4139+ return 0 ;
4140+ }
4141+
4142+ static int mlx4_resume (struct pci_dev * pdev )
4143+ {
4144+ struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
4145+ struct mlx4_dev * dev = persist -> dev ;
4146+ struct mlx4_priv * priv = mlx4_priv (dev );
4147+ int nvfs [MLX4_MAX_PORTS + 1 ] = {0 , 0 , 0 };
4148+ int total_vfs ;
4149+ int ret = 0 ;
4150+
4151+ mlx4_err (dev , "resume was called\n" );
4152+ total_vfs = dev -> persist -> num_vfs ;
4153+ memcpy (nvfs , dev -> persist -> nvfs , sizeof (dev -> persist -> nvfs ));
4154+
4155+ mutex_lock (& persist -> interface_state_mutex );
4156+ if (!(persist -> interface_state & MLX4_INTERFACE_STATE_UP )) {
4157+ ret = mlx4_load_one (pdev , priv -> pci_dev_data , total_vfs ,
4158+ nvfs , priv , 1 );
4159+ if (!ret ) {
4160+ ret = restore_current_port_types (dev ,
4161+ dev -> persist -> curr_port_type ,
4162+ dev -> persist -> curr_port_poss_type );
4163+ if (ret )
4164+ mlx4_err (dev , "resume: could not restore original port types (%d)\n" , ret );
4165+ }
4166+ }
4167+ mutex_unlock (& persist -> interface_state_mutex );
4168+
4169+ return ret ;
4170+ }
4171+
41284172static struct pci_driver mlx4_driver = {
41294173 .name = DRV_NAME ,
41304174 .id_table = mlx4_pci_table ,
41314175 .probe = mlx4_init_one ,
41324176 .shutdown = mlx4_shutdown ,
41334177 .remove = mlx4_remove_one ,
4178+ .suspend = mlx4_suspend ,
4179+ .resume = mlx4_resume ,
41344180 .err_handler = & mlx4_err_handler ,
41354181};
41364182
0 commit comments