* debian/changelog: Update version to 3.6-1~experimental.1
* debian/patches: Fixup broken and remove applied patches. svn path=/dists/trunk/linux/; revision=19409
This commit is contained in:
parent
ff8bd02cb3
commit
9e6570e6b8
|
@ -1,3 +1,9 @@
|
|||
linux (3.6-1~experimental.1) UNRELEASED; urgency=low
|
||||
|
||||
* New upstream release: http://kernelnewbies.org/Linux_3.6
|
||||
|
||||
-- Bastian Blank <waldi@debian.org> Thu, 04 Oct 2012 17:50:39 +0200
|
||||
|
||||
linux (3.5.5-1~experimental.1) experimental; urgency=low
|
||||
|
||||
* New upstream stable update:
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
From: Henrik Rydberg <rydberg@euromail.se>
|
||||
Date: Mon, 16 Jul 2012 09:18:10 +0200
|
||||
Subject: [3/5] hwmon: (applesmc) Allow negative temperature values
|
||||
|
||||
commit b6e5122f09272cb30c2e1fc1d80a40bfa6e87757 upstream.
|
||||
|
||||
There are many userland reports of sensors with unreasonably small and
|
||||
large temperatures. There seem to be several reasons for this:
|
||||
|
||||
Firstly, the major sensor type (sp78) is actually a signed number.
|
||||
This explains why some sensors show very small or large values - they
|
||||
are in fact all small, but of different sign.
|
||||
|
||||
Secondly, the other sensor type (1-hex) is not properly understood; it
|
||||
may be that it is not a temperature after all.
|
||||
|
||||
Thirdly, some sensors are differential in nature, showing changes over
|
||||
time rather than absolute numbers. This explains why those values are
|
||||
small and of varying sign.
|
||||
|
||||
This patch interprets the sp78 type as signed short, but keeps the
|
||||
original scaling. For other types, -EINVAL is returned, since the
|
||||
nature of those sensors is unknown.
|
||||
|
||||
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/applesmc.c | 19 ++++++++-----------
|
||||
1 file changed, 8 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
|
||||
index f41585e..75f87f1 100644
|
||||
--- a/drivers/hwmon/applesmc.c
|
||||
+++ b/drivers/hwmon/applesmc.c
|
||||
@@ -80,6 +80,8 @@
|
||||
#define FANS_MANUAL "FS! " /* r-w ui16 */
|
||||
#define FAN_ID_FMT "F%dID" /* r-o char[16] */
|
||||
|
||||
+#define TEMP_SENSOR_TYPE "sp78"
|
||||
+
|
||||
/* List of keys used to read/write fan speeds */
|
||||
static const char *const fan_speed_fmt[] = {
|
||||
"F%dAc", /* actual speed */
|
||||
@@ -720,27 +722,22 @@ static ssize_t applesmc_show_temperature(struct device *dev,
|
||||
int index = smcreg.temp_begin + to_index(devattr);
|
||||
const struct applesmc_entry *entry;
|
||||
int ret;
|
||||
- u8 buffer[2];
|
||||
- unsigned int temp;
|
||||
+ s16 value;
|
||||
+ int temp;
|
||||
|
||||
entry = applesmc_get_entry_by_index(index);
|
||||
if (IS_ERR(entry))
|
||||
return PTR_ERR(entry);
|
||||
- if (entry->len > 2)
|
||||
+ if (strcmp(entry->type, TEMP_SENSOR_TYPE))
|
||||
return -EINVAL;
|
||||
|
||||
- ret = applesmc_read_entry(entry, buffer, entry->len);
|
||||
+ ret = applesmc_read_s16(entry->key, &value);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- if (entry->len == 2) {
|
||||
- temp = buffer[0] * 1000;
|
||||
- temp += (buffer[1] >> 6) * 250;
|
||||
- } else {
|
||||
- temp = buffer[0] * 4000;
|
||||
- }
|
||||
+ temp = 250 * (value >> 6);
|
||||
|
||||
- return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", temp);
|
||||
+ return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", temp);
|
||||
}
|
||||
|
||||
static ssize_t applesmc_show_fan_speed(struct device *dev,
|
|
@ -1,171 +0,0 @@
|
|||
From: Henrik Rydberg <rydberg@euromail.se>
|
||||
Date: Fri, 27 Jul 2012 20:12:46 +0200
|
||||
Subject: [5/5] hwmon: (applesmc) Decode and act on read/write status codes
|
||||
|
||||
commit 829917cd7246204d6c5f066c40b66d2b62d0930d upstream.
|
||||
|
||||
The behavior of the SMC has changed several times over the years,
|
||||
causing read failures in the driver. It seems the problem can be
|
||||
explained by a shift in SMC speed combined with improper action on
|
||||
status codes.
|
||||
|
||||
We should first wait for the SMC to settle, which was the most
|
||||
frequent response on the old slow machines. Then, if the SMC is busy,
|
||||
we need to try again later by resending the command. This was the most
|
||||
likely response until 2012. Now, with a shorter wait time, we are
|
||||
again most likely to poll while the SMC is settling, and as a result
|
||||
we see high failure rates on many old and new models.
|
||||
|
||||
With the distinction between busy and failure, we can also wait longer
|
||||
before retrying, without sacrificing speed. This seems to bring
|
||||
failures down to virtually zero on all models.
|
||||
|
||||
Tested on: MBA1,1 MBA3,1 MBA5,1 MBA5,2 MBP9,2
|
||||
|
||||
Tested-by: Adam Somerville <adamsomerville@gmail.com>
|
||||
Tested-by: Hubert Eichner <hubert.georg.eichner@gmail.com>
|
||||
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/applesmc.c | 70 ++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 46 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
|
||||
index 4d937a1..2827088 100644
|
||||
--- a/drivers/hwmon/applesmc.c
|
||||
+++ b/drivers/hwmon/applesmc.c
|
||||
@@ -55,9 +55,9 @@
|
||||
|
||||
/* wait up to 32 ms for a status change. */
|
||||
#define APPLESMC_MIN_WAIT 0x0010
|
||||
+#define APPLESMC_RETRY_WAIT 0x0100
|
||||
#define APPLESMC_MAX_WAIT 0x8000
|
||||
|
||||
-#define APPLESMC_STATUS_MASK 0x0f
|
||||
#define APPLESMC_READ_CMD 0x10
|
||||
#define APPLESMC_WRITE_CMD 0x11
|
||||
#define APPLESMC_GET_KEY_BY_INDEX_CMD 0x12
|
||||
@@ -162,51 +162,68 @@ static unsigned int key_at_index;
|
||||
static struct workqueue_struct *applesmc_led_wq;
|
||||
|
||||
/*
|
||||
- * __wait_status - Wait up to 32ms for the status port to get a certain value
|
||||
- * (masked with 0x0f), returning zero if the value is obtained. Callers must
|
||||
+ * wait_read - Wait for a byte to appear on SMC port. Callers must
|
||||
* hold applesmc_lock.
|
||||
*/
|
||||
-static int __wait_status(u8 val)
|
||||
+static int wait_read(void)
|
||||
{
|
||||
+ u8 status;
|
||||
int us;
|
||||
-
|
||||
- val = val & APPLESMC_STATUS_MASK;
|
||||
-
|
||||
for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
|
||||
udelay(us);
|
||||
- if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val)
|
||||
+ status = inb(APPLESMC_CMD_PORT);
|
||||
+ /* read: wait for smc to settle */
|
||||
+ if (status & 0x01)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ pr_warn("wait_read() fail: 0x%02x\n", status);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/*
|
||||
- * special treatment of command port - on newer macbooks, it seems necessary
|
||||
- * to resend the command byte before polling the status again. Callers must
|
||||
- * hold applesmc_lock.
|
||||
+ * send_byte - Write to SMC port, retrying when necessary. Callers
|
||||
+ * must hold applesmc_lock.
|
||||
*/
|
||||
-static int send_command(u8 cmd)
|
||||
+static int send_byte(u8 cmd, u16 port)
|
||||
{
|
||||
+ u8 status;
|
||||
int us;
|
||||
+
|
||||
+ outb(cmd, port);
|
||||
for (us = APPLESMC_MIN_WAIT; us < APPLESMC_MAX_WAIT; us <<= 1) {
|
||||
- outb(cmd, APPLESMC_CMD_PORT);
|
||||
udelay(us);
|
||||
- if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == 0x0c)
|
||||
+ status = inb(APPLESMC_CMD_PORT);
|
||||
+ /* write: wait for smc to settle */
|
||||
+ if (status & 0x02)
|
||||
+ continue;
|
||||
+ /* ready: cmd accepted, return */
|
||||
+ if (status & 0x04)
|
||||
return 0;
|
||||
+ /* timeout: give up */
|
||||
+ if (us << 1 == APPLESMC_MAX_WAIT)
|
||||
+ break;
|
||||
+ /* busy: long wait and resend */
|
||||
+ udelay(APPLESMC_RETRY_WAIT);
|
||||
+ outb(cmd, port);
|
||||
}
|
||||
+
|
||||
+ pr_warn("send_byte(0x%02x, 0x%04x) fail: 0x%02x\n", cmd, port, status);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
+static int send_command(u8 cmd)
|
||||
+{
|
||||
+ return send_byte(cmd, APPLESMC_CMD_PORT);
|
||||
+}
|
||||
+
|
||||
static int send_argument(const char *key)
|
||||
{
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < 4; i++) {
|
||||
- outb(key[i], APPLESMC_DATA_PORT);
|
||||
- if (__wait_status(0x04))
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ if (send_byte(key[i], APPLESMC_DATA_PORT))
|
||||
return -EIO;
|
||||
- }
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -219,11 +236,14 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
- outb(len, APPLESMC_DATA_PORT);
|
||||
+ if (send_byte(len, APPLESMC_DATA_PORT)) {
|
||||
+ pr_warn("%.4s: read len fail\n", key);
|
||||
+ return -EIO;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
- if (__wait_status(0x05)) {
|
||||
- pr_warn("%.4s: read data fail\n", key);
|
||||
+ if (wait_read()) {
|
||||
+ pr_warn("%.4s: read data[%d] fail\n", key, i);
|
||||
return -EIO;
|
||||
}
|
||||
buffer[i] = inb(APPLESMC_DATA_PORT);
|
||||
@@ -241,14 +261,16 @@ static int write_smc(u8 cmd, const char *key, const u8 *buffer, u8 len)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
- outb(len, APPLESMC_DATA_PORT);
|
||||
+ if (send_byte(len, APPLESMC_DATA_PORT)) {
|
||||
+ pr_warn("%.4s: write len fail\n", key);
|
||||
+ return -EIO;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
- if (__wait_status(0x04)) {
|
||||
+ if (send_byte(buffer[i], APPLESMC_DATA_PORT)) {
|
||||
pr_warn("%s: write data fail\n", key);
|
||||
return -EIO;
|
||||
}
|
||||
- outb(buffer[i], APPLESMC_DATA_PORT);
|
||||
}
|
||||
|
||||
return 0;
|
|
@ -1,171 +0,0 @@
|
|||
From: Henrik Rydberg <rydberg@euromail.se>
|
||||
Date: Mon, 16 Jul 2012 09:18:11 +0200
|
||||
Subject: [4/5] hwmon: (applesmc) Ignore some temperature registers
|
||||
|
||||
commit e30bca12573fbf54e2470723aadc047549d147ce upstream.
|
||||
|
||||
Not all sensors in the T range are useful temperatures. This patch
|
||||
creates a subset of sensors to be exported to userland, excluding the
|
||||
unknown types.
|
||||
|
||||
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/applesmc.c | 75 +++++++++++++++++++++++++++++-----------------
|
||||
1 file changed, 47 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
|
||||
index 75f87f1..4d937a1 100644
|
||||
--- a/drivers/hwmon/applesmc.c
|
||||
+++ b/drivers/hwmon/applesmc.c
|
||||
@@ -133,11 +133,13 @@ static struct applesmc_registers {
|
||||
unsigned int temp_count; /* number of temperature registers */
|
||||
unsigned int temp_begin; /* temperature lower index bound */
|
||||
unsigned int temp_end; /* temperature upper index bound */
|
||||
+ unsigned int index_count; /* size of temperature index array */
|
||||
int num_light_sensors; /* number of light sensors */
|
||||
bool has_accelerometer; /* has motion sensor */
|
||||
bool has_key_backlight; /* has keyboard backlight */
|
||||
bool init_complete; /* true when fully initialized */
|
||||
struct applesmc_entry *cache; /* cached key entries */
|
||||
+ const char **index; /* temperature key index */
|
||||
} smcreg = {
|
||||
.mutex = __MUTEX_INITIALIZER(smcreg.mutex),
|
||||
};
|
||||
@@ -469,6 +471,30 @@ static void applesmc_device_init(void)
|
||||
pr_warn("failed to init the device\n");
|
||||
}
|
||||
|
||||
+static int applesmc_init_index(struct applesmc_registers *s)
|
||||
+{
|
||||
+ const struct applesmc_entry *entry;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ if (s->index)
|
||||
+ return 0;
|
||||
+
|
||||
+ s->index = kcalloc(s->temp_count, sizeof(s->index[0]), GFP_KERNEL);
|
||||
+ if (!s->index)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for (i = s->temp_begin; i < s->temp_end; i++) {
|
||||
+ entry = applesmc_get_entry_by_index(i);
|
||||
+ if (IS_ERR(entry))
|
||||
+ continue;
|
||||
+ if (strcmp(entry->type, TEMP_SENSOR_TYPE))
|
||||
+ continue;
|
||||
+ s->index[s->index_count++] = entry->key;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* applesmc_init_smcreg_try - Try to initialize register cache. Idempotent.
|
||||
*/
|
||||
@@ -504,6 +530,10 @@ static int applesmc_init_smcreg_try(void)
|
||||
return ret;
|
||||
s->temp_count = s->temp_end - s->temp_begin;
|
||||
|
||||
+ ret = applesmc_init_index(s);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
ret = applesmc_has_key(LIGHT_SENSOR_LEFT_KEY, &left_light_sensor);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -520,8 +550,8 @@ static int applesmc_init_smcreg_try(void)
|
||||
s->num_light_sensors = left_light_sensor + right_light_sensor;
|
||||
s->init_complete = true;
|
||||
|
||||
- pr_info("key=%d fan=%d temp=%d acc=%d lux=%d kbd=%d\n",
|
||||
- s->key_count, s->fan_count, s->temp_count,
|
||||
+ pr_info("key=%d fan=%d temp=%d index=%d acc=%d lux=%d kbd=%d\n",
|
||||
+ s->key_count, s->fan_count, s->temp_count, s->index_count,
|
||||
s->has_accelerometer,
|
||||
s->num_light_sensors,
|
||||
s->has_key_backlight);
|
||||
@@ -529,6 +559,15 @@ static int applesmc_init_smcreg_try(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void applesmc_destroy_smcreg(void)
|
||||
+{
|
||||
+ kfree(smcreg.index);
|
||||
+ smcreg.index = NULL;
|
||||
+ kfree(smcreg.cache);
|
||||
+ smcreg.cache = NULL;
|
||||
+ smcreg.init_complete = false;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* applesmc_init_smcreg - Initialize register cache.
|
||||
*
|
||||
@@ -549,19 +588,11 @@ static int applesmc_init_smcreg(void)
|
||||
msleep(INIT_WAIT_MSECS);
|
||||
}
|
||||
|
||||
- kfree(smcreg.cache);
|
||||
- smcreg.cache = NULL;
|
||||
+ applesmc_destroy_smcreg();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static void applesmc_destroy_smcreg(void)
|
||||
-{
|
||||
- kfree(smcreg.cache);
|
||||
- smcreg.cache = NULL;
|
||||
- smcreg.init_complete = false;
|
||||
-}
|
||||
-
|
||||
/* Device model stuff */
|
||||
static int applesmc_probe(struct platform_device *dev)
|
||||
{
|
||||
@@ -705,33 +736,21 @@ out:
|
||||
static ssize_t applesmc_show_sensor_label(struct device *dev,
|
||||
struct device_attribute *devattr, char *sysfsbuf)
|
||||
{
|
||||
- int index = smcreg.temp_begin + to_index(devattr);
|
||||
- const struct applesmc_entry *entry;
|
||||
+ const char *key = smcreg.index[to_index(devattr)];
|
||||
|
||||
- entry = applesmc_get_entry_by_index(index);
|
||||
- if (IS_ERR(entry))
|
||||
- return PTR_ERR(entry);
|
||||
-
|
||||
- return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", entry->key);
|
||||
+ return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
|
||||
}
|
||||
|
||||
/* Displays degree Celsius * 1000 */
|
||||
static ssize_t applesmc_show_temperature(struct device *dev,
|
||||
struct device_attribute *devattr, char *sysfsbuf)
|
||||
{
|
||||
- int index = smcreg.temp_begin + to_index(devattr);
|
||||
- const struct applesmc_entry *entry;
|
||||
+ const char *key = smcreg.index[to_index(devattr)];
|
||||
int ret;
|
||||
s16 value;
|
||||
int temp;
|
||||
|
||||
- entry = applesmc_get_entry_by_index(index);
|
||||
- if (IS_ERR(entry))
|
||||
- return PTR_ERR(entry);
|
||||
- if (strcmp(entry->type, TEMP_SENSOR_TYPE))
|
||||
- return -EINVAL;
|
||||
-
|
||||
- ret = applesmc_read_s16(entry->key, &value);
|
||||
+ ret = applesmc_read_s16(key, &value);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1247,7 +1266,7 @@ static int __init applesmc_init(void)
|
||||
if (ret)
|
||||
goto out_info;
|
||||
|
||||
- ret = applesmc_create_nodes(temp_group, smcreg.temp_count);
|
||||
+ ret = applesmc_create_nodes(temp_group, smcreg.index_count);
|
||||
if (ret)
|
||||
goto out_fans;
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
From: Henrik Rydberg <rydberg@euromail.se>
|
||||
Date: Mon, 9 Jul 2012 12:10:26 +0200
|
||||
Subject: [2/5] hwmon: (applesmc) Shorten minimum wait time
|
||||
|
||||
commit a332bf9a65ab34b01226ed177f6937af843c8465 upstream.
|
||||
|
||||
The 2012 series of MacBooks have a faster SMC, and the current driver
|
||||
timings do not work at all. Tests show that decreasing the minimum
|
||||
wait time, from 64 us to 16 us, works well. Since this is still larger
|
||||
than the original minimum of 10 us used before 2008, there is nothing
|
||||
inherently problematic with changing it. The fail frequency on older
|
||||
machines seems to increase slightly, but not enough to be noticeable.
|
||||
|
||||
Tested on MBA11, MBA31, MBA5,2, MBP9,2.
|
||||
|
||||
The patch was originally written by adamski99 (ubuntuforums.org) and
|
||||
later tested by janhouse (bbs.archlinux.org).
|
||||
|
||||
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/applesmc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
|
||||
index 0162f55..f41585e 100644
|
||||
--- a/drivers/hwmon/applesmc.c
|
||||
+++ b/drivers/hwmon/applesmc.c
|
||||
@@ -54,7 +54,7 @@
|
||||
#define APPLESMC_MAX_DATA_LENGTH 32
|
||||
|
||||
/* wait up to 32 ms for a status change. */
|
||||
-#define APPLESMC_MIN_WAIT 0x0040
|
||||
+#define APPLESMC_MIN_WAIT 0x0010
|
||||
#define APPLESMC_MAX_WAIT 0x8000
|
||||
|
||||
#define APPLESMC_STATUS_MASK 0x0f
|
|
@ -1,106 +0,0 @@
|
|||
From: Henrik Rydberg <rydberg@euromail.se>
|
||||
Date: Wed, 20 Jun 2012 18:00:06 +0200
|
||||
Subject: [1/5] hwmon: (applesmc) Skip sensor mapping
|
||||
|
||||
commit edf48f3a73b027a99c92edab2b07d78fe77523cc upstream.
|
||||
|
||||
The special motion sensor mapping is unnecessary; remove it.
|
||||
|
||||
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/applesmc.c | 41 +++++++++++++----------------------------
|
||||
1 file changed, 13 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
|
||||
index 2cde9ec..0162f55 100644
|
||||
--- a/drivers/hwmon/applesmc.c
|
||||
+++ b/drivers/hwmon/applesmc.c
|
||||
@@ -96,10 +96,6 @@ static const char *const fan_speed_fmt[] = {
|
||||
#define APPLESMC_INPUT_FUZZ 4 /* input event threshold */
|
||||
#define APPLESMC_INPUT_FLAT 4
|
||||
|
||||
-#define SENSOR_X 0
|
||||
-#define SENSOR_Y 1
|
||||
-#define SENSOR_Z 2
|
||||
-
|
||||
#define to_index(attr) (to_sensor_dev_attr(attr)->index & 0xffff)
|
||||
#define to_option(attr) (to_sensor_dev_attr(attr)->index >> 16)
|
||||
|
||||
@@ -432,30 +428,19 @@ static int applesmc_has_key(const char *key, bool *value)
|
||||
}
|
||||
|
||||
/*
|
||||
- * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z).
|
||||
+ * applesmc_read_s16 - Read 16-bit signed big endian register
|
||||
*/
|
||||
-static int applesmc_read_motion_sensor(int index, s16 *value)
|
||||
+static int applesmc_read_s16(const char *key, s16 *value)
|
||||
{
|
||||
u8 buffer[2];
|
||||
int ret;
|
||||
|
||||
- switch (index) {
|
||||
- case SENSOR_X:
|
||||
- ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
|
||||
- break;
|
||||
- case SENSOR_Y:
|
||||
- ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
|
||||
- break;
|
||||
- case SENSOR_Z:
|
||||
- ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
|
||||
- break;
|
||||
- default:
|
||||
- ret = -EINVAL;
|
||||
- }
|
||||
+ ret = applesmc_read_key(key, buffer, 2);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
*value = ((s16)buffer[0] << 8) | buffer[1];
|
||||
-
|
||||
- return ret;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -624,8 +609,8 @@ static struct platform_driver applesmc_driver = {
|
||||
*/
|
||||
static void applesmc_calibrate(void)
|
||||
{
|
||||
- applesmc_read_motion_sensor(SENSOR_X, &rest_x);
|
||||
- applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
|
||||
+ applesmc_read_s16(MOTION_SENSOR_X_KEY, &rest_x);
|
||||
+ applesmc_read_s16(MOTION_SENSOR_Y_KEY, &rest_y);
|
||||
rest_x = -rest_x;
|
||||
}
|
||||
|
||||
@@ -634,9 +619,9 @@ static void applesmc_idev_poll(struct input_polled_dev *dev)
|
||||
struct input_dev *idev = dev->input;
|
||||
s16 x, y;
|
||||
|
||||
- if (applesmc_read_motion_sensor(SENSOR_X, &x))
|
||||
+ if (applesmc_read_s16(MOTION_SENSOR_X_KEY, &x))
|
||||
return;
|
||||
- if (applesmc_read_motion_sensor(SENSOR_Y, &y))
|
||||
+ if (applesmc_read_s16(MOTION_SENSOR_Y_KEY, &y))
|
||||
return;
|
||||
|
||||
x = -x;
|
||||
@@ -659,13 +644,13 @@ static ssize_t applesmc_position_show(struct device *dev,
|
||||
int ret;
|
||||
s16 x, y, z;
|
||||
|
||||
- ret = applesmc_read_motion_sensor(SENSOR_X, &x);
|
||||
+ ret = applesmc_read_s16(MOTION_SENSOR_X_KEY, &x);
|
||||
if (ret)
|
||||
goto out;
|
||||
- ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
|
||||
+ ret = applesmc_read_s16(MOTION_SENSOR_Y_KEY, &y);
|
||||
if (ret)
|
||||
goto out;
|
||||
- ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
|
||||
+ ret = applesmc_read_s16(MOTION_SENSOR_Z_KEY, &z);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no>
|
||||
Date: Thu, 19 Jul 2012 06:28:40 +0000
|
||||
Subject: net: e100: ucode is optional in some cases
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
commit 8b0d2f9ed3d8e92feada7c5d70fa85be46e6f948 upstream.
|
||||
|
||||
commit 9ac32e1b firmware: convert e100 driver to request_firmware()
|
||||
|
||||
did a straight conversion of the in-driver ucode to external
|
||||
files. This introduced the possibility of the driver failing
|
||||
to enable an interface due to missing ucode. There was no
|
||||
evaluation of the importance of the ucode at the time.
|
||||
|
||||
Based on comments in earlier versions of this driver, and in
|
||||
the source code for the FreeBSD fxp driver, we can assume that
|
||||
the ucode implements the "CPU Cycle Saver" feature on supported
|
||||
adapters. Although generally wanted, this is an optional
|
||||
feature. The ucode source is not available, preventing it from
|
||||
being included in free distributions. This creates unnecessary
|
||||
problems for the end users. Doing a network install based on a
|
||||
free distribution installer requires the user to download and
|
||||
insert the ucode into the installer.
|
||||
|
||||
Making the ucode optional when possible improves the user
|
||||
experience and driver usability.
|
||||
|
||||
The ucode for some adapters include a bugfix, making it
|
||||
essential. We continue to fail for these adapters unless the
|
||||
ucode is available.
|
||||
|
||||
Signed-off-by: Bjørn Mork <bjorn@mork.no>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/intel/e100.c | 40 ++++++++++++++++++++++++++++---------
|
||||
1 file changed, 31 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
|
||||
index ada720b..535f94f 100644
|
||||
--- a/drivers/net/ethernet/intel/e100.c
|
||||
+++ b/drivers/net/ethernet/intel/e100.c
|
||||
@@ -1249,20 +1249,35 @@ static const struct firmware *e100_request_firmware(struct nic *nic)
|
||||
const struct firmware *fw = nic->fw;
|
||||
u8 timer, bundle, min_size;
|
||||
int err = 0;
|
||||
+ bool required = false;
|
||||
|
||||
/* do not load u-code for ICH devices */
|
||||
if (nic->flags & ich)
|
||||
return NULL;
|
||||
|
||||
- /* Search for ucode match against h/w revision */
|
||||
- if (nic->mac == mac_82559_D101M)
|
||||
+ /* Search for ucode match against h/w revision
|
||||
+ *
|
||||
+ * Based on comments in the source code for the FreeBSD fxp
|
||||
+ * driver, the FIRMWARE_D102E ucode includes both CPUSaver and
|
||||
+ *
|
||||
+ * "fixes for bugs in the B-step hardware (specifically, bugs
|
||||
+ * with Inline Receive)."
|
||||
+ *
|
||||
+ * So we must fail if it cannot be loaded.
|
||||
+ *
|
||||
+ * The other microcode files are only required for the optional
|
||||
+ * CPUSaver feature. Nice to have, but no reason to fail.
|
||||
+ */
|
||||
+ if (nic->mac == mac_82559_D101M) {
|
||||
fw_name = FIRMWARE_D101M;
|
||||
- else if (nic->mac == mac_82559_D101S)
|
||||
+ } else if (nic->mac == mac_82559_D101S) {
|
||||
fw_name = FIRMWARE_D101S;
|
||||
- else if (nic->mac == mac_82551_F || nic->mac == mac_82551_10)
|
||||
+ } else if (nic->mac == mac_82551_F || nic->mac == mac_82551_10) {
|
||||
fw_name = FIRMWARE_D102E;
|
||||
- else /* No ucode on other devices */
|
||||
+ required = true;
|
||||
+ } else { /* No ucode on other devices */
|
||||
return NULL;
|
||||
+ }
|
||||
|
||||
/* If the firmware has not previously been loaded, request a pointer
|
||||
* to it. If it was previously loaded, we are reinitializing the
|
||||
@@ -1273,10 +1288,17 @@ static const struct firmware *e100_request_firmware(struct nic *nic)
|
||||
err = request_firmware(&fw, fw_name, &nic->pdev->dev);
|
||||
|
||||
if (err) {
|
||||
- netif_err(nic, probe, nic->netdev,
|
||||
- "Failed to load firmware \"%s\": %d\n",
|
||||
- fw_name, err);
|
||||
- return ERR_PTR(err);
|
||||
+ if (required) {
|
||||
+ netif_err(nic, probe, nic->netdev,
|
||||
+ "Failed to load firmware \"%s\": %d\n",
|
||||
+ fw_name, err);
|
||||
+ return ERR_PTR(err);
|
||||
+ } else {
|
||||
+ netif_info(nic, probe, nic->netdev,
|
||||
+ "CPUSaver disabled. Needs \"%s\": %d\n",
|
||||
+ fw_name, err);
|
||||
+ return NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Firmware should be precisely UCODE_SIZE (words) plus three bytes
|
|
@ -1,99 +0,0 @@
|
|||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Thu, 19 Jul 2012 12:39:14 +0200
|
||||
Subject: usb: Add USB_QUIRK_RESET_RESUME for all Logitech UVC webcams
|
||||
|
||||
commit e387ef5c47ddeaeaa3cbdc54424cdb7a28dae2c0 upstream.
|
||||
|
||||
Most Logitech UVC webcams (both early models that don't advertise UVC
|
||||
compatibility and newer UVC-advertised devices) require the RESET_RESUME
|
||||
quirk. Instead of listing each and every model, match the devices based
|
||||
on the UVC interface information.
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/core/quirks.c | 58 +++++++++++++--------------------------------
|
||||
1 file changed, 16 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||
index cbd15d1..f15501f4c 100644
|
||||
--- a/drivers/usb/core/quirks.c
|
||||
+++ b/drivers/usb/core/quirks.c
|
||||
@@ -43,53 +43,23 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Creative SB Audigy 2 NX */
|
||||
{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C200 */
|
||||
- { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Fusion */
|
||||
+ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C250 */
|
||||
- { USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Orbit MP */
|
||||
+ { USB_DEVICE(0x046d, 0x08c2), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C300 */
|
||||
- { USB_DEVICE(0x046d, 0x0805), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Pro for Notebook */
|
||||
+ { USB_DEVICE(0x046d, 0x08c3), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam B/C500 */
|
||||
- { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Pro 5000 */
|
||||
+ { USB_DEVICE(0x046d, 0x08c5), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C600 */
|
||||
- { USB_DEVICE(0x046d, 0x0808), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam OEM Dell Notebook */
|
||||
+ { USB_DEVICE(0x046d, 0x08c6), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam Pro 9000 */
|
||||
- { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C905 */
|
||||
- { USB_DEVICE(0x046d, 0x080a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C210 */
|
||||
- { USB_DEVICE(0x046d, 0x0819), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C260 */
|
||||
- { USB_DEVICE(0x046d, 0x081a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C310 */
|
||||
- { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C910 */
|
||||
- { USB_DEVICE(0x046d, 0x0821), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C160 */
|
||||
- { USB_DEVICE(0x046d, 0x0824), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C270 */
|
||||
- { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam Pro 9000 */
|
||||
- { USB_DEVICE(0x046d, 0x0990), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam E3500 */
|
||||
- { USB_DEVICE(0x046d, 0x09a4), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam Vision Pro */
|
||||
- { USB_DEVICE(0x046d, 0x09a6), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam OEM Cisco VT Camera II */
|
||||
+ { USB_DEVICE(0x046d, 0x08c7), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Logitech Harmony 700-series */
|
||||
{ USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
@@ -162,6 +132,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
};
|
||||
|
||||
static const struct usb_device_id usb_interface_quirk_list[] = {
|
||||
+ /* Logitech UVC Cameras */
|
||||
+ { USB_VENDOR_AND_INTERFACE_INFO(0x046d, USB_CLASS_VIDEO, 1, 0),
|
||||
+ .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
|
@ -1,250 +0,0 @@
|
|||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Thu, 19 Jul 2012 12:39:13 +0200
|
||||
Subject: usb: Add quirk detection based on interface information
|
||||
|
||||
commit 80da2e0df5af700518611b7d1cc4fc9945bcaf95 upstream.
|
||||
|
||||
When a whole class of devices (possibly from a specific vendor, or
|
||||
across multiple vendors) require a quirk, explictly listing all devices
|
||||
in the class make the quirks table unnecessarily large. Fix this by
|
||||
allowing matching devices based on interface information.
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/core/driver.c | 38 ++++++++++--------
|
||||
drivers/usb/core/hub.c | 10 +++--
|
||||
drivers/usb/core/quirks.c | 93 +++++++++++++++++++++++++++++++++++----------
|
||||
drivers/usb/core/usb.h | 4 ++
|
||||
4 files changed, 106 insertions(+), 39 deletions(-)
|
||||
|
||||
--- a/drivers/usb/core/driver.c
|
||||
+++ b/drivers/usb/core/driver.c
|
||||
@@ -606,22 +606,10 @@ int usb_match_device(struct usb_device *
|
||||
}
|
||||
|
||||
/* returns 0 if no match, 1 if match */
|
||||
-int usb_match_one_id(struct usb_interface *interface,
|
||||
- const struct usb_device_id *id)
|
||||
+int usb_match_one_id_intf(struct usb_device *dev,
|
||||
+ struct usb_host_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
{
|
||||
- struct usb_host_interface *intf;
|
||||
- struct usb_device *dev;
|
||||
-
|
||||
- /* proc_connectinfo in devio.c may call us with id == NULL. */
|
||||
- if (id == NULL)
|
||||
- return 0;
|
||||
-
|
||||
- intf = interface->cur_altsetting;
|
||||
- dev = interface_to_usbdev(interface);
|
||||
-
|
||||
- if (!usb_match_device(dev, id))
|
||||
- return 0;
|
||||
-
|
||||
/* The interface class, subclass, and protocol should never be
|
||||
* checked for a match if the device class is Vendor Specific,
|
||||
* unless the match record specifies the Vendor ID. */
|
||||
@@ -646,6 +634,26 @@ int usb_match_one_id(struct usb_interfac
|
||||
|
||||
return 1;
|
||||
}
|
||||
+
|
||||
+/* returns 0 if no match, 1 if match */
|
||||
+int usb_match_one_id(struct usb_interface *interface,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct usb_host_interface *intf;
|
||||
+ struct usb_device *dev;
|
||||
+
|
||||
+ /* proc_connectinfo in devio.c may call us with id == NULL. */
|
||||
+ if (id == NULL)
|
||||
+ return 0;
|
||||
+
|
||||
+ intf = interface->cur_altsetting;
|
||||
+ dev = interface_to_usbdev(interface);
|
||||
+
|
||||
+ if (!usb_match_device(dev, id))
|
||||
+ return 0;
|
||||
+
|
||||
+ return usb_match_one_id_intf(dev, intf, id);
|
||||
+}
|
||||
EXPORT_SYMBOL_GPL(usb_match_one_id);
|
||||
|
||||
/**
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -2066,7 +2066,7 @@ static int usb_enumerate_device(struct u
|
||||
if (err < 0) {
|
||||
dev_err(&udev->dev, "can't read configurations, error %d\n",
|
||||
err);
|
||||
- goto fail;
|
||||
+ return err;
|
||||
}
|
||||
}
|
||||
if (udev->wusb == 1 && udev->authorized == 0) {
|
||||
@@ -2082,8 +2082,12 @@ static int usb_enumerate_device(struct u
|
||||
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
|
||||
}
|
||||
err = usb_enumerate_device_otg(udev);
|
||||
-fail:
|
||||
- return err;
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ usb_detect_interface_quirks(udev);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void set_usb_port_removable(struct usb_device *udev)
|
||||
--- a/drivers/usb/core/quirks.c
|
||||
+++ b/drivers/usb/core/quirks.c
|
||||
@@ -15,17 +15,22 @@
|
||||
#include <linux/usb/quirks.h>
|
||||
#include "usb.h"
|
||||
|
||||
-/* List of quirky USB devices. Please keep this list ordered by:
|
||||
+/* Lists of quirky USB devices, split in device quirks and interface quirks.
|
||||
+ * Device quirks are applied at the very beginning of the enumeration process,
|
||||
+ * right after reading the device descriptor. They can thus only match on device
|
||||
+ * information.
|
||||
+ *
|
||||
+ * Interface quirks are applied after reading all the configuration descriptors.
|
||||
+ * They can match on both device and interface information.
|
||||
+ *
|
||||
+ * Note that the DELAY_INIT and HONOR_BNUMINTERFACES quirks do not make sense as
|
||||
+ * interface quirks, as they only influence the enumeration process which is run
|
||||
+ * before processing the interface quirks.
|
||||
+ *
|
||||
+ * Please keep the lists ordered by:
|
||||
* 1) Vendor ID
|
||||
* 2) Product ID
|
||||
* 3) Class ID
|
||||
- *
|
||||
- * as we want specific devices to be overridden first, and only after that, any
|
||||
- * class specific quirks.
|
||||
- *
|
||||
- * Right now the logic aborts if it finds a valid device in the table, we might
|
||||
- * want to change that in the future if it turns out that a whole class of
|
||||
- * devices is broken...
|
||||
*/
|
||||
static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* CBM - Flash disk */
|
||||
@@ -156,16 +161,53 @@ static const struct usb_device_id usb_qu
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
||||
-static const struct usb_device_id *find_id(struct usb_device *udev)
|
||||
+static const struct usb_device_id usb_interface_quirk_list[] = {
|
||||
+ { } /* terminating entry must be last */
|
||||
+};
|
||||
+
|
||||
+static bool usb_match_any_interface(struct usb_device *udev,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < udev->descriptor.bNumConfigurations; ++i) {
|
||||
+ struct usb_host_config *cfg = &udev->config[i];
|
||||
+ unsigned int j;
|
||||
+
|
||||
+ for (j = 0; j < cfg->desc.bNumInterfaces; ++j) {
|
||||
+ struct usb_interface_cache *cache;
|
||||
+ struct usb_host_interface *intf;
|
||||
+
|
||||
+ cache = cfg->intf_cache[j];
|
||||
+ if (cache->num_altsetting == 0)
|
||||
+ continue;
|
||||
+
|
||||
+ intf = &cache->altsetting[0];
|
||||
+ if (usb_match_one_id_intf(udev, intf, id))
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static u32 __usb_detect_quirks(struct usb_device *udev,
|
||||
+ const struct usb_device_id *id)
|
||||
{
|
||||
- const struct usb_device_id *id = usb_quirk_list;
|
||||
+ u32 quirks = 0;
|
||||
|
||||
- for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
|
||||
- id->driver_info; id++) {
|
||||
- if (usb_match_device(udev, id))
|
||||
- return id;
|
||||
+ for (; id->match_flags; id++) {
|
||||
+ if (!usb_match_device(udev, id))
|
||||
+ continue;
|
||||
+
|
||||
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO) &&
|
||||
+ !usb_match_any_interface(udev, id))
|
||||
+ continue;
|
||||
+
|
||||
+ quirks |= (u32)(id->driver_info);
|
||||
}
|
||||
- return NULL;
|
||||
+
|
||||
+ return quirks;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -173,14 +215,10 @@ static const struct usb_device_id *find_
|
||||
*/
|
||||
void usb_detect_quirks(struct usb_device *udev)
|
||||
{
|
||||
- const struct usb_device_id *id = usb_quirk_list;
|
||||
-
|
||||
- id = find_id(udev);
|
||||
- if (id)
|
||||
- udev->quirks = (u32)(id->driver_info);
|
||||
+ udev->quirks = __usb_detect_quirks(udev, usb_quirk_list);
|
||||
if (udev->quirks)
|
||||
dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
|
||||
- udev->quirks);
|
||||
+ udev->quirks);
|
||||
|
||||
/* For the present, all devices default to USB-PERSIST enabled */
|
||||
#if 0 /* was: #ifdef CONFIG_PM */
|
||||
@@ -197,3 +235,16 @@ void usb_detect_quirks(struct usb_device
|
||||
udev->persist_enabled = 1;
|
||||
#endif /* CONFIG_PM */
|
||||
}
|
||||
+
|
||||
+void usb_detect_interface_quirks(struct usb_device *udev)
|
||||
+{
|
||||
+ u32 quirks;
|
||||
+
|
||||
+ quirks = __usb_detect_quirks(udev, usb_interface_quirk_list);
|
||||
+ if (quirks == 0)
|
||||
+ return;
|
||||
+
|
||||
+ dev_dbg(&udev->dev, "USB interface quirks for this device: %x\n",
|
||||
+ quirks);
|
||||
+ udev->quirks |= quirks;
|
||||
+}
|
||||
--- a/drivers/usb/core/usb.h
|
||||
+++ b/drivers/usb/core/usb.h
|
||||
@@ -24,6 +24,7 @@ extern void usb_disable_device(struct us
|
||||
extern int usb_deauthorize_device(struct usb_device *);
|
||||
extern int usb_authorize_device(struct usb_device *);
|
||||
extern void usb_detect_quirks(struct usb_device *udev);
|
||||
+extern void usb_detect_interface_quirks(struct usb_device *udev);
|
||||
extern int usb_remove_device(struct usb_device *udev);
|
||||
|
||||
extern int usb_get_device_descriptor(struct usb_device *dev,
|
||||
@@ -35,6 +36,9 @@ extern int usb_set_configuration(struct
|
||||
extern int usb_choose_configuration(struct usb_device *udev);
|
||||
|
||||
extern void usb_kick_khubd(struct usb_device *dev);
|
||||
+extern int usb_match_one_id_intf(struct usb_device *dev,
|
||||
+ struct usb_host_interface *intf,
|
||||
+ const struct usb_device_id *id);
|
||||
extern int usb_match_device(struct usb_device *dev,
|
||||
const struct usb_device_id *id);
|
||||
extern void usb_forced_unbind_intf(struct usb_interface *intf);
|
|
@ -1,91 +0,0 @@
|
|||
From: Feng Tang <feng.tang@intel.com>
|
||||
Date: Thu, 16 Aug 2012 15:50:10 +0800
|
||||
Subject: mfd: lpc_ich: Fix a 3.5 kernel regression for iTCO_wdt driver
|
||||
|
||||
commit 092369efbd6ef6b4a215741ce9f65446bf45beff upstream.
|
||||
|
||||
There are many reports (including 2 of my machines) that iTCO_wdt watchdog
|
||||
driver fails to be initialized in 3.5 kernel with error message like:
|
||||
|
||||
[ 5.265175] ACPI Warning: 0x00001060-0x0000107f SystemIO conflicts with Region \_SB_.PCI0.LPCB.TCOI 1 (20120320/utaddress-251)
|
||||
[ 5.265192] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver
|
||||
[ 5.265206] lpc_ich: Resource conflict(s) found affecting iTCO_wdt
|
||||
|
||||
The root cause the iTCO_wdt driver in 3.4 probes the HW IO resource from
|
||||
LPC's PCI config space, while in 3.5 kernel it relies on lpc_ich driver
|
||||
for the probe, which adds a new acpi_check_resource_conflict() check, and
|
||||
give up the probe if there is any conflict with ACPI.
|
||||
|
||||
Fix it by removing all the checks for iTCO_wdt to keep the same behavior as
|
||||
3.4 kernel.
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=44991
|
||||
|
||||
Actually the same check could be removed for the gpio-ich in lpc_ich.c,
|
||||
but I'm not sure if it will cause problems.
|
||||
|
||||
Signed-off-by: Feng Tang <feng.tang@intel.com>
|
||||
Cc: Aaron Sierra <asierra@xes-inc.com>
|
||||
Cc: Wim Van Sebroeck <wim@iguana.be>
|
||||
Cc: Len Brown <len.brown@intel.com>
|
||||
Cc: Bob Moore <robert.moore@intel.com>
|
||||
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
|
||||
---
|
||||
drivers/mfd/lpc_ich.c | 20 +-------------------
|
||||
1 file changed, 1 insertion(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c
|
||||
index 027cc8f..a05fdfc 100644
|
||||
--- a/drivers/mfd/lpc_ich.c
|
||||
+++ b/drivers/mfd/lpc_ich.c
|
||||
@@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
||||
u32 base_addr_cfg;
|
||||
u32 base_addr;
|
||||
int ret;
|
||||
- bool acpi_conflict = false;
|
||||
struct resource *res;
|
||||
|
||||
/* Setup power management base register */
|
||||
@@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
||||
res = wdt_io_res(ICH_RES_IO_TCO);
|
||||
res->start = base_addr + ACPIBASE_TCO_OFF;
|
||||
res->end = base_addr + ACPIBASE_TCO_END;
|
||||
- ret = acpi_check_resource_conflict(res);
|
||||
- if (ret) {
|
||||
- acpi_conflict = true;
|
||||
- goto wdt_done;
|
||||
- }
|
||||
|
||||
res = wdt_io_res(ICH_RES_IO_SMI);
|
||||
res->start = base_addr + ACPIBASE_SMI_OFF;
|
||||
res->end = base_addr + ACPIBASE_SMI_END;
|
||||
- ret = acpi_check_resource_conflict(res);
|
||||
- if (ret) {
|
||||
- acpi_conflict = true;
|
||||
- goto wdt_done;
|
||||
- }
|
||||
+
|
||||
lpc_ich_enable_acpi_space(dev);
|
||||
|
||||
/*
|
||||
@@ -813,11 +803,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
||||
res = wdt_mem_res(ICH_RES_MEM_GCS);
|
||||
res->start = base_addr + ACPIBASE_GCS_OFF;
|
||||
res->end = base_addr + ACPIBASE_GCS_END;
|
||||
- ret = acpi_check_resource_conflict(res);
|
||||
- if (ret) {
|
||||
- acpi_conflict = true;
|
||||
- goto wdt_done;
|
||||
- }
|
||||
}
|
||||
|
||||
lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id);
|
||||
@@ -825,9 +810,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
|
||||
1, NULL, 0);
|
||||
|
||||
wdt_done:
|
||||
- if (acpi_conflict)
|
||||
- pr_warn("Resource conflict(s) found affecting %s\n",
|
||||
- lpc_ich_cells[LPC_WDT].name);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2,11 +2,7 @@ diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
|
|||
index ce1e7ba..4bd5a0c 100644
|
||||
--- a/drivers/media/video/Kconfig
|
||||
+++ b/drivers/media/video/Kconfig
|
||||
@@ -483,6 +483,7 @@ config VIDEO_OV7670
|
||||
@@ -497,2 +497,3 @@ config VIDEO_OV7670
|
||||
config VIDEO_VS6624
|
||||
tristate "ST VS6624 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
+ depends on BROKEN
|
||||
---help---
|
||||
This is a Video4Linux2 sensor-level driver for the ST VS6624
|
||||
camera.
|
||||
tristate "ST VS6624 sensor support"
|
||||
|
|
|
@ -8,7 +8,7 @@ are set.
|
|||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -806,7 +806,7 @@ endif
|
||||
@@ -806,7 +806,7 @@
|
||||
prepare2: prepare3 outputmakefile asm-generic
|
||||
|
||||
prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
|
||||
|
@ -17,7 +17,7 @@ are set.
|
|||
$(cmd_crmodverdir)
|
||||
|
||||
archprepare: archheaders archscripts prepare1 scripts_basic
|
||||
@@ -838,12 +838,25 @@ define filechk_version.h
|
||||
@@ -838,12 +838,25 @@
|
||||
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
|
||||
endef
|
||||
|
||||
|
@ -45,7 +45,7 @@ are set.
|
|||
$(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
|
||||
--- a/arch/s390/kernel/traps.c
|
||||
+++ b/arch/s390/kernel/traps.c
|
||||
@@ -33,6 +33,7 @@
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/utsname.h>
|
||||
|
@ -53,7 +53,7 @@ are set.
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/atomic.h>
|
||||
@@ -166,11 +167,12 @@ static void show_last_breaking_event(str
|
||||
@@ -164,11 +165,12 @@
|
||||
*/
|
||||
void dump_stack(void)
|
||||
{
|
||||
|
@ -68,7 +68,7 @@ are set.
|
|||
printk("Process %s (pid: %d, task: %p, ksp: %p)\n",
|
||||
current->comm, current->pid, current,
|
||||
(void *) current->thread.ksp);
|
||||
@@ -217,11 +219,12 @@ void show_registers(struct pt_regs *regs
|
||||
@@ -215,11 +217,12 @@
|
||||
void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
print_modules();
|
||||
|
@ -93,7 +93,7 @@ are set.
|
|||
#include <asm/current.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include "sysrq.h"
|
||||
@@ -16,8 +17,9 @@ void __show_regs(struct pt_regs *regs)
|
||||
@@ -16,8 +17,9 @@
|
||||
{
|
||||
printk("\n");
|
||||
print_modules();
|
||||
|
@ -107,7 +107,7 @@ are set.
|
|||
printk(KERN_INFO "RSP: %016lx EFLAGS: %08lx\n", PT_REGS_SP(regs),
|
||||
--- a/arch/x86/kernel/process.c
|
||||
+++ b/arch/x86/kernel/process.c
|
||||
@@ -17,6 +17,7 @@
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/cpuidle.h>
|
||||
#include <trace/events/power.h>
|
||||
#include <linux/hw_breakpoint.h>
|
||||
|
@ -115,21 +115,20 @@ are set.
|
|||
#include <asm/cpu.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/syscalls.h>
|
||||
@@ -146,11 +147,12 @@ void show_regs_common(void)
|
||||
@@ -147,11 +148,12 @@
|
||||
/* Board Name is optional */
|
||||
board = dmi_get_system_info(DMI_BOARD_NAME);
|
||||
|
||||
printk(KERN_CONT "\n");
|
||||
- printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s",
|
||||
+ printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s%s",
|
||||
current->pid, current->comm, print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
- init_utsname()->version);
|
||||
+ init_utsname()->version,
|
||||
+ LINUX_PACKAGE_ID);
|
||||
printk(KERN_CONT " %s %s", vendor, product);
|
||||
if (board)
|
||||
printk(KERN_CONT "/%s", board);
|
||||
- printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s %s %s%s%s\n",
|
||||
+ printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s%s %s %s%s%s\n",
|
||||
current->pid, current->comm, print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version,
|
||||
+ LINUX_PACKAGE_ID,
|
||||
vendor, product,
|
||||
board ? "/" : "",
|
||||
board ? board : "");
|
||||
--- a/arch/x86/kernel/dumpstack.c
|
||||
+++ b/arch/x86/kernel/dumpstack.c
|
||||
@@ -15,6 +15,7 @@
|
||||
|
@ -140,7 +139,7 @@ are set.
|
|||
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
@@ -188,11 +189,12 @@ void dump_stack(void)
|
||||
@@ -188,11 +189,12 @@
|
||||
unsigned long stack;
|
||||
|
||||
bp = stack_frame(current, NULL);
|
||||
|
@ -165,7 +164,7 @@ are set.
|
|||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/delay.h>
|
||||
@@ -112,9 +113,9 @@ show_regs (struct pt_regs *regs)
|
||||
@@ -112,9 +113,9 @@
|
||||
print_modules();
|
||||
printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current),
|
||||
smp_processor_id(), current->comm);
|
||||
|
@ -187,7 +186,7 @@ are set.
|
|||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/leds.h>
|
||||
@@ -278,11 +279,12 @@ void __show_regs(struct pt_regs *regs)
|
||||
@@ -278,11 +279,12 @@
|
||||
unsigned long flags;
|
||||
char buf[64];
|
||||
|
||||
|
@ -212,7 +211,7 @@ are set.
|
|||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -644,8 +645,9 @@ void show_regs(struct pt_regs * regs)
|
||||
@@ -644,8 +645,9 @@
|
||||
|
||||
printk("NIP: "REG" LR: "REG" CTR: "REG"\n",
|
||||
regs->nip, regs->link, regs->ctr);
|
||||
|
@ -234,7 +233,7 @@ are set.
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/fpu.h>
|
||||
@@ -33,10 +34,11 @@ void show_regs(struct pt_regs * regs)
|
||||
@@ -33,10 +34,11 @@
|
||||
{
|
||||
printk("\n");
|
||||
printk("Pid : %d, Comm: \t\t%s\n", task_pid_nr(current), current->comm);
|
||||
|
|
|
@ -16,11 +16,9 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|||
mm/memcontrol.c | 3 +++
|
||||
4 files changed, 29 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
||||
index cc85a92..38e0b44 100644
|
||||
--- a/Documentation/kernel-parameters.txt
|
||||
+++ b/Documentation/kernel-parameters.txt
|
||||
@@ -425,8 +425,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
@@ -455,8 +455,8 @@
|
||||
ccw_timeout_log [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
|
@ -31,30 +29,26 @@ index cc85a92..38e0b44 100644
|
|||
{Currently supported controllers - "memory"}
|
||||
|
||||
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
||||
diff --git a/init/Kconfig b/init/Kconfig
|
||||
index d886b1e..3410369 100644
|
||||
--- a/init/Kconfig
|
||||
+++ b/init/Kconfig
|
||||
@@ -659,6 +659,14 @@ config CGROUP_MEM_RES_CTLR
|
||||
@@ -709,6 +709,14 @@
|
||||
This config option also selects MM_OWNER config option, which
|
||||
could in turn add some fork/exit overhead.
|
||||
|
||||
+config CGROUP_MEM_RES_CTLR_DISABLED
|
||||
+config MEMCG_DISABLED
|
||||
+ bool "Memory Resource Controller disabled by default"
|
||||
+ depends on CGROUP_MEM_RES_CTLR
|
||||
+ depends on MEMCG
|
||||
+ default n
|
||||
+ help
|
||||
+ Disable the memory group resource controller unless explicitly
|
||||
+ enabled using the kernel parameter "cgroup_enable=memory".
|
||||
+
|
||||
config CGROUP_MEM_RES_CTLR_SWAP
|
||||
config MEMCG_SWAP
|
||||
bool "Memory Resource Controller Swap Extension"
|
||||
depends on CGROUP_MEM_RES_CTLR && SWAP
|
||||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
|
||||
index 25c7eb5..b3c5aa7 100644
|
||||
depends on MEMCG && SWAP
|
||||
--- a/kernel/cgroup.c
|
||||
+++ b/kernel/cgroup.c
|
||||
@@ -4526,7 +4526,7 @@ static void cgroup_release_agent(struct work_struct *work)
|
||||
@@ -5029,7 +5029,7 @@
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
}
|
||||
|
||||
|
@ -63,7 +57,7 @@ index 25c7eb5..b3c5aa7 100644
|
|||
{
|
||||
int i;
|
||||
char *token;
|
||||
@@ -4542,17 +4542,29 @@ static int __init cgroup_disable(char *str)
|
||||
@@ -5045,17 +5045,29 @@
|
||||
struct cgroup_subsys *ss = subsys[i];
|
||||
|
||||
if (!strcmp(token, ss->name)) {
|
||||
|
@ -96,11 +90,9 @@ index 25c7eb5..b3c5aa7 100644
|
|||
/*
|
||||
* Functons for CSS ID.
|
||||
*/
|
||||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
|
||||
index 010f916..f660a07 100644
|
||||
--- a/mm/memcontrol.c
|
||||
+++ b/mm/memcontrol.c
|
||||
@@ -5153,6 +5153,9 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss,
|
||||
@@ -5596,6 +5596,9 @@
|
||||
|
||||
struct cgroup_subsys mem_cgroup_subsys = {
|
||||
.name = "memory",
|
||||
|
@ -110,6 +102,3 @@ index 010f916..f660a07 100644
|
|||
.subsys_id = mem_cgroup_subsys_id,
|
||||
.create = mem_cgroup_create,
|
||||
.pre_destroy = mem_cgroup_pre_destroy,
|
||||
--
|
||||
1.7.4.4
|
||||
|
||||
|
|
|
@ -1,93 +0,0 @@
|
|||
From: Kees Cook <keescook@chromium.org>
|
||||
Date: Wed, 25 Jul 2012 17:29:08 -0700
|
||||
Subject: [2/2] fs: add link restriction audit reporting
|
||||
|
||||
commit a51d9eaa41866ab6b4b6ecad7b621f8b66ece0dc upstream.
|
||||
|
||||
Adds audit messages for unexpected link restriction violations so that
|
||||
system owners will have some sort of potentially actionable information
|
||||
about misbehaving processes.
|
||||
|
||||
Signed-off-by: Kees Cook <keescook@chromium.org>
|
||||
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
|
||||
---
|
||||
fs/namei.c | 2 ++
|
||||
include/linux/audit.h | 4 ++++
|
||||
kernel/audit.c | 21 +++++++++++++++++++++
|
||||
3 files changed, 27 insertions(+)
|
||||
|
||||
--- a/fs/namei.c
|
||||
+++ b/fs/namei.c
|
||||
@@ -652,6 +652,7 @@ static inline int may_follow_link(struct
|
||||
|
||||
path_put_conditional(link, nd);
|
||||
path_put(&nd->path);
|
||||
+ audit_log_link_denied("follow_link", link);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -720,6 +721,7 @@ static int may_linkat(struct path *link)
|
||||
capable(CAP_FOWNER))
|
||||
return 0;
|
||||
|
||||
+ audit_log_link_denied("linkat", link);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
--- a/include/linux/audit.h
|
||||
+++ b/include/linux/audit.h
|
||||
@@ -130,6 +130,7 @@
|
||||
#define AUDIT_LAST_KERN_ANOM_MSG 1799
|
||||
#define AUDIT_ANOM_PROMISCUOUS 1700 /* Device changed promiscuous mode */
|
||||
#define AUDIT_ANOM_ABEND 1701 /* Process ended abnormally */
|
||||
+#define AUDIT_ANOM_LINK 1702 /* Suspicious use of file links */
|
||||
#define AUDIT_INTEGRITY_DATA 1800 /* Data integrity verification */
|
||||
#define AUDIT_INTEGRITY_METADATA 1801 /* Metadata integrity verification */
|
||||
#define AUDIT_INTEGRITY_STATUS 1802 /* Integrity enable status */
|
||||
@@ -687,6 +688,8 @@ extern void audit_log_d_path(struct
|
||||
const struct path *path);
|
||||
extern void audit_log_key(struct audit_buffer *ab,
|
||||
char *key);
|
||||
+extern void audit_log_link_denied(const char *operation,
|
||||
+ struct path *link);
|
||||
extern void audit_log_lost(const char *message);
|
||||
#ifdef CONFIG_SECURITY
|
||||
extern void audit_log_secctx(struct audit_buffer *ab, u32 secid);
|
||||
@@ -716,6 +719,7 @@ extern int audit_enabled;
|
||||
#define audit_log_untrustedstring(a,s) do { ; } while (0)
|
||||
#define audit_log_d_path(b, p, d) do { ; } while (0)
|
||||
#define audit_log_key(b, k) do { ; } while (0)
|
||||
+#define audit_log_link_denied(o, l) do { ; } while (0)
|
||||
#define audit_log_secctx(b,s) do { ; } while (0)
|
||||
#define audit_enabled 0
|
||||
#endif
|
||||
--- a/kernel/audit.c
|
||||
+++ b/kernel/audit.c
|
||||
@@ -1450,6 +1450,27 @@ void audit_log_key(struct audit_buffer *
|
||||
}
|
||||
|
||||
/**
|
||||
+ * audit_log_link_denied - report a link restriction denial
|
||||
+ * @operation: specific link opreation
|
||||
+ * @link: the path that triggered the restriction
|
||||
+ */
|
||||
+void audit_log_link_denied(const char *operation, struct path *link)
|
||||
+{
|
||||
+ struct audit_buffer *ab;
|
||||
+
|
||||
+ ab = audit_log_start(current->audit_context, GFP_KERNEL,
|
||||
+ AUDIT_ANOM_LINK);
|
||||
+ audit_log_format(ab, "op=%s action=denied", operation);
|
||||
+ audit_log_format(ab, " pid=%d comm=", current->pid);
|
||||
+ audit_log_untrustedstring(ab, current->comm);
|
||||
+ audit_log_d_path(ab, " path=", link);
|
||||
+ audit_log_format(ab, " dev=");
|
||||
+ audit_log_untrustedstring(ab, link->dentry->d_inode->i_sb->s_id);
|
||||
+ audit_log_format(ab, " ino=%lu", link->dentry->d_inode->i_ino);
|
||||
+ audit_log_end(ab);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* audit_log_end - end one audit record
|
||||
* @ab: the audit_buffer
|
||||
*
|
|
@ -1,356 +0,0 @@
|
|||
From: Kees Cook <keescook@chromium.org>
|
||||
Date: Wed, 25 Jul 2012 17:29:07 -0700
|
||||
Subject: [1/2] fs: add link restrictions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
commit 800179c9b8a1e796e441674776d11cd4c05d61d7 upstream.
|
||||
|
||||
This adds symlink and hardlink restrictions to the Linux VFS.
|
||||
|
||||
Symlinks:
|
||||
|
||||
A long-standing class of security issues is the symlink-based
|
||||
time-of-check-time-of-use race, most commonly seen in world-writable
|
||||
directories like /tmp. The common method of exploitation of this flaw
|
||||
is to cross privilege boundaries when following a given symlink (i.e. a
|
||||
root process follows a symlink belonging to another user). For a likely
|
||||
incomplete list of hundreds of examples across the years, please see:
|
||||
http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp
|
||||
|
||||
The solution is to permit symlinks to only be followed when outside
|
||||
a sticky world-writable directory, or when the uid of the symlink and
|
||||
follower match, or when the directory owner matches the symlink's owner.
|
||||
|
||||
Some pointers to the history of earlier discussion that I could find:
|
||||
|
||||
1996 Aug, Zygo Blaxell
|
||||
http://marc.info/?l=bugtraq&m=87602167419830&w=2
|
||||
1996 Oct, Andrew Tridgell
|
||||
http://lkml.indiana.edu/hypermail/linux/kernel/9610.2/0086.html
|
||||
1997 Dec, Albert D Cahalan
|
||||
http://lkml.org/lkml/1997/12/16/4
|
||||
2005 Feb, Lorenzo Hernández García-Hierro
|
||||
http://lkml.indiana.edu/hypermail/linux/kernel/0502.0/1896.html
|
||||
2010 May, Kees Cook
|
||||
https://lkml.org/lkml/2010/5/30/144
|
||||
|
||||
Past objections and rebuttals could be summarized as:
|
||||
|
||||
- Violates POSIX.
|
||||
- POSIX didn't consider this situation and it's not useful to follow
|
||||
a broken specification at the cost of security.
|
||||
- Might break unknown applications that use this feature.
|
||||
- Applications that break because of the change are easy to spot and
|
||||
fix. Applications that are vulnerable to symlink ToCToU by not having
|
||||
the change aren't. Additionally, no applications have yet been found
|
||||
that rely on this behavior.
|
||||
- Applications should just use mkstemp() or O_CREATE|O_EXCL.
|
||||
- True, but applications are not perfect, and new software is written
|
||||
all the time that makes these mistakes; blocking this flaw at the
|
||||
kernel is a single solution to the entire class of vulnerability.
|
||||
- This should live in the core VFS.
|
||||
- This should live in an LSM. (https://lkml.org/lkml/2010/5/31/135)
|
||||
- This should live in an LSM.
|
||||
- This should live in the core VFS. (https://lkml.org/lkml/2010/8/2/188)
|
||||
|
||||
Hardlinks:
|
||||
|
||||
On systems that have user-writable directories on the same partition
|
||||
as system files, a long-standing class of security issues is the
|
||||
hardlink-based time-of-check-time-of-use race, most commonly seen in
|
||||
world-writable directories like /tmp. The common method of exploitation
|
||||
of this flaw is to cross privilege boundaries when following a given
|
||||
hardlink (i.e. a root process follows a hardlink created by another
|
||||
user). Additionally, an issue exists where users can "pin" a potentially
|
||||
vulnerable setuid/setgid file so that an administrator will not actually
|
||||
upgrade a system fully.
|
||||
|
||||
The solution is to permit hardlinks to only be created when the user is
|
||||
already the existing file's owner, or if they already have read/write
|
||||
access to the existing file.
|
||||
|
||||
Many Linux users are surprised when they learn they can link to files
|
||||
they have no access to, so this change appears to follow the doctrine
|
||||
of "least surprise". Additionally, this change does not violate POSIX,
|
||||
which states "the implementation may require that the calling process
|
||||
has permission to access the existing file"[1].
|
||||
|
||||
This change is known to break some implementations of the "at" daemon,
|
||||
though the version used by Fedora and Ubuntu has been fixed[2] for
|
||||
a while. Otherwise, the change has been undisruptive while in use in
|
||||
Ubuntu for the last 1.5 years.
|
||||
|
||||
[1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/linkat.html
|
||||
[2] http://anonscm.debian.org/gitweb/?p=collab-maint/at.git;a=commitdiff;h=f4114656c3a6c6f6070e315ffdf940a49eda3279
|
||||
|
||||
This patch is based on the patches in Openwall and grsecurity, along with
|
||||
suggestions from Al Viro. I have added a sysctl to enable the protected
|
||||
behavior, and documentation.
|
||||
|
||||
Signed-off-by: Kees Cook <keescook@chromium.org>
|
||||
Acked-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
|
||||
[bwh: Backported to 3.2:
|
||||
- Adjust context
|
||||
- In path_openat(), convert error from may_follow_link() to filp as it
|
||||
won't be converted outside the loop]
|
||||
---
|
||||
Documentation/sysctl/fs.txt | 42 +++++++++++++++
|
||||
fs/namei.c | 122 +++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/fs.h | 2 +
|
||||
kernel/sysctl.c | 18 +++++++
|
||||
4 files changed, 184 insertions(+)
|
||||
|
||||
--- a/Documentation/sysctl/fs.txt
|
||||
+++ b/Documentation/sysctl/fs.txt
|
||||
@@ -32,6 +32,8 @@ Currently, these files are in /proc/sys/
|
||||
- nr_open
|
||||
- overflowuid
|
||||
- overflowgid
|
||||
+- protected_hardlinks
|
||||
+- protected_symlinks
|
||||
- suid_dumpable
|
||||
- super-max
|
||||
- super-nr
|
||||
@@ -157,6 +159,46 @@ The default is 65534.
|
||||
|
||||
==============================================================
|
||||
|
||||
+protected_hardlinks:
|
||||
+
|
||||
+A long-standing class of security issues is the hardlink-based
|
||||
+time-of-check-time-of-use race, most commonly seen in world-writable
|
||||
+directories like /tmp. The common method of exploitation of this flaw
|
||||
+is to cross privilege boundaries when following a given hardlink (i.e. a
|
||||
+root process follows a hardlink created by another user). Additionally,
|
||||
+on systems without separated partitions, this stops unauthorized users
|
||||
+from "pinning" vulnerable setuid/setgid files against being upgraded by
|
||||
+the administrator, or linking to special files.
|
||||
+
|
||||
+When set to "0", hardlink creation behavior is unrestricted.
|
||||
+
|
||||
+When set to "1" hardlinks cannot be created by users if they do not
|
||||
+already own the source file, or do not have read/write access to it.
|
||||
+
|
||||
+This protection is based on the restrictions in Openwall and grsecurity.
|
||||
+
|
||||
+==============================================================
|
||||
+
|
||||
+protected_symlinks:
|
||||
+
|
||||
+A long-standing class of security issues is the symlink-based
|
||||
+time-of-check-time-of-use race, most commonly seen in world-writable
|
||||
+directories like /tmp. The common method of exploitation of this flaw
|
||||
+is to cross privilege boundaries when following a given symlink (i.e. a
|
||||
+root process follows a symlink belonging to another user). For a likely
|
||||
+incomplete list of hundreds of examples across the years, please see:
|
||||
+http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp
|
||||
+
|
||||
+When set to "0", symlink following behavior is unrestricted.
|
||||
+
|
||||
+When set to "1" symlinks are permitted to be followed only when outside
|
||||
+a sticky world-writable directory, or when the uid of the symlink and
|
||||
+follower match, or when the directory owner matches the symlink's owner.
|
||||
+
|
||||
+This protection is based on the restrictions in Openwall and grsecurity.
|
||||
+
|
||||
+==============================================================
|
||||
+
|
||||
suid_dumpable:
|
||||
|
||||
This value can be used to query and set the core dump mode for setuid
|
||||
--- a/fs/namei.c
|
||||
+++ b/fs/namei.c
|
||||
@@ -624,6 +624,119 @@ static inline void put_link(struct namei
|
||||
path_put(link);
|
||||
}
|
||||
|
||||
+int sysctl_protected_symlinks __read_mostly = 1;
|
||||
+int sysctl_protected_hardlinks __read_mostly = 1;
|
||||
+
|
||||
+/**
|
||||
+ * may_follow_link - Check symlink following for unsafe situations
|
||||
+ * @link: The path of the symlink
|
||||
+ *
|
||||
+ * In the case of the sysctl_protected_symlinks sysctl being enabled,
|
||||
+ * CAP_DAC_OVERRIDE needs to be specifically ignored if the symlink is
|
||||
+ * in a sticky world-writable directory. This is to protect privileged
|
||||
+ * processes from failing races against path names that may change out
|
||||
+ * from under them by way of other users creating malicious symlinks.
|
||||
+ * It will permit symlinks to be followed only when outside a sticky
|
||||
+ * world-writable directory, or when the uid of the symlink and follower
|
||||
+ * match, or when the directory owner matches the symlink's owner.
|
||||
+ *
|
||||
+ * Returns 0 if following the symlink is allowed, -ve on error.
|
||||
+ */
|
||||
+static inline int may_follow_link(struct path *link, struct nameidata *nd)
|
||||
+{
|
||||
+ const struct inode *inode;
|
||||
+ const struct inode *parent;
|
||||
+
|
||||
+ if (!sysctl_protected_symlinks)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Allowed if owner and follower match. */
|
||||
+ inode = link->dentry->d_inode;
|
||||
+ if (current_cred()->fsuid == inode->i_uid)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Allowed if parent directory not sticky and world-writable. */
|
||||
+ parent = nd->path.dentry->d_inode;
|
||||
+ if ((parent->i_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Allowed if parent directory and link owner match. */
|
||||
+ if (parent->i_uid == inode->i_uid)
|
||||
+ return 0;
|
||||
+
|
||||
+ path_put_conditional(link, nd);
|
||||
+ path_put(&nd->path);
|
||||
+ return -EACCES;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * safe_hardlink_source - Check for safe hardlink conditions
|
||||
+ * @inode: the source inode to hardlink from
|
||||
+ *
|
||||
+ * Return false if at least one of the following conditions:
|
||||
+ * - inode is not a regular file
|
||||
+ * - inode is setuid
|
||||
+ * - inode is setgid and group-exec
|
||||
+ * - access failure for read and write
|
||||
+ *
|
||||
+ * Otherwise returns true.
|
||||
+ */
|
||||
+static bool safe_hardlink_source(struct inode *inode)
|
||||
+{
|
||||
+ umode_t mode = inode->i_mode;
|
||||
+
|
||||
+ /* Special files should not get pinned to the filesystem. */
|
||||
+ if (!S_ISREG(mode))
|
||||
+ return false;
|
||||
+
|
||||
+ /* Setuid files should not get pinned to the filesystem. */
|
||||
+ if (mode & S_ISUID)
|
||||
+ return false;
|
||||
+
|
||||
+ /* Executable setgid files should not get pinned to the filesystem. */
|
||||
+ if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))
|
||||
+ return false;
|
||||
+
|
||||
+ /* Hardlinking to unreadable or unwritable sources is dangerous. */
|
||||
+ if (inode_permission(inode, MAY_READ | MAY_WRITE))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * may_linkat - Check permissions for creating a hardlink
|
||||
+ * @link: the source to hardlink from
|
||||
+ *
|
||||
+ * Block hardlink when all of:
|
||||
+ * - sysctl_protected_hardlinks enabled
|
||||
+ * - fsuid does not match inode
|
||||
+ * - hardlink source is unsafe (see safe_hardlink_source() above)
|
||||
+ * - not CAP_FOWNER
|
||||
+ *
|
||||
+ * Returns 0 if successful, -ve on error.
|
||||
+ */
|
||||
+static int may_linkat(struct path *link)
|
||||
+{
|
||||
+ const struct cred *cred;
|
||||
+ struct inode *inode;
|
||||
+
|
||||
+ if (!sysctl_protected_hardlinks)
|
||||
+ return 0;
|
||||
+
|
||||
+ cred = current_cred();
|
||||
+ inode = link->dentry->d_inode;
|
||||
+
|
||||
+ /* Source inode owner (or CAP_FOWNER) can hardlink all they like,
|
||||
+ * otherwise, it must be a safe source.
|
||||
+ */
|
||||
+ if (cred->fsuid == inode->i_uid || safe_hardlink_source(inode) ||
|
||||
+ capable(CAP_FOWNER))
|
||||
+ return 0;
|
||||
+
|
||||
+ return -EPERM;
|
||||
+}
|
||||
+
|
||||
static __always_inline int
|
||||
follow_link(struct path *link, struct nameidata *nd, void **p)
|
||||
{
|
||||
@@ -1613,6 +1726,9 @@ static int path_lookupat(int dfd, const
|
||||
while (err > 0) {
|
||||
void *cookie;
|
||||
struct path link = path;
|
||||
+ err = may_follow_link(&link, nd);
|
||||
+ if (unlikely(err))
|
||||
+ break;
|
||||
nd->flags |= LOOKUP_PARENT;
|
||||
err = follow_link(&link, nd, &cookie);
|
||||
if (!err)
|
||||
@@ -2325,6 +2441,11 @@ static struct file *path_openat(int dfd,
|
||||
filp = ERR_PTR(-ELOOP);
|
||||
break;
|
||||
}
|
||||
+ error = may_follow_link(&link, nd);
|
||||
+ if (unlikely(error)) {
|
||||
+ filp = ERR_PTR(error);
|
||||
+ break;
|
||||
+ }
|
||||
nd->flags |= LOOKUP_PARENT;
|
||||
nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL);
|
||||
error = follow_link(&link, nd, &cookie);
|
||||
@@ -2972,6 +3093,9 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con
|
||||
error = -EXDEV;
|
||||
if (old_path.mnt != new_path.mnt)
|
||||
goto out_dput;
|
||||
+ error = may_linkat(&old_path);
|
||||
+ if (unlikely(error))
|
||||
+ goto out_dput;
|
||||
error = mnt_want_write(new_path.mnt);
|
||||
if (error)
|
||||
goto out_dput;
|
||||
--- a/include/linux/fs.h
|
||||
+++ b/include/linux/fs.h
|
||||
@@ -420,6 +420,8 @@ extern unsigned long get_max_files(void)
|
||||
extern int sysctl_nr_open;
|
||||
extern struct inodes_stat_t inodes_stat;
|
||||
extern int leases_enable, lease_break_time;
|
||||
+extern int sysctl_protected_symlinks;
|
||||
+extern int sysctl_protected_hardlinks;
|
||||
|
||||
struct buffer_head;
|
||||
typedef int (get_block_t)(struct inode *inode, sector_t iblock,
|
||||
--- a/kernel/sysctl.c
|
||||
+++ b/kernel/sysctl.c
|
||||
@@ -1495,6 +1495,24 @@ static struct ctl_table fs_table[] = {
|
||||
#endif
|
||||
#endif
|
||||
{
|
||||
+ .procname = "protected_symlinks",
|
||||
+ .data = &sysctl_protected_symlinks,
|
||||
+ .maxlen = sizeof(int),
|
||||
+ .mode = 0600,
|
||||
+ .proc_handler = proc_dointvec_minmax,
|
||||
+ .extra1 = &zero,
|
||||
+ .extra2 = &one,
|
||||
+ },
|
||||
+ {
|
||||
+ .procname = "protected_hardlinks",
|
||||
+ .data = &sysctl_protected_hardlinks,
|
||||
+ .maxlen = sizeof(int),
|
||||
+ .mode = 0600,
|
||||
+ .proc_handler = proc_dointvec_minmax,
|
||||
+ .extra1 = &zero,
|
||||
+ .extra2 = &one,
|
||||
+ },
|
||||
+ {
|
||||
.procname = "suid_dumpable",
|
||||
.data = &suid_dumpable,
|
||||
.maxlen = sizeof(int),
|
|
@ -1,50 +0,0 @@
|
|||
From: Ping Cheng <pinglinux@gmail.com>
|
||||
Date: Sun, 24 Jun 2012 23:44:46 -0500
|
||||
Subject: wacom: ignore new-style Wacom multi touch packets on MT Tablet PC
|
||||
Bug-Debian: http://bugs.debian.org/677164
|
||||
|
||||
Tablets such as 0xE6 (Thinkpad x220t) already worked fine before
|
||||
adding support for the new packet format, so let's drop the
|
||||
functionality for such devices for now. Meanwhile 0xE5 can still use
|
||||
the new packet format.
|
||||
|
||||
This should bring the behavior of TABLETPC2FG devices closer to that
|
||||
from before 1963518b9b1b (Input: wacom - add 0xE5 (MT device) support,
|
||||
2012-04-29).
|
||||
|
||||
[jn: extracted from a larger commit in the input-wacom repository,
|
||||
with new description]
|
||||
|
||||
Signed-off-by: Ping Cheng <pingc@wacom.com>
|
||||
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
|
||||
---
|
||||
drivers/input/tablet/wacom_wac.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
|
||||
index 004bc1bb1544..d696ab7ecc2b 100644
|
||||
--- a/drivers/input/tablet/wacom_wac.c
|
||||
+++ b/drivers/input/tablet/wacom_wac.c
|
||||
@@ -1547,7 +1547,6 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
|
||||
__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
|
||||
break;
|
||||
|
||||
- case TABLETPC2FG:
|
||||
case MTSCREEN:
|
||||
if (features->device_type == BTN_TOOL_FINGER) {
|
||||
|
||||
@@ -1559,6 +1558,11 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
|
||||
|
||||
for (i = 0; i < features->touch_max; i++)
|
||||
wacom_wac->slots[i] = -1;
|
||||
+ }
|
||||
+ /* fall through */
|
||||
+
|
||||
+ case TABLETPC2FG:
|
||||
+ if (features->device_type == BTN_TOOL_FINGER) {
|
||||
|
||||
input_mt_init_slots(input_dev, features->touch_max);
|
||||
input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE,
|
||||
--
|
||||
1.7.11.rc3
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
Subject: ahci: Add JMicron 362 device IDs
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 22 Jul 2011 01:43:22 +0200
|
||||
|
||||
The JMicron JMB362 controller supports AHCI only, but some revisions
|
||||
use the IDE class code. These need to be matched by device ID.
|
||||
|
||||
These additions have apparently been included by QNAP in their NAS
|
||||
devices using these controllers.
|
||||
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
drivers/ata/ahci.c | 3 +++
|
||||
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -264,6 +264,9 @@ static const struct pci_device_id ahci_p
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
|
||||
+ /* JMicron 362B and 362C have an AHCI function with IDE class code */
|
||||
+ { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
|
||||
+ { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
|
||||
|
||||
/* ATI */
|
||||
{ PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
|
|
@ -8,12 +8,12 @@ features/all/sound-pci-cs46xx-request_firmware.patch
|
|||
|
||||
# Patches and source files from aufs3 repository, imported with
|
||||
# debian/patches/features/all/aufs3/gen-patch.
|
||||
features/all/aufs3/aufs3-base.patch
|
||||
features/all/aufs3/aufs3-standalone.patch
|
||||
features/all/aufs3/aufs3-kbuild.patch
|
||||
features/all/aufs3/aufs3-add.patch
|
||||
#features/all/aufs3/aufs3-base.patch
|
||||
#features/all/aufs3/aufs3-standalone.patch
|
||||
#features/all/aufs3/aufs3-kbuild.patch
|
||||
#features/all/aufs3/aufs3-add.patch
|
||||
# mark as staging/crap
|
||||
features/all/aufs3/mark-as-staging.patch
|
||||
#features/all/aufs3/mark-as-staging.patch
|
||||
# fix added exports from security/device_cgroup.c
|
||||
features/all/aufs3/aufs3-fix-export-__devcgroup_inode_permission.patch
|
||||
|
||||
|
@ -41,28 +41,13 @@ bugfix/ia64/nouveau-ACPI-support-is-dependent-on-X86.patch
|
|||
bugfix/arm/ixp4xx_iobe.patch
|
||||
debian/x86-memtest-WARN-if-bad-RAM-found.patch
|
||||
|
||||
# Add link security restrictions from 3.6
|
||||
features/all/fs-add-link-restrictions.patch
|
||||
features/all/fs-add-link-restriction-audit-reporting.patch
|
||||
|
||||
features/all/wacom/0029-wacom-do-not-request-tablet-data-on-MT-Tablet-PC-pen.patch
|
||||
features/all/wacom/0030-wacom-ignore-new-style-Wacom-multi-touch-packets-on-.patch
|
||||
bugfix/ia64/IA64-Export-asm-cmpxchg.h-to-userland.patch
|
||||
features/all/cpu-devices/Partially-revert-cpufreq-Add-support-for-x86-cpuinfo.patch
|
||||
bugfix/all/net-e100-ucode-is-optional-in-some-cases.patch
|
||||
bugfix/all/hwmon-applesmc-Skip-sensor-mapping.patch
|
||||
bugfix/all/hwmon-applesmc-Shorten-minimum-wait-time.patch
|
||||
bugfix/all/hwmon-applesmc-Allow-negative-temperature-values.patch
|
||||
bugfix/all/hwmon-applesmc-Ignore-some-temperature-registers.patch
|
||||
bugfix/all/hwmon-applesmc-Decode-and-act-on-read-write-status-c.patch
|
||||
bugfix/x86/mfd-lpc_ich-Fix-a-3.5-kernel-regression-for-iTCO_wdt.patch
|
||||
|
||||
debian/debugfs-set-default-mode-to-700.patch
|
||||
|
||||
bugfix/all/media-rc-ite-cir-Initialise-ite_dev-rdev-earlier.patch
|
||||
features/all/USB-add-USB_VENDOR_AND_INTERFACE_INFO-macro.patch
|
||||
bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch
|
||||
bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch
|
||||
bugfix/alpha/alpha-use-large-data-model.diff
|
||||
features/arm/ahci-Add-JMicron-362-device-IDs.patch
|
||||
bugfix/all/speakup-lower-default-software-speech-rate.patch
|
||||
|
|
Loading…
Reference in New Issue