diff options
Diffstat (limited to 'drivers/edac/edac_mc.c')
| -rw-r--r-- | drivers/edac/edac_mc.c | 21 | 
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 89e109022d7..2c694b5297c 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -559,7 +559,8 @@ static void edac_mc_workq_function(struct work_struct *work_req)   *   *		called with the mem_ctls_mutex held   */ -static void edac_mc_workq_setup(struct mem_ctl_info *mci, unsigned msec) +static void edac_mc_workq_setup(struct mem_ctl_info *mci, unsigned msec, +				bool init)  {  	edac_dbg(0, "\n"); @@ -567,7 +568,9 @@ static void edac_mc_workq_setup(struct mem_ctl_info *mci, unsigned msec)  	if (mci->op_state != OP_RUNNING_POLL)  		return; -	INIT_DELAYED_WORK(&mci->work, edac_mc_workq_function); +	if (init) +		INIT_DELAYED_WORK(&mci->work, edac_mc_workq_function); +  	mod_delayed_work(edac_workqueue, &mci->work, msecs_to_jiffies(msec));  } @@ -601,7 +604,7 @@ static void edac_mc_workq_teardown(struct mem_ctl_info *mci)   *	user space has updated our poll period value, need to   *	reset our workq delays   */ -void edac_mc_reset_delay_period(int value) +void edac_mc_reset_delay_period(unsigned long value)  {  	struct mem_ctl_info *mci;  	struct list_head *item; @@ -611,7 +614,7 @@ void edac_mc_reset_delay_period(int value)  	list_for_each(item, &mc_devices) {  		mci = list_entry(item, struct mem_ctl_info, link); -		edac_mc_workq_setup(mci, (unsigned long) value); +		edac_mc_workq_setup(mci, value, false);  	}  	mutex_unlock(&mem_ctls_mutex); @@ -782,14 +785,16 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)  		/* This instance is NOW RUNNING */  		mci->op_state = OP_RUNNING_POLL; -		edac_mc_workq_setup(mci, edac_mc_get_poll_msec()); +		edac_mc_workq_setup(mci, edac_mc_get_poll_msec(), true);  	} else {  		mci->op_state = OP_RUNNING_INTERRUPT;  	}  	/* Report action taken */ -	edac_mc_printk(mci, KERN_INFO, "Giving out device to '%s' '%s':" -		" DEV %s\n", mci->mod_name, mci->ctl_name, edac_dev_name(mci)); +	edac_mc_printk(mci, KERN_INFO, +		"Giving out device to module %s controller %s: DEV %s (%s)\n", +		mci->mod_name, mci->ctl_name, mci->dev_name, +		edac_op_state_to_string(mci->op_state));  	edac_mc_owner = mci->mod_name; @@ -1013,7 +1018,7 @@ static void edac_ce_error(struct mem_ctl_info *mci,  	}  	edac_inc_ce_error(mci, enable_per_layer_report, pos, error_count); -	if (mci->scrub_mode & SCRUB_SW_SRC) { +	if (mci->scrub_mode == SCRUB_SW_SRC) {  		/*  			* Some memory controllers (called MCs below) can remap  			* memory so that it is still available at a different  | 
