Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 324310
b: refs/heads/master
c: c216fde
h: refs/heads/master
v: v3
  • Loading branch information
Tomas Winkler authored and Greg Kroah-Hartman committed Aug 16, 2012
1 parent add485c commit 8750d76
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 248ffdf7c95726a8dae76e25fdb037899c5b77fa
refs/heads/master: c216fdeb2e7371554c56ba457c374cce9c77f91a
1 change: 0 additions & 1 deletion trunk/drivers/misc/mei/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,6 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled)

dev->me_clients_num = 0;
dev->rd_msg_hdr = 0;
dev->stop = false;
dev->wd_pending = false;

/* update the state of the registers after reset */
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/misc/mei/interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ int mei_flow_ctrl_creds(struct mei_device *dev, struct mei_cl *cl);


int mei_wd_send(struct mei_device *dev);
int mei_wd_stop(struct mei_device *dev, bool preserve);
int mei_wd_stop(struct mei_device *dev);
int mei_wd_host_init(struct mei_device *dev);
/*
* mei_watchdog_register - Registering watchdog interface
Expand Down
9 changes: 3 additions & 6 deletions trunk/drivers/misc/mei/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1224,10 +1224,9 @@ static int mei_irq_thread_write_handler(struct mei_io_list *cmpl_list,
}
}

if (dev->stop && !dev->wd_pending) {
dev->wd_stopped = true;
if (dev->wd_state == MEI_WD_STOPPING) {
dev->wd_state = MEI_WD_IDLE;
wake_up_interruptible(&dev->wait_stop_wd);
return 0;
}

if (dev->extra_write_index) {
Expand All @@ -1250,14 +1249,12 @@ static int mei_irq_thread_write_handler(struct mei_io_list *cmpl_list,

dev->wd_pending = false;

if (dev->wd_timeout)
if (dev->wd_state == MEI_WD_RUNNING)
*slots -= mei_data2slots(MEI_WD_START_MSG_SIZE);
else
*slots -= mei_data2slots(MEI_WD_STOP_MSG_SIZE);
}
}
if (dev->stop)
return -ENODEV;

/* complete control write list CB */
dev_dbg(&dev->pdev->dev, "complete control write list cb.\n");
Expand Down
9 changes: 7 additions & 2 deletions trunk/drivers/misc/mei/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1060,7 +1060,9 @@ static void __devexit mei_remove(struct pci_dev *pdev)

mutex_lock(&dev->device_lock);

mei_wd_stop(dev, false);
cancel_delayed_work(&dev->timer_work);

mei_wd_stop(dev);

mei_device = NULL;

Expand Down Expand Up @@ -1115,8 +1117,11 @@ static int mei_pci_suspend(struct device *device)
if (!dev)
return -ENODEV;
mutex_lock(&dev->device_lock);

cancel_delayed_work(&dev->timer_work);

/* Stop watchdog if exists */
err = mei_wd_stop(dev, true);
err = mei_wd_stop(dev);
/* Set new mei state */
if (dev->dev_state == MEI_DEV_ENABLED ||
dev->dev_state == MEI_DEV_RECOVERING_FROM_RESET) {
Expand Down
14 changes: 10 additions & 4 deletions trunk/drivers/misc/mei/mei_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
#define MEI_WD_MIN_TIMEOUT 120 /* seconds */
#define MEI_WD_MAX_TIMEOUT 65535 /* seconds */

#define MEI_WD_STOP_TIMEOUT 10 /* msecs */

#define MEI_WD_STATE_INDEPENDENCE_MSG_SENT (1 << 0)

#define MEI_RD_MSG_BUF_SIZE (128 * sizeof(u32))
Expand Down Expand Up @@ -120,6 +122,12 @@ enum mei_file_transaction_states {
MEI_READ_COMPLETE
};

enum mei_wd_states {
MEI_WD_IDLE,
MEI_WD_RUNNING,
MEI_WD_STOPPING,
};

/* MEI CB */
enum mei_cb_major_types {
MEI_READ = 0,
Expand Down Expand Up @@ -228,7 +236,6 @@ struct mei_device {
enum mei_dev_state dev_state;
enum mei_init_clients_states init_clients_state;
u16 init_clients_timer;
bool stop;
bool need_reset;

u32 extra_write_index;
Expand All @@ -248,11 +255,10 @@ struct mei_device {
bool mei_host_buffer_is_empty;

struct mei_cl wd_cl;
enum mei_wd_states wd_state;
bool wd_interface_reg;
bool wd_pending;
bool wd_stopped;
bool wd_bypass; /* if false, don't refresh watchdog ME client */
u16 wd_timeout; /* seconds ((wd_data[1] << 8) + wd_data[0]) */
u16 wd_timeout;
unsigned char wd_data[MEI_WD_START_MSG_SIZE];


Expand Down
26 changes: 13 additions & 13 deletions trunk/drivers/misc/mei/wd.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ int mei_wd_host_init(struct mei_device *dev)
/* look for WD client and connect to it */
dev->wd_cl.state = MEI_FILE_DISCONNECTED;
dev->wd_timeout = MEI_WD_DEFAULT_TIMEOUT;
dev->wd_state = MEI_WD_IDLE;

/* find ME WD client */
mei_me_cl_update_filext(dev, &dev->wd_cl,
Expand Down Expand Up @@ -128,18 +129,17 @@ int mei_wd_send(struct mei_device *dev)
* -EIO when message send fails
* -EINVAL when invalid message is to be sent
*/
int mei_wd_stop(struct mei_device *dev, bool preserve)
int mei_wd_stop(struct mei_device *dev)
{
int ret;
u16 wd_timeout = dev->wd_timeout;

cancel_delayed_work(&dev->timer_work);
if (dev->wd_cl.state != MEI_FILE_CONNECTED || !dev->wd_timeout)
if (dev->wd_cl.state != MEI_FILE_CONNECTED ||
dev->wd_state != MEI_WD_RUNNING)
return 0;

dev->wd_timeout = 0;
memcpy(dev->wd_data, mei_stop_wd_params, MEI_WD_STOP_MSG_SIZE);
dev->stop = true;

dev->wd_state = MEI_WD_STOPPING;

ret = mei_flow_ctrl_creds(dev, &dev->wd_cl);
if (ret < 0)
Expand All @@ -161,13 +161,14 @@ int mei_wd_stop(struct mei_device *dev, bool preserve)
} else {
dev->wd_pending = true;
}
dev->wd_stopped = false;

mutex_unlock(&dev->device_lock);

ret = wait_event_interruptible_timeout(dev->wait_stop_wd,
dev->wd_stopped, 10 * HZ);
dev->wd_state == MEI_WD_IDLE,
msecs_to_jiffies(MEI_WD_STOP_TIMEOUT));
mutex_lock(&dev->device_lock);
if (dev->wd_stopped) {
if (dev->wd_state == MEI_WD_IDLE) {
dev_dbg(&dev->pdev->dev, "wd: stop completed ret=%d.\n", ret);
ret = 0;
} else {
Expand All @@ -177,9 +178,6 @@ int mei_wd_stop(struct mei_device *dev, bool preserve)
"wd: stop failed to complete ret=%d.\n", ret);
}

if (preserve)
dev->wd_timeout = wd_timeout;

out:
return ret;
}
Expand Down Expand Up @@ -239,7 +237,7 @@ static int mei_wd_ops_stop(struct watchdog_device *wd_dev)
return -ENODEV;

mutex_lock(&dev->device_lock);
mei_wd_stop(dev, false);
mei_wd_stop(dev);
mutex_unlock(&dev->device_lock);

return 0;
Expand Down Expand Up @@ -269,6 +267,8 @@ static int mei_wd_ops_ping(struct watchdog_device *wd_dev)
goto end;
}

dev->wd_state = MEI_WD_RUNNING;

/* Check if we can send the ping to HW*/
if (dev->mei_host_buffer_is_empty &&
mei_flow_ctrl_creds(dev, &dev->wd_cl) > 0) {
Expand Down

0 comments on commit 8750d76

Please sign in to comment.