diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 10:57:56 +0400 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-08-17 11:01:08 +0400 | 
| commit | a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4 (patch) | |
| tree | 61a2eb7fa62f5af10c2b913ca429e6b068b0eb2d /drivers/misc/mei/interface.c | |
| parent | 20d5a540e55a29daeef12706f9ee73baf5641c16 (diff) | |
| parent | d9875690d9b89a866022ff49e3fcea892345ad92 (diff) | |
| download | linux-a22ddff8bedfe33eeb1330bbb7ef1fbe007a42c4.tar.xz | |
Merge tag 'v3.6-rc2' into drm-intel-next
Backmerge Linux 3.6-rc2 to resolve a few funny conflicts before we put
even more madness on top:
- drivers/gpu/drm/i915/i915_irq.c: Just a spurious WARN removed in
  -fixes, that has been changed in a variable-rename in -next, too.
- drivers/gpu/drm/i915/intel_ringbuffer.c: -next remove scratch_addr
  (since all their users have been extracted in another fucntion),
  -fixes added another user for a hw workaroudn.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/misc/mei/interface.c')
| -rw-r--r-- | drivers/misc/mei/interface.c | 85 | 
1 files changed, 32 insertions, 53 deletions
diff --git a/drivers/misc/mei/interface.c b/drivers/misc/mei/interface.c index 428d21e36416..509c3957ff45 100644 --- a/drivers/misc/mei/interface.c +++ b/drivers/misc/mei/interface.c @@ -58,16 +58,18 @@ void mei_disable_interrupts(struct mei_device *dev)  }  /** - * _host_get_filled_slots - gets number of device filled buffer slots + * mei_hbuf_filled_slots - gets number of device filled buffer slots   *   * @device: the device structure   *   * returns number of filled slots   */ -static unsigned char _host_get_filled_slots(const struct mei_device *dev) +static unsigned char mei_hbuf_filled_slots(struct mei_device *dev)  {  	char read_ptr, write_ptr; +	dev->host_hw_state = mei_hcsr_read(dev); +  	read_ptr = (char) ((dev->host_hw_state & H_CBRP) >> 8);  	write_ptr = (char) ((dev->host_hw_state & H_CBWP) >> 16); @@ -75,43 +77,33 @@ static unsigned char _host_get_filled_slots(const struct mei_device *dev)  }  /** - * mei_host_buffer_is_empty - checks if host buffer is empty. + * mei_hbuf_is_empty - checks if host buffer is empty.   *   * @dev: the device structure   * - * returns 1 if empty, 0 - otherwise. + * returns true if empty, false - otherwise.   */ -int mei_host_buffer_is_empty(struct mei_device *dev) +bool mei_hbuf_is_empty(struct mei_device *dev)  { -	unsigned char filled_slots; - -	dev->host_hw_state = mei_hcsr_read(dev); -	filled_slots = _host_get_filled_slots(dev); - -	if (filled_slots == 0) -		return 1; - -	return 0; +	return mei_hbuf_filled_slots(dev) == 0;  }  /** - * mei_count_empty_write_slots - counts write empty slots. + * mei_hbuf_empty_slots - counts write empty slots.   *   * @dev: the device structure   *   * returns -1(ESLOTS_OVERFLOW) if overflow, otherwise empty slots count   */ -int mei_count_empty_write_slots(struct mei_device *dev) +int mei_hbuf_empty_slots(struct mei_device *dev)  { -	unsigned char buffer_depth, filled_slots, empty_slots; +	unsigned char filled_slots, empty_slots; -	dev->host_hw_state = mei_hcsr_read(dev); -	buffer_depth = (unsigned char) ((dev->host_hw_state & H_CBD) >> 24); -	filled_slots = _host_get_filled_slots(dev); -	empty_slots = buffer_depth - filled_slots; +	filled_slots = mei_hbuf_filled_slots(dev); +	empty_slots = dev->hbuf_depth - filled_slots;  	/* check for overflow */ -	if (filled_slots > buffer_depth) +	if (filled_slots > dev->hbuf_depth)  		return -EOVERFLOW;  	return empty_slots; @@ -127,52 +119,39 @@ int mei_count_empty_write_slots(struct mei_device *dev)   *   * This function returns -EIO if write has failed   */ -int mei_write_message(struct mei_device *dev, -		      struct mei_msg_hdr *header, -		      unsigned char *write_buffer, -		      unsigned long write_length) +int mei_write_message(struct mei_device *dev, struct mei_msg_hdr *header, +		      unsigned char *buf, unsigned long length)  { -	u32 temp_msg = 0; -	unsigned long bytes_written = 0; -	unsigned char buffer_depth, filled_slots, empty_slots; -	unsigned long dw_to_write; - -	dev->host_hw_state = mei_hcsr_read(dev); +	unsigned long rem, dw_cnt; +	u32 *reg_buf = (u32 *)buf; +	int i; +	int empty_slots; -	dev_dbg(&dev->pdev->dev, -			"host_hw_state = 0x%08x.\n", -			dev->host_hw_state);  	dev_dbg(&dev->pdev->dev,  			"mei_write_message header=%08x.\n",  			*((u32 *) header)); -	buffer_depth = (unsigned char) ((dev->host_hw_state & H_CBD) >> 24); -	filled_slots = _host_get_filled_slots(dev); -	empty_slots = buffer_depth - filled_slots; -	dev_dbg(&dev->pdev->dev, -			"filled = %hu, empty = %hu.\n", -			filled_slots, empty_slots); - -	dw_to_write = ((write_length + 3) / 4); +	empty_slots = mei_hbuf_empty_slots(dev); +	dev_dbg(&dev->pdev->dev, "empty slots = %hu.\n", empty_slots); -	if (dw_to_write > empty_slots) +	dw_cnt = mei_data2slots(length); +	if (empty_slots < 0 || dw_cnt > empty_slots)  		return -EIO;  	mei_reg_write(dev, H_CB_WW, *((u32 *) header)); -	while (write_length >= 4) { -		mei_reg_write(dev, H_CB_WW, -				*(u32 *) (write_buffer + bytes_written)); -		bytes_written += 4; -		write_length -= 4; -	} +	for (i = 0; i < length / 4; i++) +		mei_reg_write(dev, H_CB_WW, reg_buf[i]); -	if (write_length > 0) { -		memcpy(&temp_msg, &write_buffer[bytes_written], write_length); -		mei_reg_write(dev, H_CB_WW, temp_msg); +	rem = length & 0x3; +	if (rem > 0) { +		u32 reg = 0; +		memcpy(®, &buf[length - rem], rem); +		mei_reg_write(dev, H_CB_WW, reg);  	} +	dev->host_hw_state = mei_hcsr_read(dev);  	dev->host_hw_state |= H_IG;  	mei_hcsr_set(dev);  	dev->me_hw_state = mei_mecsr_read(dev);  | 
