stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	Mauro Carvalho Chehab <mchehab@redhat.com>,
	Florian Mickler <florian@mickler.org>,
	Olivier Grenie <olivier.grenie@dibcom.fr>,
	Patrick Boettcher <Patrick.Boettcher@dibcom.fr>
Subject: [119/262] [media] DiBcom: protect the I2C bufer access
Date: Wed, 09 Nov 2011 13:27:21 -0800	[thread overview]
Message-ID: <20111109212712.598596211@clark.kroah.org> (raw)
In-Reply-To: <20111109212847.GA20838@kroah.com>

3.0-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Patrick Boettcher <Patrick.Boettcher@dibcom.fr>

commit 79fcce3230b140f7675f8529ee53fe2f9644f902 upstream.

This patch protects the I2C buffer access in order to manage concurrent
access. This protection is done using mutex.
Furthermore, for the dib9000, if a pid filtering command is
received during the tuning, this pid filtering command is delayed to
avoid any concurrent access issue.

Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Florian Mickler <florian@mickler.org>
Signed-off-by: Olivier Grenie <olivier.grenie@dibcom.fr>
Signed-off-by: Patrick Boettcher <Patrick.Boettcher@dibcom.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/media/dvb/frontends/dib0070.c        |   37 ++++--
 drivers/media/dvb/frontends/dib0090.c        |   70 +++++++++--
 drivers/media/dvb/frontends/dib7000m.c       |   27 ++++
 drivers/media/dvb/frontends/dib7000p.c       |   32 ++++-
 drivers/media/dvb/frontends/dib8000.c        |   72 ++++++++++-
 drivers/media/dvb/frontends/dib9000.c        |  164 +++++++++++++++++++++++----
 drivers/media/dvb/frontends/dibx000_common.c |   76 ++++++++++--
 drivers/media/dvb/frontends/dibx000_common.h |    1 
 8 files changed, 412 insertions(+), 67 deletions(-)

--- a/drivers/media/dvb/frontends/dib0070.c
+++ b/drivers/media/dvb/frontends/dib0070.c
@@ -27,6 +27,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 #include "dvb_frontend.h"
 
@@ -78,10 +79,18 @@ struct dib0070_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[3];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
-static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg)
+static u16 dib0070_read_reg(struct dib0070_state *state, u8 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = reg;
 
 	memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
@@ -96,13 +105,23 @@ static uint16_t dib0070_read_reg(struct
 
 	if (i2c_transfer(state->i2c, state->msg, 2) != 2) {
 		printk(KERN_WARNING "DiB0070 I2C read failed\n");
-		return 0;
-	}
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+		ret = 0;
+	} else
+		ret = (state->i2c_read_buffer[0] << 8)
+			| state->i2c_read_buffer[1];
+
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
 	state->i2c_write_buffer[0] = reg;
 	state->i2c_write_buffer[1] = val >> 8;
 	state->i2c_write_buffer[2] = val & 0xff;
@@ -115,9 +134,12 @@ static int dib0070_write_reg(struct dib0
 
 	if (i2c_transfer(state->i2c, state->msg, 1) != 1) {
 		printk(KERN_WARNING "DiB0070 I2C write failed\n");
-		return -EREMOTEIO;
-	}
-	return 0;
+		ret = -EREMOTEIO;
+	} else
+		ret = 0;
+
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 #define HARD_RESET(state) do { \
@@ -734,6 +756,7 @@ struct dvb_frontend *dib0070_attach(stru
 	state->cfg = cfg;
 	state->i2c = i2c;
 	state->fe  = fe;
+	mutex_init(&state->i2c_buffer_lock);
 	fe->tuner_priv = state;
 
 	if (dib0070_reset(fe) != 0)
--- a/drivers/media/dvb/frontends/dib0090.c
+++ b/drivers/media/dvb/frontends/dib0090.c
@@ -27,6 +27,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 #include "dvb_frontend.h"
 
@@ -196,6 +197,7 @@ struct dib0090_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[3];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 struct dib0090_fw_state {
@@ -208,10 +210,18 @@ struct dib0090_fw_state {
 	struct i2c_msg msg;
 	u8 i2c_write_buffer[2];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 static u16 dib0090_read_reg(struct dib0090_state *state, u8 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = reg;
 
 	memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
@@ -226,14 +236,24 @@ static u16 dib0090_read_reg(struct dib00
 
 	if (i2c_transfer(state->i2c, state->msg, 2) != 2) {
 		printk(KERN_WARNING "DiB0090 I2C read failed\n");
-		return 0;
-	}
+		ret = 0;
+	} else
+		ret = (state->i2c_read_buffer[0] << 8)
+			| state->i2c_read_buffer[1];
 
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static int dib0090_write_reg(struct dib0090_state *state, u32 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	state->i2c_write_buffer[0] = reg & 0xff;
 	state->i2c_write_buffer[1] = val >> 8;
 	state->i2c_write_buffer[2] = val & 0xff;
@@ -246,13 +266,23 @@ static int dib0090_write_reg(struct dib0
 
 	if (i2c_transfer(state->i2c, state->msg, 1) != 1) {
 		printk(KERN_WARNING "DiB0090 I2C write failed\n");
-		return -EREMOTEIO;
-	}
-	return 0;
+		ret = -EREMOTEIO;
+	} else
+		ret = 0;
+
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static u16 dib0090_fw_read_reg(struct dib0090_fw_state *state, u8 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = reg;
 
 	memset(&state->msg, 0, sizeof(struct i2c_msg));
@@ -262,13 +292,24 @@ static u16 dib0090_fw_read_reg(struct di
 	state->msg.len = 2;
 	if (i2c_transfer(state->i2c, &state->msg, 1) != 1) {
 		printk(KERN_WARNING "DiB0090 I2C read failed\n");
-		return 0;
-	}
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+		ret = 0;
+	} else
+		ret = (state->i2c_read_buffer[0] << 8)
+			| state->i2c_read_buffer[1];
+
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static int dib0090_fw_write_reg(struct dib0090_fw_state *state, u8 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	state->i2c_write_buffer[0] = val >> 8;
 	state->i2c_write_buffer[1] = val & 0xff;
 
@@ -279,9 +320,12 @@ static int dib0090_fw_write_reg(struct d
 	state->msg.len = 2;
 	if (i2c_transfer(state->i2c, &state->msg, 1) != 1) {
 		printk(KERN_WARNING "DiB0090 I2C write failed\n");
-		return -EREMOTEIO;
-	}
-	return 0;
+		ret = -EREMOTEIO;
+	} else
+		ret = 0;
+
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 #define HARD_RESET(state) do {  if (cfg->reset) {  if (cfg->sleep) cfg->sleep(fe, 0); msleep(10);  cfg->reset(fe, 1); msleep(10);  cfg->reset(fe, 0); msleep(10);  }  } while (0)
@@ -2440,6 +2484,7 @@ struct dvb_frontend *dib0090_register(st
 	st->config = config;
 	st->i2c = i2c;
 	st->fe = fe;
+	mutex_init(&st->i2c_buffer_lock);
 	fe->tuner_priv = st;
 
 	if (config->wbd == NULL)
@@ -2471,6 +2516,7 @@ struct dvb_frontend *dib0090_fw_register
 	st->config = config;
 	st->i2c = i2c;
 	st->fe = fe;
+	mutex_init(&st->i2c_buffer_lock);
 	fe->tuner_priv = st;
 
 	if (dib0090_fw_reset_digital(fe, st->config) != 0)
--- a/drivers/media/dvb/frontends/dib7000m.c
+++ b/drivers/media/dvb/frontends/dib7000m.c
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 #include "dvb_frontend.h"
 
@@ -55,6 +56,7 @@ struct dib7000m_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[4];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 enum dib7000m_power_mode {
@@ -69,6 +71,13 @@ enum dib7000m_power_mode {
 
 static u16 dib7000m_read_word(struct dib7000m_state *state, u16 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = (reg >> 8) | 0x80;
 	state->i2c_write_buffer[1] = reg & 0xff;
 
@@ -85,11 +94,21 @@ static u16 dib7000m_read_word(struct dib
 	if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
 		dprintk("i2c read error on %d",reg);
 
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	mutex_unlock(&state->i2c_buffer_lock);
+
+	return ret;
 }
 
 static int dib7000m_write_word(struct dib7000m_state *state, u16 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 	state->i2c_write_buffer[1] = reg & 0xff;
 	state->i2c_write_buffer[2] = (val >> 8) & 0xff;
@@ -101,7 +120,10 @@ static int dib7000m_write_word(struct di
 	state->msg[0].buf = state->i2c_write_buffer;
 	state->msg[0].len = 4;
 
-	return i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
+	ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
+			-EREMOTEIO : 0);
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 static void dib7000m_write_tab(struct dib7000m_state *state, u16 *buf)
 {
@@ -1385,6 +1407,7 @@ struct dvb_frontend * dib7000m_attach(st
 	demod                   = &st->demod;
 	demod->demodulator_priv = st;
 	memcpy(&st->demod.ops, &dib7000m_ops, sizeof(struct dvb_frontend_ops));
+	mutex_init(&st->i2c_buffer_lock);
 
 	st->timf_default = cfg->bw->timf;
 
--- a/drivers/media/dvb/frontends/dib7000p.c
+++ b/drivers/media/dvb/frontends/dib7000p.c
@@ -10,6 +10,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 #include "dvb_math.h"
 #include "dvb_frontend.h"
@@ -68,6 +69,7 @@ struct dib7000p_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[4];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 enum dib7000p_power_mode {
@@ -81,6 +83,13 @@ static int dib7090_set_diversity_in(stru
 
 static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = reg >> 8;
 	state->i2c_write_buffer[1] = reg & 0xff;
 
@@ -97,11 +106,20 @@ static u16 dib7000p_read_word(struct dib
 	if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
 		dprintk("i2c read error on %d", reg);
 
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 	state->i2c_write_buffer[1] = reg & 0xff;
 	state->i2c_write_buffer[2] = (val >> 8) & 0xff;
@@ -113,7 +131,10 @@ static int dib7000p_write_word(struct di
 	state->msg[0].buf = state->i2c_write_buffer;
 	state->msg[0].len = 4;
 
-	return i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
+	ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
+			-EREMOTEIO : 0);
+	mutex_unlock(&state->i2c_buffer_lock);
+	return ret;
 }
 
 static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf)
@@ -1646,6 +1667,7 @@ int dib7000p_i2c_enumeration(struct i2c_
 		return -ENOMEM;
 
 	dpst->i2c_adap = i2c;
+	mutex_init(&dpst->i2c_buffer_lock);
 
 	for (k = no_of_demods - 1; k >= 0; k--) {
 		dpst->cfg = cfg[k];
@@ -2324,6 +2346,7 @@ struct dvb_frontend *dib7000p_attach(str
 	demod = &st->demod;
 	demod->demodulator_priv = st;
 	memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
+	mutex_init(&st->i2c_buffer_lock);
 
 	dib7000p_write_word(st, 1287, 0x0003);	/* sram lead in, rdy */
 
@@ -2333,8 +2356,9 @@ struct dvb_frontend *dib7000p_attach(str
 	st->version = dib7000p_read_word(st, 897);
 
 	/* FIXME: make sure the dev.parent field is initialized, or else
-		request_firmware() will hit an OOPS (this should be moved somewhere
-		more common) */
+	   request_firmware() will hit an OOPS (this should be moved somewhere
+	   more common) */
+	st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
 
 	dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
 
--- a/drivers/media/dvb/frontends/dib8000.c
+++ b/drivers/media/dvb/frontends/dib8000.c
@@ -10,6 +10,8 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
+
 #include "dvb_math.h"
 
 #include "dvb_frontend.h"
@@ -37,6 +39,7 @@ struct i2c_device {
 	u8 addr;
 	u8 *i2c_write_buffer;
 	u8 *i2c_read_buffer;
+	struct mutex *i2c_buffer_lock;
 };
 
 struct dib8000_state {
@@ -77,6 +80,7 @@ struct dib8000_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[4];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 enum dib8000_power_mode {
@@ -86,24 +90,39 @@ enum dib8000_power_mode {
 
 static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
 {
+	u16 ret;
 	struct i2c_msg msg[2] = {
-		{.addr = i2c->addr >> 1, .flags = 0,
-			.buf = i2c->i2c_write_buffer, .len = 2},
-		{.addr = i2c->addr >> 1, .flags = I2C_M_RD,
-			.buf = i2c->i2c_read_buffer, .len = 2},
+		{.addr = i2c->addr >> 1, .flags = 0, .len = 2},
+		{.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
 	};
 
+	if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
+	msg[0].buf    = i2c->i2c_write_buffer;
 	msg[0].buf[0] = reg >> 8;
 	msg[0].buf[1] = reg & 0xff;
+	msg[1].buf    = i2c->i2c_read_buffer;
 
 	if (i2c_transfer(i2c->adap, msg, 2) != 2)
 		dprintk("i2c read error on %d", reg);
 
-	return (msg[1].buf[0] << 8) | msg[1].buf[1];
+	ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
+	mutex_unlock(i2c->i2c_buffer_lock);
+	return ret;
 }
 
 static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	state->i2c_write_buffer[0] = reg >> 8;
 	state->i2c_write_buffer[1] = reg & 0xff;
 
@@ -120,7 +139,10 @@ static u16 dib8000_read_word(struct dib8
 	if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
 		dprintk("i2c read error on %d", reg);
 
-	return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
+	mutex_unlock(&state->i2c_buffer_lock);
+
+	return ret;
 }
 
 static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
@@ -135,22 +157,35 @@ static u32 dib8000_read32(struct dib8000
 
 static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
 {
-	struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0,
-		.buf = i2c->i2c_write_buffer, .len = 4};
+	struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
 	int ret = 0;
 
+	if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
+	msg.buf    = i2c->i2c_write_buffer;
 	msg.buf[0] = (reg >> 8) & 0xff;
 	msg.buf[1] = reg & 0xff;
 	msg.buf[2] = (val >> 8) & 0xff;
 	msg.buf[3] = val & 0xff;
 
 	ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
+	mutex_unlock(i2c->i2c_buffer_lock);
 
 	return ret;
 }
 
 static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 	state->i2c_write_buffer[1] = reg & 0xff;
 	state->i2c_write_buffer[2] = (val >> 8) & 0xff;
@@ -162,7 +197,11 @@ static int dib8000_write_word(struct dib
 	state->msg[0].buf = state->i2c_write_buffer;
 	state->msg[0].len = 4;
 
-	return i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
+	ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
+			-EREMOTEIO : 0);
+	mutex_unlock(&state->i2c_buffer_lock);
+
+	return ret;
 }
 
 static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
@@ -2434,8 +2473,15 @@ int dib8000_i2c_enumeration(struct i2c_a
 	if (!client.i2c_read_buffer) {
 		dprintk("%s: not enough memory", __func__);
 		ret = -ENOMEM;
-		goto error_memory;
+		goto error_memory_read;
+	}
+	client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
+	if (!client.i2c_buffer_lock) {
+		dprintk("%s: not enough memory", __func__);
+		ret = -ENOMEM;
+		goto error_memory_lock;
 	}
+	mutex_init(client.i2c_buffer_lock);
 
 	for (k = no_of_demods - 1; k >= 0; k--) {
 		/* designated i2c address */
@@ -2476,8 +2522,10 @@ int dib8000_i2c_enumeration(struct i2c_a
 	}
 
 error:
+	kfree(client.i2c_buffer_lock);
+error_memory_lock:
 	kfree(client.i2c_read_buffer);
-error_memory:
+error_memory_read:
 	kfree(client.i2c_write_buffer);
 
 	return ret;
@@ -2581,6 +2629,8 @@ struct dvb_frontend *dib8000_attach(stru
 	state->i2c.addr = i2c_addr;
 	state->i2c.i2c_write_buffer = state->i2c_write_buffer;
 	state->i2c.i2c_read_buffer = state->i2c_read_buffer;
+	mutex_init(&state->i2c_buffer_lock);
+	state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
 	state->gpio_val = cfg->gpio_val;
 	state->gpio_dir = cfg->gpio_dir;
 
--- a/drivers/media/dvb/frontends/dib9000.c
+++ b/drivers/media/dvb/frontends/dib9000.c
@@ -38,6 +38,15 @@ struct i2c_device {
 #define DibInitLock(lock) mutex_init(lock)
 #define DibFreeLock(lock)
 
+struct dib9000_pid_ctrl {
+#define DIB9000_PID_FILTER_CTRL 0
+#define DIB9000_PID_FILTER      1
+	u8 cmd;
+	u8 id;
+	u16 pid;
+	u8 onoff;
+};
+
 struct dib9000_state {
 	struct i2c_device i2c;
 
@@ -99,6 +108,10 @@ struct dib9000_state {
 	struct i2c_msg msg[2];
 	u8 i2c_write_buffer[255];
 	u8 i2c_read_buffer[255];
+	DIB_LOCK demod_lock;
+	u8 get_frontend_internal;
+	struct dib9000_pid_ctrl pid_ctrl[10];
+	s8 pid_ctrl_index; /* -1: empty list; -2: do not use the list */
 };
 
 static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1743,19 +1756,56 @@ EXPORT_SYMBOL(dib9000_set_gpio);
 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
 {
 	struct dib9000_state *state = fe->demodulator_priv;
-	u16 val = dib9000_read_word(state, 294 + 1) & 0xffef;
+	u16 val;
+	int ret;
+
+	if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) {
+		/* postpone the pid filtering cmd */
+		dprintk("pid filter cmd postpone");
+		state->pid_ctrl_index++;
+		state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL;
+		state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
+		return 0;
+	}
+
+	DibAcquireLock(&state->demod_lock);
+
+	val = dib9000_read_word(state, 294 + 1) & 0xffef;
 	val |= (onoff & 0x1) << 4;
 
 	dprintk("PID filter enabled %d", onoff);
-	return dib9000_write_word(state, 294 + 1, val);
+	ret = dib9000_write_word(state, 294 + 1, val);
+	DibReleaseLock(&state->demod_lock);
+	return ret;
+
 }
 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
 
 int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
 {
 	struct dib9000_state *state = fe->demodulator_priv;
+	int ret;
+
+	if (state->pid_ctrl_index != -2) {
+		/* postpone the pid filtering cmd */
+		dprintk("pid filter postpone");
+		if (state->pid_ctrl_index < 9) {
+			state->pid_ctrl_index++;
+			state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER;
+			state->pid_ctrl[state->pid_ctrl_index].id = id;
+			state->pid_ctrl[state->pid_ctrl_index].pid = pid;
+			state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
+		} else
+			dprintk("can not add any more pid ctrl cmd");
+		return 0;
+	}
+
+	DibAcquireLock(&state->demod_lock);
 	dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
-	return dib9000_write_word(state, 300 + 1 + id, onoff ? (1 << 13) | pid : 0);
+	ret = dib9000_write_word(state, 300 + 1 + id,
+			onoff ? (1 << 13) | pid : 0);
+	DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 EXPORT_SYMBOL(dib9000_fw_pid_filter);
 
@@ -1778,6 +1828,7 @@ static void dib9000_release(struct dvb_f
 	DibFreeLock(&state->platform.risc.mbx_lock);
 	DibFreeLock(&state->platform.risc.mem_lock);
 	DibFreeLock(&state->platform.risc.mem_mbx_lock);
+	DibFreeLock(&state->demod_lock);
 	dibx000_exit_i2c_master(&st->i2c_master);
 
 	i2c_del_adapter(&st->tuner_adap);
@@ -1795,14 +1846,19 @@ static int dib9000_sleep(struct dvb_fron
 {
 	struct dib9000_state *state = fe->demodulator_priv;
 	u8 index_frontend;
-	int ret;
+	int ret = 0;
 
+	DibAcquireLock(&state->demod_lock);
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
 		ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
 		if (ret < 0)
-			return ret;
+			goto error;
 	}
-	return dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
+	ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
+
+error:
+	DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 
 static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
@@ -1816,7 +1872,10 @@ static int dib9000_get_frontend(struct d
 	struct dib9000_state *state = fe->demodulator_priv;
 	u8 index_frontend, sub_index_frontend;
 	fe_status_t stat;
-	int ret;
+	int ret = 0;
+
+	if (state->get_frontend_internal == 0)
+		DibAcquireLock(&state->demod_lock);
 
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
 		state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
@@ -1846,14 +1905,15 @@ static int dib9000_get_frontend(struct d
 					    state->fe[index_frontend]->dtv_property_cache.rolloff;
 				}
 			}
-			return 0;
+			ret = 0;
+			goto return_value;
 		}
 	}
 
 	/* get the channel from master chip */
 	ret = dib9000_fw_get_channel(fe, fep);
 	if (ret != 0)
-		return ret;
+		goto return_value;
 
 	/* synchronize the cache with the other frontends */
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
@@ -1866,8 +1926,12 @@ static int dib9000_get_frontend(struct d
 		state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP;
 		state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff;
 	}
+	ret = 0;
 
-	return 0;
+return_value:
+	if (state->get_frontend_internal == 0)
+		DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 
 static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
@@ -1912,6 +1976,10 @@ static int dib9000_set_frontend(struct d
 		dprintk("dib9000: must specify bandwidth ");
 		return 0;
 	}
+
+	state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */
+	DibAcquireLock(&state->demod_lock);
+
 	fe->dtv_property_cache.delivery_system = SYS_DVBT;
 
 	/* set the master status */
@@ -1974,13 +2042,18 @@ static int dib9000_set_frontend(struct d
 	/* check the tune result */
 	if (exit_condition == 1) {	/* tune failed */
 		dprintk("tune failed");
+		DibReleaseLock(&state->demod_lock);
+		/* tune failed; put all the pid filtering cmd to junk */
+		state->pid_ctrl_index = -1;
 		return 0;
 	}
 
 	dprintk("tune success on frontend%i", index_frontend_success);
 
 	/* synchronize all the channel cache */
+	state->get_frontend_internal = 1;
 	dib9000_get_frontend(state->fe[0], fep);
+	state->get_frontend_internal = 0;
 
 	/* retune the other frontends with the found channel */
 	channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
@@ -2025,6 +2098,28 @@ static int dib9000_set_frontend(struct d
 	/* turn off the diversity for the last frontend */
 	dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
 
+	DibReleaseLock(&state->demod_lock);
+	if (state->pid_ctrl_index >= 0) {
+		u8 index_pid_filter_cmd;
+		u8 pid_ctrl_index = state->pid_ctrl_index;
+
+		state->pid_ctrl_index = -2;
+		for (index_pid_filter_cmd = 0;
+				index_pid_filter_cmd <= pid_ctrl_index;
+				index_pid_filter_cmd++) {
+			if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL)
+				dib9000_fw_pid_filter_ctrl(state->fe[0],
+						state->pid_ctrl[index_pid_filter_cmd].onoff);
+			else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER)
+				dib9000_fw_pid_filter(state->fe[0],
+						state->pid_ctrl[index_pid_filter_cmd].id,
+						state->pid_ctrl[index_pid_filter_cmd].pid,
+						state->pid_ctrl[index_pid_filter_cmd].onoff);
+		}
+	}
+	/* do not postpone any more the pid filtering */
+	state->pid_ctrl_index = -2;
+
 	return 0;
 }
 
@@ -2041,6 +2136,7 @@ static int dib9000_read_status(struct dv
 	u8 index_frontend;
 	u16 lock = 0, lock_slave = 0;
 
+	DibAcquireLock(&state->demod_lock);
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
 		lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
 
@@ -2059,6 +2155,8 @@ static int dib9000_read_status(struct dv
 	if ((lock & 0x0008) || (lock_slave & 0x0008))
 		*stat |= FE_HAS_LOCK;
 
+	DibReleaseLock(&state->demod_lock);
+
 	return 0;
 }
 
@@ -2066,10 +2164,14 @@ static int dib9000_read_ber(struct dvb_f
 {
 	struct dib9000_state *state = fe->demodulator_priv;
 	u16 *c;
+	int ret = 0;
 
+	DibAcquireLock(&state->demod_lock);
 	DibAcquireLock(&state->platform.risc.mem_mbx_lock);
-	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
-		return -EIO;
+	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
+		ret = -EIO;
+		goto error;
+	}
 	dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
 			state->i2c_read_buffer, 16 * 2);
 	DibReleaseLock(&state->platform.risc.mem_mbx_lock);
@@ -2077,7 +2179,10 @@ static int dib9000_read_ber(struct dvb_f
 	c = (u16 *)state->i2c_read_buffer;
 
 	*ber = c[10] << 16 | c[11];
-	return 0;
+
+error:
+	DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 
 static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
@@ -2086,7 +2191,9 @@ static int dib9000_read_signal_strength(
 	u8 index_frontend;
 	u16 *c = (u16 *)state->i2c_read_buffer;
 	u16 val;
+	int ret = 0;
 
+	DibAcquireLock(&state->demod_lock);
 	*strength = 0;
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
 		state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
@@ -2097,8 +2204,10 @@ static int dib9000_read_signal_strength(
 	}
 
 	DibAcquireLock(&state->platform.risc.mem_mbx_lock);
-	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
-		return -EIO;
+	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
+		ret = -EIO;
+		goto error;
+	}
 	dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
 	DibReleaseLock(&state->platform.risc.mem_mbx_lock);
 
@@ -2107,7 +2216,10 @@ static int dib9000_read_signal_strength(
 		*strength = 65535;
 	else
 		*strength += val;
-	return 0;
+
+error:
+	DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 
 static u32 dib9000_get_snr(struct dvb_frontend *fe)
@@ -2151,6 +2263,7 @@ static int dib9000_read_snr(struct dvb_f
 	u8 index_frontend;
 	u32 snr_master;
 
+	DibAcquireLock(&state->demod_lock);
 	snr_master = dib9000_get_snr(fe);
 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
 		snr_master += dib9000_get_snr(state->fe[index_frontend]);
@@ -2161,6 +2274,8 @@ static int dib9000_read_snr(struct dvb_f
 	} else
 		*snr = 0;
 
+	DibReleaseLock(&state->demod_lock);
+
 	return 0;
 }
 
@@ -2168,15 +2283,22 @@ static int dib9000_read_unc_blocks(struc
 {
 	struct dib9000_state *state = fe->demodulator_priv;
 	u16 *c = (u16 *)state->i2c_read_buffer;
+	int ret = 0;
 
+	DibAcquireLock(&state->demod_lock);
 	DibAcquireLock(&state->platform.risc.mem_mbx_lock);
-	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
-		return -EIO;
+	if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
+		ret = -EIO;
+		goto error;
+	}
 	dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
 	DibReleaseLock(&state->platform.risc.mem_mbx_lock);
 
 	*unc = c[12];
-	return 0;
+
+error:
+	DibReleaseLock(&state->demod_lock);
+	return ret;
 }
 
 int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
@@ -2322,6 +2444,10 @@ struct dvb_frontend *dib9000_attach(stru
 	DibInitLock(&st->platform.risc.mbx_lock);
 	DibInitLock(&st->platform.risc.mem_lock);
 	DibInitLock(&st->platform.risc.mem_mbx_lock);
+	DibInitLock(&st->demod_lock);
+	st->get_frontend_internal = 0;
+
+	st->pid_ctrl_index = -2;
 
 	st->fe[0] = fe;
 	fe->demodulator_priv = st;
--- a/drivers/media/dvb/frontends/dibx000_common.c
+++ b/drivers/media/dvb/frontends/dibx000_common.c
@@ -1,4 +1,5 @@
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 #include "dibx000_common.h"
 
@@ -10,6 +11,13 @@ MODULE_PARM_DESC(debug, "turn on debuggi
 
 static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val)
 {
+	int ret;
+
+	if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
 	mst->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 	mst->i2c_write_buffer[1] = reg & 0xff;
 	mst->i2c_write_buffer[2] = (val >> 8) & 0xff;
@@ -21,11 +29,21 @@ static int dibx000_write_word(struct dib
 	mst->msg[0].buf = mst->i2c_write_buffer;
 	mst->msg[0].len = 4;
 
-	return i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0;
+	ret = i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0;
+	mutex_unlock(&mst->i2c_buffer_lock);
+
+	return ret;
 }
 
 static u16 dibx000_read_word(struct dibx000_i2c_master *mst, u16 reg)
 {
+	u16 ret;
+
+	if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return 0;
+	}
+
 	mst->i2c_write_buffer[0] = reg >> 8;
 	mst->i2c_write_buffer[1] = reg & 0xff;
 
@@ -42,7 +60,10 @@ static u16 dibx000_read_word(struct dibx
 	if (i2c_transfer(mst->i2c_adap, mst->msg, 2) != 2)
 		dprintk("i2c read error on %d", reg);
 
-	return (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1];
+	ret = (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1];
+	mutex_unlock(&mst->i2c_buffer_lock);
+
+	return ret;
 }
 
 static int dibx000_is_i2c_done(struct dibx000_i2c_master *mst)
@@ -257,6 +278,7 @@ static int dibx000_i2c_gated_gpio67_xfer
 					struct i2c_msg msg[], int num)
 {
 	struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap);
+	int ret;
 
 	if (num > 32) {
 		dprintk("%s: too much I2C message to be transmitted (%i).\
@@ -264,10 +286,15 @@ static int dibx000_i2c_gated_gpio67_xfer
 		return -ENOMEM;
 	}
 
-	memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num));
-
 	dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_6_7);
 
+	if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+
+	memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num));
+
 	/* open the gate */
 	dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1);
 	mst->msg[0].addr = mst->i2c_addr;
@@ -282,7 +309,11 @@ static int dibx000_i2c_gated_gpio67_xfer
 	mst->msg[num + 1].buf = &mst->i2c_write_buffer[4];
 	mst->msg[num + 1].len = 4;
 
-	return i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? num : -EIO;
+	ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ?
+			num : -EIO);
+
+	mutex_unlock(&mst->i2c_buffer_lock);
+	return ret;
 }
 
 static struct i2c_algorithm dibx000_i2c_gated_gpio67_algo = {
@@ -294,6 +325,7 @@ static int dibx000_i2c_gated_tuner_xfer(
 					struct i2c_msg msg[], int num)
 {
 	struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap);
+	int ret;
 
 	if (num > 32) {
 		dprintk("%s: too much I2C message to be transmitted (%i).\
@@ -301,10 +333,14 @@ static int dibx000_i2c_gated_tuner_xfer(
 		return -ENOMEM;
 	}
 
-	memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num));
-
 	dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER);
 
+	if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+	memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num));
+
 	/* open the gate */
 	dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1);
 	mst->msg[0].addr = mst->i2c_addr;
@@ -319,7 +355,10 @@ static int dibx000_i2c_gated_tuner_xfer(
 	mst->msg[num + 1].buf = &mst->i2c_write_buffer[4];
 	mst->msg[num + 1].len = 4;
 
-	return i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? num : -EIO;
+	ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ?
+			num : -EIO);
+	mutex_unlock(&mst->i2c_buffer_lock);
+	return ret;
 }
 
 static struct i2c_algorithm dibx000_i2c_gated_tuner_algo = {
@@ -390,8 +429,18 @@ static int i2c_adapter_init(struct i2c_a
 int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, u16 device_rev,
 				struct i2c_adapter *i2c_adap, u8 i2c_addr)
 {
-	u8 tx[4];
-	struct i2c_msg m = {.addr = i2c_addr >> 1,.buf = tx,.len = 4 };
+	int ret;
+
+	mutex_init(&mst->i2c_buffer_lock);
+	if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) {
+		dprintk("could not acquire lock");
+		return -EINVAL;
+	}
+	memset(mst->msg, 0, sizeof(struct i2c_msg));
+	mst->msg[0].addr = i2c_addr >> 1;
+	mst->msg[0].flags = 0;
+	mst->msg[0].buf = mst->i2c_write_buffer;
+	mst->msg[0].len = 4;
 
 	mst->device_rev = device_rev;
 	mst->i2c_adap = i2c_adap;
@@ -431,9 +480,12 @@ int dibx000_init_i2c_master(struct dibx0
 				"DiBX000: could not initialize the master i2c_adapter\n");
 
 	/* initialize the i2c-master by closing the gate */
-	dibx000_i2c_gate_ctrl(mst, tx, 0, 0);
+	dibx000_i2c_gate_ctrl(mst, mst->i2c_write_buffer, 0, 0);
+
+	ret = (i2c_transfer(i2c_adap, mst->msg, 1) == 1);
+	mutex_unlock(&mst->i2c_buffer_lock);
 
-	return i2c_transfer(i2c_adap, &m, 1) == 1;
+	return ret;
 }
 
 EXPORT_SYMBOL(dibx000_init_i2c_master);
--- a/drivers/media/dvb/frontends/dibx000_common.h
+++ b/drivers/media/dvb/frontends/dibx000_common.h
@@ -33,6 +33,7 @@ struct dibx000_i2c_master {
 	struct i2c_msg msg[34];
 	u8 i2c_write_buffer[8];
 	u8 i2c_read_buffer[2];
+	struct mutex i2c_buffer_lock;
 };
 
 extern int dibx000_init_i2c_master(struct dibx000_i2c_master *mst,



  parent reply	other threads:[~2011-11-09 21:27 UTC|newest]

Thread overview: 271+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-09 21:28 [000/262] 3.0.9-stable review Greg KH
2011-11-09 21:25 ` [001/262] CIFS: Fix incorrect max RFC1002 write size value Greg KH
2011-11-09 21:25 ` [002/262] CIFS: Fix DFS handling in cifs_get_file_info Greg KH
2011-11-09 21:25 ` [003/262] cris: fix a build error in drivers/tty/serial/crisv10.c Greg KH
2011-11-09 21:25 ` [004/262] TTY: drop driver reference in tty_open fail path Greg KH
2011-11-09 21:25 ` [005/262] TTY: make tty_add_file non-failing Greg KH
2011-11-09 21:25 ` [006/262] TTY: pty, release tty in all ptmx_open fail paths Greg KH
2011-11-09 21:25 ` [007/262] USB: for usb_autopm_get_interface_async -EINPROGRESS is not an error Greg KH
2011-11-09 21:25 ` [008/262] staging: serqt_usb2: remove ssu100 from supported devices Greg KH
2011-11-09 21:25 ` [009/262] staging: quatech_usb2: Potential lost wakeup scenario in TIOCMIWAIT Greg KH
2011-11-09 21:25 ` [010/262] Staging: hv: Add support for >2 TB LUN in storage driver Greg KH
2011-11-09 21:25 ` [011/262] USB: qcserial: Add support for Sierra Wireless MC8355/Gobi 3000 Greg KH
2011-11-09 21:25 ` [012/262] USB: qcserial: add device ID for "HP un2430 Mobile Broadband Module" Greg KH
2011-11-09 21:25 ` [013/262] serial: pxa: work around for errata #20 Greg KH
2011-11-09 21:25 ` [014/262] serial-core: power up uart port early before we do set_termios when resuming Greg KH
2011-11-09 21:25 ` [015/262] EHCI : introduce a common ehci_setup Greg KH
2011-11-09 21:25 ` [016/262] USB: fix ehci alignment error Greg KH
2011-11-09 21:25 ` [017/262] EHCI: workaround for MosChip controller bug Greg KH
2011-11-09 21:25 ` [018/262] xhci-mem.c: Check for ring->first_seg != NULL Greg KH
2011-11-09 21:25 ` [019/262] xHCI: AMD isoc link TRB chain bit quirk Greg KH
2011-11-09 21:25 ` [020/262] drm/i915: Wrap DP EDID fetch functions to enable eDP panel power Greg KH
2011-11-09 21:25 ` [021/262] drm/i915/panel: Always record the backlight level again (but cleverly) Greg KH
2011-11-09 21:25 ` [022/262] drm/radeon/kms: bail early in dvi_detect for digital only connectors Greg KH
2011-11-09 21:25 ` [023/262] drm/radeon/kms: handle !force case in connector detect more gracefully Greg KH
2011-11-09 21:25 ` [024/262] drm/radeon/kms: Fix I2C mask definitions Greg KH
2011-11-09 21:25 ` [025/262] mmc: core: Fix hangs related to insert/remove of cards Greg KH
2011-11-09 21:25 ` [026/262] mmc: core: ext_csd.raw_* used in comparison but never set Greg KH
2011-11-09 21:25 ` [027/262] PCI quirk: mmc: Always check for lower base frequency quirk for Ricoh 1180:e823 Greg KH
2011-11-09 21:25 ` [028/262] [SCSI] megaraid_sas: Fix instance access in megasas_reset_timer Greg KH
2011-11-09 21:25 ` [029/262] [SCSI] ipr: Always initiate hard reset in kdump kernel Greg KH
2011-11-09 21:25 ` [030/262] [SCSI] libsas: set sas_address and device type of rphy Greg KH
2011-11-09 21:25 ` [031/262] [SCSI] isci: fix support for large smp requests Greg KH
2011-11-09 21:25 ` [032/262] [SCSI] isci: fix missed unlock in apc_agent_timeout() Greg KH
2011-11-09 21:25 ` [033/262] ALSA: hda - Remove bad code for IDT 92HD83 family patch Greg KH
2011-11-09 21:25 ` [034/262] ALSA: HDA: Add new revision for ALC662 Greg KH
2011-11-09 21:25 ` [035/262] target: Fix REPORT TARGET PORT GROUPS handling with small allocation length Greg KH
2011-11-09 21:25 ` [036/262] x86: uv2: Workaround for UV2 Hub bug (system global address format) Greg KH
2011-11-09 21:25 ` [037/262] x86: Fix compilation bug in kprobes twobyte_is_boostable Greg KH
2011-11-09 21:26 ` [038/262] epoll: fix spurious lockdep warnings Greg KH
2011-11-09 21:26 ` [039/262] leds: save the delay values after a successful call to blink_set() Greg KH
2011-11-09 21:26 ` [040/262] leds: turn the blink_timer off before starting to blink Greg KH
2011-11-09 21:26 ` [041/262] usbmon vs. tcpdump: fix dropped packet count Greg KH
2011-11-09 21:26 ` [042/262] USB: storage: Use normalized sense when emulating autosense Greg KH
2011-11-09 21:26 ` [043/262] USB: Fix runtime wakeup on OHCI Greg KH
2011-11-09 21:26 ` [044/262] USB: g_printer: fix bug in unregistration Greg KH
2011-11-09 21:26 ` [045/262] usb/core/devio.c: Check for printer class specific request Greg KH
2011-11-09 21:26 ` [046/262] USB: pid_ns: ensure pid is not freed during kill_pid_info_as_uid Greg KH
2011-11-09 21:26 ` [047/262] usb: cdc-acm: Owen SI-30 support Greg KH
2011-11-09 21:26 ` [048/262] USB: add RESET_RESUME for webcams shown to be quirky Greg KH
2011-11-09 21:26 ` [049/262] USB: add quirk for Logitech C300 web cam Greg KH
2011-11-09 21:26 ` [050/262] USB: pl2303: add id for SMART device Greg KH
2011-11-09 21:26 ` [051/262] USB: ftdi_sio: add PID for Sony Ericsson Urban Greg KH
2011-11-09 21:26 ` [052/262] USB: ftdi_sio: Support TI/Luminary Micro Stellaris BD-ICDI Board Greg KH
2011-11-09 21:26 ` [053/262] USB: option: convert interface blacklisting to bitfields Greg KH
2011-11-09 21:26 ` [054/262] USB: option: convert Huawei K3765, K4505, K4605 reservered interface to blacklist Greg KH
2011-11-09 21:26 ` [055/262] USB: option: add ZTE product 0x0037 to sendsetup blacklist Greg KH
2011-11-09 21:26 ` [056/262] USB: option: add various ZTE device network interfaces to the blacklist Greg KH
2011-11-09 21:26 ` [057/262] MAINTANERS: update Qualcomm Atheros addresses Greg KH
2011-11-09 21:26 ` [058/262] ath9k_hw: Fix descriptor status of TxOpExceeded Greg KH
2011-11-09 21:26 ` [059/262] ath9k_hw: Fix magnitude/phase coeff correction Greg KH
2011-11-09 21:26 ` [060/262] ath9k_htc: add AVM FRITZ!WLAN 11N v2 support Greg KH
2011-11-09 21:26 ` [061/262] ath9k_hw: Fix number of GPIO pins for AR9287/9300 Greg KH
2011-11-09 21:26 ` [062/262] ath9k: disable unnecessary PHY error reporting Greg KH
2011-11-09 21:26 ` [063/262] HID: ACRUX - fix enabling force feedback support Greg KH
2011-11-09 21:26 ` [064/262] QE/FHCI: fixed the CONTROL bug Greg KH
2011-11-09 21:26 ` [065/262] Update email address for stable patch submission Greg KH
2011-11-09 21:26 ` [066/262] xen-pcifront: Update warning comment to use e820_host option Greg KH
2011-11-09 21:26 ` [067/262] xen-swiotlb: Fix wrong panic Greg KH
2011-11-09 21:26 ` [068/262] kobj_uevent: Ignore if some listeners cannot handle message Greg KH
2011-11-09 21:26 ` [069/262] caif: Fix BUG() with network namespaces Greg KH
2011-11-09 21:26 ` [070/262] platform: samsung_laptop: add dmi information for Samsung R700 laptops Greg KH
2011-11-09 21:26 ` [071/262] Platform: samsung_laptop: add support for X520 machines Greg KH
2011-11-09 21:26 ` [072/262] Platform: samsung_laptop: samsung backlight for R528/R728 Greg KH
2011-11-09 21:26 ` [073/262] platform: samsung_laptop: fix samsung brightness min/max calculations Greg KH
2011-11-09 21:26 ` [074/262] Platform: Fix error path in samsung-laptop init Greg KH
2011-11-09 21:26 ` [075/262] kmod: prevent kmod_loop_msg overflow in __request_module() Greg KH
2011-11-09 21:26 ` [076/262] Revert "NFS: Ensure that writeback_single_inode() calls write_inode() when syncing" Greg KH
2011-11-09 21:26 ` [077/262] nfs: dont redirty inode when ncommit == 0 in nfs_commit_unstable_pages Greg KH
2011-11-09 21:26 ` [078/262] ata_piix: make DVD Drive recognisable on systems with Intel Sandybridge chipsets(v2) Greg KH
2011-11-09 21:26 ` [079/262] rtnetlink: Add missing manual netlink notification in dev_change_net_namespaces Greg KH
2011-11-09 21:26 ` [080/262] dp83640: free packet queues on remove Greg KH
2011-11-09 21:26 ` [081/262] mac80211: fix offchannel TX cookie matching Greg KH
2011-11-09 21:26 ` [082/262] net: hold sock reference while processing tx timestamps Greg KH
2011-11-09 21:26 ` [083/262] wl12xx: fix forced passive scans Greg KH
2011-11-09 21:26 ` [084/262] time: Change jiffies_to_clock_t() argument type to unsigned long Greg KH
2011-11-09 21:26 ` [085/262] apic, i386/bigsmp: Fix false warnings regarding logical APIC ID mismatches Greg KH
2011-11-09 21:26 ` [086/262] md/raid5: fix bug that could result in reads from a failed device Greg KH
2011-11-09 21:26 ` [087/262] perf probe: Fix to show correct error string Greg KH
2011-11-09 21:26 ` [088/262] tracing: Fix returning of duplicate data after EOF in trace_pipe_raw Greg KH
2011-11-09 21:26 ` [089/262] genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier Greg KH
2011-11-09 21:26 ` [090/262] nfs: dont try to migrate pages with active requests Greg KH
2011-11-09 21:26 ` [091/262] nfsd4: Remove check for a 32-bit cookie in nfsd4_readdir() Greg KH
2011-11-09 21:26 ` [092/262] nfsd4: stop using nfserr_resource for transitory errors Greg KH
2011-11-09 21:26 ` [093/262] nfsd4: fix seqid_mutating_error Greg KH
2011-11-09 21:26 ` [094/262] nfsd4: permit read opens of executable-only files Greg KH
2011-11-09 21:26 ` [095/262] nfsd4: fix open downgrade, again Greg KH
2011-11-09 21:26 ` [096/262] nfsd4: ignore WANT bits in open downgrade Greg KH
2011-11-09 21:26 ` [097/262] hppfs: missing include Greg KH
2011-11-09 21:27 ` [098/262] vfs: add "device" tag to /proc/self/mountstats Greg KH
2011-11-09 21:27 ` [099/262] io-mapping: ensure io_mapping_map_atomic _is_ atomic Greg KH
2011-11-09 21:27 ` [100/262] ASoC: wm8940: Properly set codec->dapm.bias_level Greg KH
2011-11-09 21:27 ` [101/262] ASoC: wm8741: Fix setting interface format for DSP modes Greg KH
2011-11-09 21:27 ` [102/262] ASoC: ak4642: fixup cache register table Greg KH
2011-11-09 21:27 ` [103/262] ASoC: ak4535: " Greg KH
2011-11-09 21:27 ` [104/262] ASoC: wm8994: Use SND_SOC_DAPM_AIF_OUT for AIF3 Capture Greg KH
2011-11-09 21:27 ` [105/262] ASoC: Remove direct register cache accesses from WM8962 driver Greg KH
2011-11-09 21:27 ` [106/262] ASoC: Fix a bug in WM8962 DSP_A and DSP_B settings Greg KH
2011-11-09 21:27 ` [107/262] KVM: s390: check cpu_id prior to using it Greg KH
2011-11-09 21:27 ` [108/262] [S390] user per registers vs. ptrace single stepping Greg KH
2011-11-09 21:27 ` [109/262] [S390] memory leak with RCU_TABLE_FREE Greg KH
2011-11-09 21:27 ` [110/262] [S390] ccwgroup: move attributes to attribute group Greg KH
2011-11-09 21:27 ` [111/262] WMI: properly cleanup devices to avoid crashes Greg KH
2011-11-09 21:27 ` [112/262] iommu/amd: Fix wrong shift direction Greg KH
2011-11-09 21:27 ` [113/262] carminefb: Fix module parameters permissions Greg KH
2011-11-09 21:27 ` [114/262] fb: avoid possible deadlock caused by fb_set_suspend Greg KH
2011-11-09 21:27 ` [115/262] fb: sh-mobile: Fix deadlock risk between lock_fb_info() and console_lock() Greg KH
2011-11-09 21:27 ` [116/262] viafb: use display information in info not in var for panning Greg KH
2011-11-09 21:27 ` [117/262] viafb: improve pitch handling Greg KH
2011-11-09 21:27 ` [118/262] [media] uvcvideo: Set alternate setting 0 on resume if the bus has been reset Greg KH
2011-11-09 21:27 ` Greg KH [this message]
2011-11-09 21:27 ` [120/262] [media] dib0700: protect the dib0700 buffer access Greg KH
2011-11-09 21:27 ` [121/262] [media] tuner_xc2028: Allow selection of the frequency adjustment code for XC3028 Greg KH
2011-11-09 21:27 ` [122/262] /proc/self/numa_maps: restore "huge" tag for hugetlb vmas Greg KH
2011-11-09 21:27 ` [123/262] plat-mxc: iomux-v3.h: implicitly enable pull-up/down when thats desired Greg KH
2011-11-09 21:27 ` [124/262] ARM: mach-ux500: unlock I&D l2x0 caches before init Greg KH
2011-11-09 21:27 ` [125/262] mm: avoid null pointer access in vm_struct via /proc/vmallocinfo Greg KH
2011-11-09 21:27 ` [126/262] ALSA: hda - Fix ADC input-amp handling for Cx20549 codec Greg KH
2011-11-09 21:27 ` [127/262] um: fix ubd cow size Greg KH
2011-11-09 21:27 ` [128/262] readlinkat: ensure we return ENOENT for the empty pathname for normal lookups Greg KH
2011-11-09 21:27 ` [129/262] VFS: Fix automount for negative autofs dentries Greg KH
2011-11-09 21:27 ` [130/262] vfs: automount should ignore LOOKUP_FOLLOW Greg KH
2011-11-09 21:27 ` [131/262] VFS: Fix the remaining automounter semantics regressions Greg KH
2011-11-09 21:27 ` [132/262] vfs pathname lookup: Add LOOKUP_AUTOMOUNT flag Greg KH
2011-11-10  8:30   ` Ian Kent
2011-11-10 15:15     ` Greg KH
2011-11-11  3:11       ` Ian Kent
2011-11-09 21:27 ` [133/262] ptrace: dont clear GROUP_STOP_SIGMASK on double-stop Greg KH
2011-11-09 21:27 ` [134/262] jsm: remove buggy write queue Greg KH
2011-11-09 21:27 ` [135/262] bonding: use local function pointer of bond->recv_probe in bond_handle_frame Greg KH
2011-11-09 21:27 ` [136/262] bridge: fix hang on removal of bridge via netlink Greg KH
2011-11-09 21:27 ` [137/262] can bcm: fix tx_setup off-by-one errors Greg KH
2011-11-09 21:27 ` [138/262] ipv4: fix ipsec forward performance regression Greg KH
2011-11-09 21:27 ` [139/262] l2tp: fix a potential skb leak in l2tp_xmit_skb() Greg KH
2011-11-09 21:27 ` [140/262] macvlan/macvtap: Fix unicast between macvtap interfaces in bridge mode Greg KH
2011-11-09 21:27 ` [141/262] netconsole: enable netconsole can make net_device refcnt incorrent Greg KH
2011-11-09 21:27 ` [142/262] tcp: properly handle md5sig_pool references Greg KH
2011-11-09 21:27 ` [143/262] tcp: properly update lost_cnt_hint during shifting Greg KH
2011-11-09 21:27 ` [144/262] tg3: negate USE_PHYLIB flag check Greg KH
2011-11-09 21:27 ` [145/262] ipv6: nullify ipv6_ac_list and ipv6_fl_list when creating new socket Greg KH
2011-11-09 21:27 ` [146/262] make PACKET_STATISTICS getsockopt report consistently between ring and non-ring Greg KH
2011-11-09 21:27 ` [147/262] net: xen-netback: correctly restart Tx after a VM restore/migrate Greg KH
2011-11-09 21:27 ` [148/262] mm: thp: tail page refcounting fix Greg KH
2011-11-09 21:27 ` [149/262] binfmt_elf: fix PIE execution with randomization disabled Greg KH
2011-11-09 21:27 ` [150/262] vfs: show O_CLOEXE bit properly in /proc/<pid>/fdinfo/<fd> files Greg KH
2011-11-09 21:27 ` [151/262] iwlagn: do not use interruptible waits Greg KH
2011-11-09 21:27 ` [152/262] drivers/net/rionet.c: fix ethernet address macros for LE platforms Greg KH
2011-11-09 21:27 ` [153/262] hwspinlock/core: use a mutex to protect the radix tree Greg KH
2011-11-09 21:27 ` [154/262] drivers/power/ds2780_battery.c: create central point for calling w1 interface Greg KH
2011-11-09 21:27 ` [155/262] drivers/power/ds2780_battery.c: add a nolock function to " Greg KH
2011-11-09 21:27 ` [156/262] drivers/power/ds2780_battery.c: fix deadlock upon insertion and removal Greg KH
2011-11-09 21:27 ` [157/262] ext2,ext3,ext4: dont inherit APPEND_FL or IMMUTABLE_FL for new inodes Greg KH
2011-11-09 21:28 ` [158/262] ext4: ext4_rename should dirty dir_bh with the correct directory Greg KH
2011-11-09 21:28 ` [159/262] ext4: ext4_mkdir should dirty dir_block with newly created directory inode Greg KH
2011-11-09 21:28 ` [160/262] ext4: call ext4_handle_dirty_metadata with correct inode in ext4_dx_add_entry Greg KH
2011-11-09 21:28 ` [161/262] ext4: fix race in xattr block allocation path Greg KH
2011-11-09 21:28 ` [162/262] enic: Bug Fix: Fix hardware transmit queue indexing in enic_poll_controller Greg KH
2011-11-09 21:28 ` [163/262] rtl8150: rtl8150_disconnect(...) does not need tasklet_disable(...) Greg KH
2011-11-09 21:28 ` [164/262] USB: EHCI: Fix test mode sequence Greg KH
2011-11-09 21:28 ` [165/262] usb/isp1760: Added missing call to usb_hcd_check_unlink_urb() during unlink Greg KH
2011-11-09 21:28 ` [166/262] USB: Serial: Add device ID for Sierra Wireless MC8305 Greg KH
2011-11-09 21:28 ` [167/262] USB: Serial: Add PID(0xF7C0) to FTDI SIO driver for a zeitcontrol-device Greg KH
2011-11-09 21:28 ` [168/262] usbnet/cdc_ncm: Dont use stack variables for DMA Greg KH
2011-11-09 21:28 ` [169/262] USB: Avoid NULL pointer deref in usb_hcd_alloc_bandwidth Greg KH
2011-11-09 21:28 ` [170/262] ipheth: iPhone 4 Verizon CDMA USB Product ID add Greg KH
2011-11-09 21:28 ` [171/262] USB: xHCI: prevent infinite loop when processing MSE event Greg KH
2011-11-09 21:28 ` [172/262] ASIX: Simplify condition in rx_fixup() Greg KH
2011-11-09 21:28 ` [173/262] ASIX: Use only 11 bits of header for data size Greg KH
2011-11-09 21:28 ` [174/262] Bluetooth: Add MacBookAir4,1 support Greg KH
2011-11-09 21:28 ` [175/262] Bluetooth: Add Toshiba laptops AR30XX device ID Greg KH
2011-11-09 21:28 ` [176/262] Bluetooth: Add Atheros AR3012 one PID/VID supported Greg KH
2011-11-09 21:28 ` [177/262] Bluetooth: add support for 2011 mac mini Greg KH
2011-11-09 21:28 ` [178/262] btusb: add device entry for Broadcom SoftSailing Greg KH
2011-11-09 21:28 ` [179/262] usb_storage: Dont freeze in usb-stor-scan Greg KH
2011-11-09 21:28 ` [180/262] xhci: If no endpoints changed, dont issue BW command Greg KH
2011-11-09 21:28 ` [181/262] xHCI: test and clear RWC bit Greg KH
2011-11-09 21:28 ` [182/262] xHCI: Clear PLC for USB2 root hub ports Greg KH
2011-11-09 21:28 ` [183/262] can bcm: fix incomplete tx_setup fix Greg KH
2011-11-09 21:28 ` [184/262] powerpc: remove superfluous PageTail checks on the pte gup_fast Greg KH
2011-11-09 21:28 ` [185/262] powerpc: get_hugepte() dont put_page() the wrong page Greg KH
2011-11-09 21:28 ` [186/262] powerpc: gup_hugepte() avoid freeing the head page too many times Greg KH
2011-11-09 21:28 ` [187/262] powerpc: gup_hugepte() support THP based tail recounting Greg KH
2011-11-09 21:28 ` [188/262] powerpc: gup_huge_pmd() return 0 if pte changes Greg KH
2011-11-09 21:28 ` [189/262] s390: gup_huge_pmd() support THP tail recounting Greg KH
2011-11-09 21:28 ` [190/262] s390: gup_huge_pmd() return 0 if pte changes Greg KH
2011-11-09 21:28 ` [191/262] thp: share get_huge_page_tail() Greg KH
2011-11-09 21:28 ` [192/262] bridge: leave carrier on for empty bridge Greg KH
2011-11-09 21:28 ` [193/262] net: Unlock sock before calling sk_free() Greg KH
2011-11-09 21:28 ` [194/262] ALSA: ua101: fix crash when unplugging Greg KH
2011-11-09 21:28 ` [195/262] ALSA: hda - Disable power-widget control for IDT 92HD83/93 as default Greg KH
2011-11-09 21:28 ` [196/262] ALSA: hda - Add support for 92HD65 / 92HD66 family of codecs Greg KH
2011-11-09 21:28 ` [197/262] ALSA: hda/realtek - Skip invalid digital out pins Greg KH
2011-11-09 21:28 ` [198/262] drm/radeon: avoid bouncing connector status btw disconnected & unknown Greg KH
2011-11-09 21:28 ` [199/262] drm/radeon/kms: split MSI check into a separate function Greg KH
2011-11-09 21:28 ` [200/262] drm/radeon/kms: Add MSI quirk for HP RS690 Greg KH
2011-11-09 21:28 ` [201/262] drm/radeon: set hpd polarity at init time so hotplug detect works Greg KH
2011-11-09 21:28 ` [202/262] drm/radeon/kms: properly set panel mode for eDP Greg KH
2011-11-09 21:28 ` [203/262] drm/radeon/kms: Add MSI quirk for Dell RS690 Greg KH
2011-11-09 21:28 ` [204/262] drm/radeon/kms: add MSI module parameter Greg KH
2011-11-09 21:28 ` [205/262] drm/radeon/kms: set HPD polarity in hpd_init() Greg KH
2011-11-09 21:28 ` [206/262] kbuild: Fix help text not displayed in choice option Greg KH
2011-11-09 21:28 ` [207/262] PM / Runtime: Automatically retry failed autosuspends Greg KH
2011-11-09 21:28 ` [208/262] USB: Update last_busy time after autosuspend fails Greg KH
2011-11-09 21:28 ` [209/262] cciss: add small delay when using PCI Power Management to reset for kump Greg KH
2011-11-09 21:28 ` [210/262] hwmon: (coretemp) Fix for non-SMP builds Greg KH
2011-11-09 21:28 ` [211/262] hwmon: (w83627ehf) Properly report PECI and AMD-SI sensor types Greg KH
2011-11-09 21:28 ` [212/262] hwmon: (w83627ehf) Fix broken driver init Greg KH
2011-11-09 21:28 ` [213/262] tcm_loop: Add explict read buffer memset for SCF_SCSI_CONTROL_SG_IO_CDB Greg KH
2011-11-09 21:28 ` [214/262] [SCSI] st: fix race in st_scsi_execute_end Greg KH
2011-11-09 21:28 ` [215/262] [SCSI] scsi_dh: check queuedata pointer before proceeding further Greg KH
2011-11-09 21:28 ` [216/262] [SCSI] Make scsi_free_queue() kill pending SCSI commands Greg KH
2011-11-09 21:28 ` [217/262] [SCSI] Fix block queue and elevator memory leak in scsi_alloc_sdev Greg KH
2011-11-09 21:29 ` [218/262] [SCSI] mpt2sas: Fix for system hang when discovery in progress Greg KH
2011-11-09 21:29 ` [219/262] ASoC: wm8711: Fix wrong mask for setting input audio data bit length select Greg KH
2011-11-09 21:29 ` [220/262] ASoC: Leave input audio data bit length settings untouched in wm8711_set_dai_fmt Greg KH
2011-11-09 21:29 ` [221/262] ASoC: WM8904: Set `invert bit for Capture Switch Greg KH
2011-11-09 21:29 ` [222/262] ASoC: Ensure WM8962 PLL registers are reset Greg KH
2011-11-09 21:29 ` [223/262] ASoC: Ensure the WM8962 oscillator and PLLs start up disabled Greg KH
2011-11-09 21:29 ` [224/262] NFS/sunrpc: dont use a credential with extra groups Greg KH
2011-11-09 21:29 ` [225/262] block: make gendisk hold a reference to its queue Greg KH
2011-11-09 21:29 ` [226/262] xen/blkback: Report VBD_WSECT (wr_sect) properly Greg KH
2011-11-09 21:29 ` [227/262] VFS: fix statfs() automounter semantics regression Greg KH
2011-11-09 21:29 ` [228/262] hpsa: add small delay when using PCI Power Management to reset for kump Greg KH
2011-11-09 21:29 ` [229/262] VFS: we need to set LOOKUP_JUMPED on mountpoint crossing Greg KH
2011-11-09 21:29 ` [230/262] powerpc/numa: Remove double of_node_put in hot_add_node_scn_to_nid Greg KH
2011-11-09 21:29 ` [231/262] powerpc: Fix oops when echoing bad values to /sys/devices/system/memory/probe Greg KH
2011-11-09 21:29 ` [232/262] powerpc/pseries: Avoid spurious error during hotplug CPU add Greg KH
2011-11-09 21:29 ` [233/262] powerpc/eeh: Fix /proc/ppc64/eeh creation Greg KH
2011-11-09 21:29 ` [234/262] powerpc: Fix deadlock in icswx code Greg KH
2011-11-09 21:29 ` [235/262] ACPI atomicio: Convert width in bits to bytes in __acpi_ioremap_fast() Greg KH
2011-11-09 21:29 ` [236/262] netlink: validate NLA_MSECS length Greg KH
2011-11-09 21:29 ` [237/262] ath9k_hw: Update AR9485 initvals to fix system hang issue Greg KH
2011-11-09 21:29 ` [238/262] mac80211: fix remain_off_channel regression Greg KH
2011-11-09 21:29 ` [239/262] mac80211: config hw when going back on-channel Greg KH
2011-11-09 21:29 ` [240/262] mac80211: disable powersave for broken APs Greg KH
2011-11-09 21:29 ` [241/262] mtd: mtdchar: add missing initializer on raw write Greg KH
2011-11-09 21:29 ` [242/262] mtd: provide an alias for the redboot module name Greg KH
2011-11-09 21:29 ` [243/262] mtd: pxa3xx_nand: fix nand detection issue Greg KH
2011-11-09 21:29 ` [244/262] mtd: pxa3xx_nand: Fix blank page ECC mismatch Greg KH
2011-11-09 21:29 ` [245/262] ext4: remove i_mutex lock in ext4_evict_inode to fix lockdep complaining Greg KH
2011-11-09 21:29 ` [246/262] net: Align AF-specific flowi structs to long Greg KH
2011-11-09 21:29 ` [247/262] net: Handle different key sizes between address families in flow cache Greg KH
2011-11-09 21:29 ` [248/262] PM / Suspend: Off by one in pm_suspend() Greg KH
2011-11-09 21:29 ` [249/262] crypto: cryptd - Use subsys_initcall to prevent races with aesni Greg KH
2011-11-09 21:29 ` [250/262] dp83640: use proper function to free transmit time stamping packets Greg KH
2011-11-09 21:29 ` [251/262] ath9k_hw: Fix regression of register offset for AR9003 chips Greg KH
2011-11-09 21:29 ` [252/262] mtd: nand_base: always initialise oob_poi before writing OOB data Greg KH
2011-11-09 21:29 ` [253/262] HID: add support for new revision of Apple aluminum keyboard Greg KH
2011-11-09 21:29 ` [254/262] HID: add support for HuiJia USB Gamepad connector Greg KH
2011-11-09 21:29 ` [255/262] HID: add support for MacBookAir4,2 keyboard Greg KH
2011-11-09 21:29 ` [256/262] HID: hid-multitouch: Add LG Display Multitouch device Greg KH
2011-11-09 21:29 ` [257/262] HID: add MacBookAir4,2 to hid_have_special_driver[] Greg KH
2011-11-09 21:29 ` [258/262] HID: Add support MacbookAir 4,1 keyboard Greg KH
2011-11-09 21:29 ` [259/262] HID: Add device IDs for Macbook Pro 8 keyboards Greg KH
2011-11-09 21:29 ` [260/262] HID: hid-apple: add device ID of another wireless aluminium Greg KH
2011-11-09 21:29 ` [261/262] HID: consolidate MacbookAir 4,1 mappings Greg KH
2011-11-09 21:29 ` [262/262] hid/apple: modern macbook airs use the standard apple function key translations Greg KH
2011-11-10  0:54 ` [000/262] 3.0.9-stable review Kirill A. Shutemov
2011-11-10  3:15   ` Greg KH
2011-11-10  6:35     ` Kirill A. Shutemov
2011-11-10 16:22       ` Greg KH
2011-11-10  8:51     ` Alan Cox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111109212712.598596211@clark.kroah.org \
    --to=gregkh@suse.de \
    --cc=Patrick.Boettcher@dibcom.fr \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=florian@mickler.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mchehab@redhat.com \
    --cc=olivier.grenie@dibcom.fr \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).