diff options
41 files changed, 0 insertions, 3527 deletions
diff --git a/driver-core/hwmon-add-driver-for-smsc-emc2103-temperature-monitor-and-fan-controller.patch b/driver-core/hwmon-add-driver-for-smsc-emc2103-temperature-monitor-and-fan-controller.patch deleted file mode 100644 index c313132bb82ed6..00000000000000 --- a/driver-core/hwmon-add-driver-for-smsc-emc2103-temperature-monitor-and-fan-controller.patch +++ /dev/null @@ -1,795 +0,0 @@ -From steve.glendinning@smsc.com Mon Jun 14 15:25:47 2010 -From: Steve Glendinning <steve.glendinning@smsc.com> -Date: Thu, 10 Jun 2010 07:46:21 +0100 -Subject: hwmon: Add driver for SMSC EMC2103 temperature monitor and fan controller -To: gregkh@suse.de -Message-ID: <1276152381-2088-1-git-send-email-steve.glendinning@smsc.com> - - -SMSC's EMC2103 family of temperature/fan controllers have 1 -onboard and up to 3 external temperature sensors, and allow -closed-loop control of one fan. This patch adds support for -them. - -Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com> -Cc: Andrew Morton <akpm@linux-foundation.org> -Cc: Jean Delvare <khali@linux-fr.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - MAINTAINERS | 6 - drivers/hwmon/Kconfig | 10 - drivers/hwmon/Makefile | 1 - drivers/hwmon/emc2103.c | 723 ++++++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 740 insertions(+) - ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -5205,6 +5205,12 @@ M: Nicolas Pitre <nico@fluxnic.net> - S: Odd Fixes - F: drivers/net/smc91x.* - -+SMSC EMC2103 HARDWARE MONITOR DRIVER -+M: Steve Glendinning <steve.glendinning@smsc.com> -+L: lm-sensors@lm-sensors.org -+S: Supported -+F: drivers/hwmon/emc2103.c -+ - SMSC47B397 HARDWARE MONITOR DRIVER - M: "Mark M. Hoffman" <mhoffman@lightlink.com> - L: lm-sensors@lm-sensors.org ---- a/drivers/hwmon/Kconfig -+++ b/drivers/hwmon/Kconfig -@@ -794,6 +794,16 @@ config SENSORS_SMSC47M192 - This driver can also be built as a module. If so, the module - will be called smsc47m192. - -+config SENSORS_EMC2103 -+ tristate "SMSC EMC2103" -+ depends on I2C -+ help -+ If you say yes here you get support for the temperature -+ and fan sensors of the SMSC EMC2103 chips. -+ -+ This driver can also be built as a module. If so, the module -+ will be called emc2103. -+ - config SENSORS_SMSC47B397 - tristate "SMSC LPC47B397-NC" - depends on EXPERIMENTAL ---- a/drivers/hwmon/Makefile -+++ b/drivers/hwmon/Makefile -@@ -89,6 +89,7 @@ obj-$(CONFIG_SENSORS_SIS5595) += sis5595 - obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o - obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o - obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o -+obj-$(CONFIG_SENSORS_EMC2103) += emc2103.o - obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o - obj-$(CONFIG_SENSORS_THMC50) += thmc50.o - obj-$(CONFIG_SENSORS_TMP102) += tmp102.o ---- /dev/null -+++ b/drivers/hwmon/emc2103.c -@@ -0,0 +1,723 @@ -+/* -+ emc2103.c - Support for SMSC EMC2103 -+ Copyright (c) 2010 SMSC -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/slab.h> -+#include <linux/jiffies.h> -+#include <linux/i2c.h> -+#include <linux/hwmon.h> -+#include <linux/hwmon-sysfs.h> -+#include <linux/err.h> -+#include <linux/mutex.h> -+ -+/* Addresses scanned */ -+static const unsigned short normal_i2c[] = { 0x2E, I2C_CLIENT_END }; -+ -+static u8 REG_TEMP[4] = { 0x00, 0x02, 0x04, 0x06 }; -+static u8 REG_TEMP_MIN[4] = { 0x3c, 0x38, 0x39, 0x3a }; -+static u8 REG_TEMP_MAX[4] = { 0x34, 0x30, 0x31, 0x32 }; -+ -+#define REG_CONF1 (0x20) -+#define REG_TEMP_MAX_ALARM (0x24) -+#define REG_TEMP_MIN_ALARM (0x25) -+#define REG_FAN_CONF1 (0x42) -+#define REG_FAN_TARGET_LO (0x4c) -+#define REG_FAN_TARGET_HI (0x4d) -+#define REG_FAN_TACH_HI (0x4e) -+#define REG_FAN_TACH_LO (0x4f) -+#define REG_PRODUCT_ID (0xfd) -+#define REG_MFG_ID (0xfe) -+#define FAN_RPM_FACTOR (3932160) -+ -+static int apd = 1; -+module_param(apd, bool, 0); -+MODULE_PARM_DESC(init, "Set to zero to disable anti-parallel diode mode"); -+ -+struct temperature { -+ s8 degrees; -+ u8 fraction; /* 0-7 multiples of 0.125 */ -+}; -+ -+struct emc2103_data { -+ struct device *hwmon_dev; -+ struct mutex update_lock; -+ bool valid; /* registers are valid */ -+ bool fan_rpm_control; -+ bool have_temp3; -+ bool have_temp4; -+ unsigned long last_updated; /* in jiffies */ -+ struct temperature temp[4]; /* internal + 3 external */ -+ s8 temp_min[4]; /* no fractional part */ -+ s8 temp_max[4]; /* no fractional part */ -+ u8 temp_min_alarm; -+ u8 temp_max_alarm; -+ u8 fan_range; -+ u16 fan_tach; -+ u16 fan_target; -+}; -+ -+static void read_u8_from_i2c(struct i2c_client *client, u8 i2c_reg, u8 *output) -+{ -+ int status = i2c_smbus_read_byte_data(client, i2c_reg); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ i2c_reg, status); -+ } else { -+ *output = status; -+ } -+} -+ -+static void read_s8_from_i2c(struct i2c_client *client, u8 i2c_reg, s8 *output) -+{ -+ int status = i2c_smbus_read_byte_data(client, i2c_reg); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ i2c_reg, status); -+ } else { -+ *output = status; -+ } -+} -+ -+static void read_temp_from_i2c(struct i2c_client *client, u8 i2c_reg, -+ struct temperature *temp) -+{ -+ /* read integer part */ -+ int status = i2c_smbus_read_byte_data(client, i2c_reg); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ i2c_reg, status); -+ } else { -+ temp->degrees = status; -+ } -+ -+ /* Read fractional part from the next register offset */ -+ status = i2c_smbus_read_byte_data(client, i2c_reg + 1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ i2c_reg, status); -+ } else { -+ temp->fraction = (status & 0xe0) >> 5; -+ } -+} -+ -+static void read_fan_from_i2c(struct i2c_client *client, u16 *output, -+ u8 hi_addr, u8 lo_addr) -+{ -+ u16 high_byte; -+ -+ int status = i2c_smbus_read_byte_data(client, hi_addr); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ hi_addr, status); -+ } else { -+ high_byte = status & 0xff; -+ -+ status = i2c_smbus_read_byte_data(client, lo_addr); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ lo_addr, status); -+ } else { -+ *output = (high_byte << 5) | ((status & 0xf8) >> 3); -+ } -+ } -+} -+ -+static void write_fan_target_to_i2c(struct i2c_client *client, u16 new_target) -+{ -+ u8 high_byte = (new_target & 0x1fe0) >> 5; -+ u8 low_byte = (new_target & 0x001f) << 3; -+ i2c_smbus_write_byte_data(client, REG_FAN_TARGET_LO, low_byte); -+ i2c_smbus_write_byte_data(client, REG_FAN_TARGET_HI, high_byte); -+} -+ -+static void read_fan_range_from_i2c(struct i2c_client *client, u8 *output) -+ -+{ -+ int status = i2c_smbus_read_byte_data(client, REG_FAN_CONF1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ REG_FAN_CONF1, status); -+ } else { -+ *output = (status & 0x60) >> 5; -+ } -+} -+ -+static struct emc2103_data *emc2103_update_device(struct device *dev) -+{ -+ struct i2c_client *client = to_i2c_client(dev); -+ struct emc2103_data *data = i2c_get_clientdata(client); -+ -+ mutex_lock(&data->update_lock); -+ -+ if (time_after(jiffies, data->last_updated + HZ + HZ / 2) -+ || !data->valid) { -+ int i; -+ -+ dev_dbg(&client->dev, "Starting emc2103 update\n"); -+ -+ for (i = 0; i < 4; i++) { -+ read_temp_from_i2c(client, REG_TEMP[i], &data->temp[i]); -+ read_s8_from_i2c(client, REG_TEMP_MIN[i], -+ &data->temp_min[i]); -+ read_s8_from_i2c(client, REG_TEMP_MAX[i], -+ &data->temp_max[i]); -+ } -+ -+ read_u8_from_i2c(client, REG_TEMP_MIN_ALARM, -+ &data->temp_min_alarm); -+ read_u8_from_i2c(client, REG_TEMP_MAX_ALARM, -+ &data->temp_max_alarm); -+ -+ read_fan_from_i2c(client, &data->fan_tach, -+ REG_FAN_TACH_HI, REG_FAN_TACH_LO); -+ read_fan_from_i2c(client, &data->fan_target, -+ REG_FAN_TARGET_HI, REG_FAN_TARGET_LO); -+ read_fan_range_from_i2c(client, &data->fan_range); -+ -+ data->last_updated = jiffies; -+ data->valid = true; -+ } -+ -+ mutex_unlock(&data->update_lock); -+ -+ return data; -+} -+ -+static ssize_t -+show_temp(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int millidegrees = data->temp[attr->index].degrees * 1000 -+ + data->temp[attr->index].fraction * 125; -+ return sprintf(buf, "%d\n", millidegrees); -+} -+ -+static ssize_t -+show_temp_min(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int millidegrees = data->temp_min[attr->index] * 1000; -+ return sprintf(buf, "%d\n", millidegrees); -+} -+ -+static ssize_t -+show_temp_max(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int millidegrees = data->temp_max[attr->index] * 1000; -+ return sprintf(buf, "%d\n", millidegrees); -+} -+ -+static ssize_t -+show_temp_fault(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ bool fault = (data->temp[attr->index].degrees == -128); -+ return sprintf(buf, "%d\n", fault ? 1 : 0); -+} -+ -+static ssize_t -+show_temp_min_alarm(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ bool alarm = data->temp_min_alarm & (1 << attr->index); -+ return sprintf(buf, "%d\n", alarm ? 1 : 0); -+} -+ -+static ssize_t -+show_temp_max_alarm(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ bool alarm = data->temp_max_alarm & (1 << attr->index); -+ return sprintf(buf, "%d\n", alarm ? 1 : 0); -+} -+ -+static ssize_t set_temp_min(struct device *dev, struct device_attribute *da, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ struct i2c_client *client = to_i2c_client(dev); -+ long val; -+ -+ int result = strict_strtol(buf, 10, &val); -+ if (result < 0) -+ return -EINVAL; -+ -+ val = val / 1000; -+ if ((val < -63) || (val > 127)) -+ return -EINVAL; -+ -+ mutex_lock(&data->update_lock); -+ data->temp_min[attr->index] = val; -+ i2c_smbus_write_byte_data(client, REG_TEMP_MIN[attr->index], val); -+ mutex_unlock(&data->update_lock); -+ -+ return count; -+} -+ -+static ssize_t set_temp_max(struct device *dev, struct device_attribute *da, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(da); -+ struct emc2103_data *data = emc2103_update_device(dev); -+ struct i2c_client *client = to_i2c_client(dev); -+ long val; -+ -+ int result = strict_strtol(buf, 10, &val); -+ if (result < 0) -+ return -EINVAL; -+ -+ if ((val < -63) || (val > 127)) -+ return -EINVAL; -+ -+ mutex_lock(&data->update_lock); -+ data->temp_max[attr->index] = val; -+ i2c_smbus_write_byte_data(client, REG_TEMP_MAX[attr->index], val); -+ mutex_unlock(&data->update_lock); -+ -+ return count; -+} -+ -+static ssize_t -+show_fan(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int fan_div = 1 << data->fan_range; -+ int rpm = (FAN_RPM_FACTOR * fan_div) / data->fan_tach; -+ return sprintf(buf, "%d\n", rpm); -+} -+ -+static ssize_t -+show_fan_div(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int fan_div = 1 << data->fan_range; -+ return sprintf(buf, "%d\n", fan_div); -+} -+ -+/* Note: we also update the fan target here, because its value is -+ determined in part by the fan clock divider. This follows the principle -+ of least surprise; the user doesn't expect the fan target to change just -+ because the divider changed. */ -+static ssize_t set_fan_div(struct device *dev, struct device_attribute *da, -+ const char *buf, size_t count) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ struct i2c_client *client = to_i2c_client(dev); -+ int status, old_div = 1 << data->fan_range; -+ long new_div; -+ -+ int result = strict_strtol(buf, 10, &new_div); -+ if (result < 0) -+ return -EINVAL; -+ -+ if (new_div == old_div) /* No change */ -+ return count; -+ -+ mutex_lock(&data->update_lock); -+ switch (new_div) { -+ case 1: -+ data->fan_range = 0; -+ break; -+ case 2: -+ data->fan_range = 1; -+ break; -+ case 4: -+ data->fan_range = 2; -+ break; -+ case 8: -+ data->fan_range = 3; -+ break; -+ default: -+ mutex_unlock(&data->update_lock); -+ return -EINVAL; -+ } -+ -+ status = i2c_smbus_read_byte_data(client, REG_FAN_CONF1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ REG_FAN_CONF1, status); -+ mutex_unlock(&data->update_lock); -+ return -EIO; -+ } -+ status &= 0x9F; -+ status |= (data->fan_range << 5) & 0x60; -+ i2c_smbus_write_byte_data(client, REG_FAN_CONF1, status); -+ -+ /* update fan target if high word is not disabled */ -+ if ((data->fan_target & 0x1fe0) != 0x1fe0) { -+ data->fan_target = (data->fan_target * new_div) / old_div; -+ write_fan_target_to_i2c(client, data->fan_target); -+ } -+ -+ /* invalidate data to force re-read from hardware */ -+ data->valid = false; -+ -+ mutex_unlock(&data->update_lock); -+ return count; -+} -+ -+static ssize_t -+show_fan_target(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ int fan_div = 1 << data->fan_range; -+ int rpm = (FAN_RPM_FACTOR * fan_div) / data->fan_target; -+ -+ /* high byte of 0xff = disabled so return 0 */ -+ if ((data->fan_target & 0x1fe0) == 0x1fe0) -+ rpm = 0; -+ -+ return sprintf(buf, "%d\n", rpm); -+} -+ -+static ssize_t set_fan_target(struct device *dev, struct device_attribute *da, -+ const char *buf, size_t count) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ struct i2c_client *client = to_i2c_client(dev); -+ long rpm_target; -+ int fan_div = 1 << data->fan_range; -+ -+ int result = strict_strtol(buf, 10, &rpm_target); -+ if (result < 0) -+ return -EINVAL; -+ -+ if ((rpm_target < 0) || (rpm_target > 16384)) -+ return -EINVAL; -+ -+ mutex_lock(&data->update_lock); -+ -+ if (rpm_target == 0) -+ data->fan_target = 0x1fff; -+ else -+ data->fan_target = -+ ((FAN_RPM_FACTOR * fan_div) / rpm_target) & 0x1fff; -+ -+ write_fan_target_to_i2c(client, data->fan_target); -+ -+ if (!data->fan_rpm_control) { -+ /* RPM control mode is not currently enabled */ -+ int status = i2c_smbus_read_byte_data(client, REG_FAN_CONF1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ REG_FAN_CONF1, status); -+ mutex_unlock(&data->update_lock); -+ return -EIO; -+ } -+ status |= 0x80; -+ i2c_smbus_write_byte_data(client, REG_FAN_CONF1, status); -+ -+ data->fan_rpm_control = true; -+ } -+ -+ mutex_unlock(&data->update_lock); -+ return count; -+} -+ -+static ssize_t -+show_fan_fault(struct device *dev, struct device_attribute *da, char *buf) -+{ -+ struct emc2103_data *data = emc2103_update_device(dev); -+ bool fault = ((data->fan_tach & 0x1fe0) == 0x1fe0); -+ return sprintf(buf, "%d\n", fault ? 1 : 0); -+} -+ -+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); -+static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO | S_IWUSR, show_temp_min, -+ set_temp_min, 0); -+static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp_max, -+ set_temp_max, 0); -+static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0); -+static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_temp_min_alarm, -+ NULL, 0); -+static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_temp_max_alarm, -+ NULL, 0); -+ -+static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); -+static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR, show_temp_min, -+ set_temp_min, 1); -+static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max, -+ set_temp_max, 1); -+static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1); -+static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_temp_min_alarm, -+ NULL, 1); -+static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_temp_max_alarm, -+ NULL, 1); -+ -+static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); -+static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO | S_IWUSR, show_temp_min, -+ set_temp_min, 2); -+static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max, -+ set_temp_max, 2); -+static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2); -+static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_temp_min_alarm, -+ NULL, 2); -+static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_temp_max_alarm, -+ NULL, 2); -+ -+static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3); -+static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO | S_IWUSR, show_temp_min, -+ set_temp_min, 3); -+static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO | S_IWUSR, show_temp_max, -+ set_temp_max, 3); -+static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_temp_fault, NULL, 3); -+static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO, show_temp_min_alarm, -+ NULL, 3); -+static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO, show_temp_max_alarm, -+ NULL, 3); -+ -+static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); -+static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR, show_fan_div, -+ set_fan_div, 0); -+static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_fan_target, -+ set_fan_target, 0); -+static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0); -+ -+/* sensors present on all models */ -+static struct attribute *emc2103_attributes[] = { -+ &sensor_dev_attr_temp1_input.dev_attr.attr, -+ &sensor_dev_attr_temp1_min.dev_attr.attr, -+ &sensor_dev_attr_temp1_max.dev_attr.attr, -+ &sensor_dev_attr_temp1_fault.dev_attr.attr, -+ &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, -+ &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, -+ &sensor_dev_attr_temp2_input.dev_attr.attr, -+ &sensor_dev_attr_temp2_min.dev_attr.attr, -+ &sensor_dev_attr_temp2_max.dev_attr.attr, -+ &sensor_dev_attr_temp2_fault.dev_attr.attr, -+ &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, -+ &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, -+ &sensor_dev_attr_fan1_input.dev_attr.attr, -+ &sensor_dev_attr_fan1_div.dev_attr.attr, -+ &sensor_dev_attr_fan1_target.dev_attr.attr, -+ &sensor_dev_attr_fan1_fault.dev_attr.attr, -+ NULL -+}; -+ -+/* extra temperature sensors only present on 2103-2 and 2103-4 */ -+static struct attribute *emc2103_attributes_temp3[] = { -+ &sensor_dev_attr_temp3_input.dev_attr.attr, -+ &sensor_dev_attr_temp3_min.dev_attr.attr, -+ &sensor_dev_attr_temp3_max.dev_attr.attr, -+ &sensor_dev_attr_temp3_fault.dev_attr.attr, -+ &sensor_dev_attr_temp3_min_alarm.dev_attr.attr, -+ &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, -+ NULL -+}; -+ -+/* extra temperature sensors only present on 2103-2 and 2103-4 in APD mode */ -+static struct attribute *emc2103_attributes_temp4[] = { -+ &sensor_dev_attr_temp4_input.dev_attr.attr, -+ &sensor_dev_attr_temp4_min.dev_attr.attr, -+ &sensor_dev_attr_temp4_max.dev_attr.attr, -+ &sensor_dev_attr_temp4_fault.dev_attr.attr, -+ &sensor_dev_attr_temp4_min_alarm.dev_attr.attr, -+ &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, -+ NULL -+}; -+ -+static const struct attribute_group emc2103_group = { -+ .attrs = emc2103_attributes, -+}; -+ -+static const struct attribute_group emc2103_temp3_group = { -+ .attrs = emc2103_attributes_temp3, -+}; -+ -+static const struct attribute_group emc2103_temp4_group = { -+ .attrs = emc2103_attributes_temp4, -+}; -+ -+static int -+emc2103_probe(struct i2c_client *client, const struct i2c_device_id *id) -+{ -+ struct emc2103_data *data; -+ int status; -+ -+ if (!i2c_check_functionality(client->adapter, -+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) -+ return -EIO; -+ -+ data = kzalloc(sizeof(struct emc2103_data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ i2c_set_clientdata(client, data); -+ mutex_init(&data->update_lock); -+ -+ /* 2103-2 and 2103-4 have 3 external diodes, 2103-1 has 1 */ -+ status = i2c_smbus_read_byte_data(client, REG_PRODUCT_ID); -+ data->have_temp3 = (status == 0x26); -+ -+ /* check if the device is already in RPM control mode */ -+ status = i2c_smbus_read_byte_data(client, REG_FAN_CONF1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", -+ REG_FAN_CONF1, status); -+ return -EIO; -+ } -+ data->fan_rpm_control = (status & 0x80); -+ -+ if (data->have_temp3) { -+ /* Configure anti-parallel diode mode */ -+ data->have_temp4 = apd; -+ status = i2c_smbus_read_byte_data(client, REG_CONF1); -+ if (status < 0) { -+ dev_dbg(&client->dev, "reg 0x%02x, err %d\n", REG_CONF1, -+ status); -+ return -EIO; -+ } -+ -+ if (data->have_temp4) -+ status |= 0x01; -+ else -+ status &= ~(0x01); -+ -+ i2c_smbus_write_byte_data(client, REG_CONF1, status & 0xff); -+ } -+ -+ /* Register sysfs hooks */ -+ status = sysfs_create_group(&client->dev.kobj, &emc2103_group); -+ if (status) -+ goto exit_free; -+ -+ if (data->have_temp3) { -+ status = sysfs_create_group(&client->dev.kobj, -+ &emc2103_temp3_group); -+ if (status) -+ goto exit_remove; -+ } -+ -+ if (data->have_temp4) { -+ status = sysfs_create_group(&client->dev.kobj, -+ &emc2103_temp4_group); -+ if (status) -+ goto exit_remove_temp3; -+ } -+ -+ data->hwmon_dev = hwmon_device_register(&client->dev); -+ if (IS_ERR(data->hwmon_dev)) { -+ status = PTR_ERR(data->hwmon_dev); -+ goto exit_remove_temp4; -+ } -+ -+ dev_info(&client->dev, "%s: sensor '%s'\n", -+ dev_name(data->hwmon_dev), client->name); -+ -+ return 0; -+ -+exit_remove_temp4: -+ if (data->have_temp4) -+ sysfs_remove_group(&client->dev.kobj, &emc2103_temp4_group); -+exit_remove_temp3: -+ if (data->have_temp3) -+ sysfs_remove_group(&client->dev.kobj, &emc2103_temp3_group); -+exit_remove: -+ sysfs_remove_group(&client->dev.kobj, &emc2103_group); -+exit_free: -+ i2c_set_clientdata(client, NULL); -+ kfree(data); -+ return status; -+} -+ -+static int emc2103_remove(struct i2c_client *client) -+{ -+ struct emc2103_data *data = i2c_get_clientdata(client); -+ -+ hwmon_device_unregister(data->hwmon_dev); -+ -+ if (data->have_temp4) -+ sysfs_remove_group(&client->dev.kobj, &emc2103_temp4_group); -+ -+ if (data->have_temp3) -+ sysfs_remove_group(&client->dev.kobj, &emc2103_temp3_group); -+ -+ sysfs_remove_group(&client->dev.kobj, &emc2103_group); -+ -+ i2c_set_clientdata(client, NULL); -+ kfree(data); -+ return 0; -+} -+ -+static const struct i2c_device_id emc2103_ids[] = { -+ { "emc2103", 0, }, -+ { /* LIST END */ } -+}; -+MODULE_DEVICE_TABLE(i2c, emc2103_ids); -+ -+/* Return 0 if detection is successful, -ENODEV otherwise */ -+static int -+emc2103_detect(struct i2c_client *new_client, struct i2c_board_info *info) -+{ -+ struct i2c_adapter *adapter = new_client->adapter; -+ int manufacturer, product; -+ -+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) -+ return -ENODEV; -+ -+ manufacturer = i2c_smbus_read_byte_data(new_client, REG_MFG_ID); -+ if (manufacturer != 0x5D) -+ return -ENODEV; -+ -+ product = i2c_smbus_read_byte_data(new_client, REG_PRODUCT_ID); -+ if ((product != 0x24) && (product != 0x26)) -+ return -ENODEV; -+ -+ strlcpy(info->type, "emc2103", I2C_NAME_SIZE); -+ -+ return 0; -+} -+ -+static struct i2c_driver emc2103_driver = { -+ .class = I2C_CLASS_HWMON, -+ .driver = { -+ .name = "emc2103", -+ }, -+ .probe = emc2103_probe, -+ .remove = emc2103_remove, -+ .id_table = emc2103_ids, -+ .detect = emc2103_detect, -+ .address_list = normal_i2c, -+}; -+ -+static int __init sensors_emc2103_init(void) -+{ -+ return i2c_add_driver(&emc2103_driver); -+} -+ -+static void __exit sensors_emc2103_exit(void) -+{ -+ i2c_del_driver(&emc2103_driver); -+} -+ -+MODULE_AUTHOR("Steve Glendinning <steve.glendinning@smsc.com>"); -+MODULE_DESCRIPTION("SMSC EMCxxxx hwmon driver"); -+MODULE_LICENSE("GPL"); -+ -+module_init(sensors_emc2103_init); -+module_exit(sensors_emc2103_exit); @@ -12,53 +12,14 @@ gregkh/gkh-version.patch ################################# # TTY patches for 2.6.35 ################################# -tty.current/serial-cpm_uart-implement-the-cpm_uart_early_write-function-for-console-poll.patch ################################# # USB patches for 2.6.35 ################################# -usb.current/usb-g_serial-don-t-set-low_latency-flag.patch -usb.current/usb-g_serial-fix-tty-cleanup-on-unload.patch -usb.current/usb-gadget-g_fs-possible-invalid-pointer-reference-bug-fixed.patch -usb.current/usb-xhci-fix-bug-in-link-trb-activation-change.patch -usb.current/usb-r8a66597-fix-failure-in-change-of-status.patch -usb.current/usb-musb-fix-a-bug-by-making-suspend-interrupt-available-in-device-mode.patch -usb.current/usb-otg-ulpi-bail-out-on-read-errors.patch -usb.current/usb-ehci-mxc-bail-out-on-transceiver-problems.patch -usb.current/usb-s3c2410-deactivate-endpoints-before-gadget-unbinding.patch -usb.current/usb-fix-oops-in-usb_sg_init.patch -usb.current/usb-serial-ftdi-correct-merge-conflict-with-contec-id.patch -usb.current/usb-isp1362-hcd-fix-double-lock.patch -usb.current/usb-gadget-printer-fix-sleep-inside-atomic.patch -usb.current/usb-qcserial-fix-a-memory-leak-in-qcprobe-error-path.patch -usb.current/usb-gadget-eth-fix-calculate-crc32-in-eem.patch -usb.current/usb-obey-the-sysfs-power-wakeup-setting.patch -usb.current/usb-musb_core-make-disconnect-and-suspend-interrupts-work-again.patch -usb.current/usb-musb-make-non-omap-platforms-build-with-config_pm-y.patch -usb.current/usb-musb-fix-blackfin-ulpi-stubs.patch -usb.current/usb-musb-enable-the-maximum-supported-burst-mode-for-dma.patch -usb.current/usb-gadget-f_mass_storage-fixed-fs-descriptors-not-being-updated.patch -usb.current/usb-gadget-f_mass_storage-stale-common-fsg-value-bug-fix.patch ################################# # Staging patches for 2.6.35 ################################# -staging.current/staging-usbip-usbip_common-kill-rx-thread-on-tx-thread-creation-error.patch -staging.current/staging-batman-adv-return-efault-on-copy_to_user-errors.patch -staging.current/staging-batman-adv-fix-function-prototype.patch -staging.current/staging-mrst-touchscreen-fix-dereferencing-free-memory.patch -staging.current/staging-comedi-drivers-adl_pci9111-fix-ai-commands-in-trig_follow-case.patch -staging.current/staging-hv-fix-race-condition-on-vmbus-channel-initialization.patch -staging.current/staging-hv-fix-hv_utils-module-to-properly-autoload.patch -staging.current/staging-wlags49_h2-add-missing-linux-string.h-for-strlen.patch -staging.current/staging-wlags49_h2-fix-build-error-when-config_sysfs-is-not-set.patch -staging.current/staging-rtl8187se-fix-compile-warnings-in-2.6.35-rc2.patch -staging.current/staging-rtl8192su-remove-device-ids.patch -staging.current/staging-rtl8192su-add-device-ids.patch -staging.current/staging-comedi-fix-read-past-end-of-array-in-cb_pcidda_attach.patch -staging.current/staging-rt2870-add-device-id-for-zyxel-nwd-270n.patch -staging.current/staging-rtl8192s_usb-remove-duplicate-device-id.patch -staging.current/staging-rtl8192u_usb-add-lg-device-id-043e-7a01.patch ##################################################################### # Stuff to be merged after 2.6.35 is out @@ -67,7 +28,6 @@ staging.current/staging-rtl8192u_usb-add-lg-device-id-043e-7a01.patch ############################################# # Driver core patches for after 2.6.35 is out ############################################# -driver-core/hwmon-add-driver-for-smsc-emc2103-temperature-monitor-and-fan-controller.patch driver-core/uio-remove-irqf_disabled-flag-from-uio_pdrv_genirq.c.patch driver-core/uio-remove-irqf_disabled-from-uio_sercos3.c.patch driver-core/uio-remove-irqf_disabled-flag-from-uio_cif.c.patch diff --git a/staging.current/staging-batman-adv-fix-function-prototype.patch b/staging.current/staging-batman-adv-fix-function-prototype.patch deleted file mode 100644 index 24b18e1e8d2acb..00000000000000 --- a/staging.current/staging-batman-adv-fix-function-prototype.patch +++ /dev/null @@ -1,79 +0,0 @@ -From sven.eckelmann@gmx.de Mon Jun 14 15:50:02 2010 -From: Sven Eckelmann <sven.eckelmann@gmx.de> -Date: Sun, 6 Jun 2010 21:03:05 +0200 -Subject: Staging: batman-adv: fix function prototype -To: gregkh@suse.de, b.a.t.m.a.n@lists.open-mesh.net -Cc: Javier Martinez Canillas <martinez.javier@gmail.com>, Sven Eckelmann <sven.eckelmann@gmx.de> -Message-ID: <1275850985-27105-3-git-send-email-sven.eckelmann@gmx.de> - - -From: Javier Martinez Canillas <martinez.javier@gmail.com> - -In today linux-next I got a compile warning in staging/batman-adv. - -This is due a struct bin_attribute read function prototype change and the driver was not updated. - -This patch solves the issue - -Signed-off-by: Javier Martinez Canillas <martinez.javier@gmail.com> -Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/batman-adv/bat_sysfs.c | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - ---- a/drivers/staging/batman-adv/bat_sysfs.c -+++ b/drivers/staging/batman-adv/bat_sysfs.c -@@ -225,9 +225,9 @@ static struct bat_attribute *mesh_attrs[ - NULL, - }; - --static ssize_t transtable_local_read(struct kobject *kobj, -- struct bin_attribute *bin_attr, -- char *buff, loff_t off, size_t count) -+static ssize_t transtable_local_read(struct file *filp, struct kobject *kobj, -+ struct bin_attribute *bin_attr, -+ char *buff, loff_t off, size_t count) - { - struct device *dev = to_dev(kobj->parent); - struct net_device *net_dev = to_net_dev(dev); -@@ -235,9 +235,9 @@ static ssize_t transtable_local_read(str - return hna_local_fill_buffer_text(net_dev, buff, count, off); - } - --static ssize_t transtable_global_read(struct kobject *kobj, -- struct bin_attribute *bin_attr, -- char *buff, loff_t off, size_t count) -+static ssize_t transtable_global_read(struct file *filp, struct kobject *kobj, -+ struct bin_attribute *bin_attr, -+ char *buff, loff_t off, size_t count) - { - struct device *dev = to_dev(kobj->parent); - struct net_device *net_dev = to_net_dev(dev); -@@ -245,9 +245,9 @@ static ssize_t transtable_global_read(st - return hna_global_fill_buffer_text(net_dev, buff, count, off); - } - --static ssize_t originators_read(struct kobject *kobj, -- struct bin_attribute *bin_attr, -- char *buff, loff_t off, size_t count) -+static ssize_t originators_read(struct file *filp, struct kobject *kobj, -+ struct bin_attribute *bin_attr, -+ char *buff, loff_t off, size_t count) - { - struct device *dev = to_dev(kobj->parent); - struct net_device *net_dev = to_net_dev(dev); -@@ -255,9 +255,9 @@ static ssize_t originators_read(struct k - return orig_fill_buffer_text(net_dev, buff, count, off); - } - --static ssize_t vis_data_read(struct kobject *kobj, -- struct bin_attribute *bin_attr, -- char *buff, loff_t off, size_t count) -+static ssize_t vis_data_read(struct file *filp, struct kobject *kobj, -+ struct bin_attribute *bin_attr, -+ char *buff, loff_t off, size_t count) - { - struct device *dev = to_dev(kobj->parent); - struct net_device *net_dev = to_net_dev(dev); diff --git a/staging.current/staging-batman-adv-return-efault-on-copy_to_user-errors.patch b/staging.current/staging-batman-adv-return-efault-on-copy_to_user-errors.patch deleted file mode 100644 index 1b9eb25e427748..00000000000000 --- a/staging.current/staging-batman-adv-return-efault-on-copy_to_user-errors.patch +++ /dev/null @@ -1,33 +0,0 @@ -From sven.eckelmann@gmx.de Mon Jun 14 15:49:49 2010 -From: Sven Eckelmann <sven.eckelmann@gmx.de> -Date: Sun, 6 Jun 2010 21:03:04 +0200 -Subject: Staging: batman-adv: return -EFAULT on copy_to_user errors -To: gregkh@suse.de, b.a.t.m.a.n@lists.open-mesh.net -Cc: Dan Carpenter <error27@gmail.com>, Sven Eckelmann <sven.eckelmann@gmx.de> -Message-ID: <1275850985-27105-2-git-send-email-sven.eckelmann@gmx.de> - - -From: Dan Carpenter <error27@gmail.com> - -copy_to_user() returns the number of bites remaining but we want to -return a negative error code here. - -Signed-off-by: Dan Carpenter <error27@gmail.com> -Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/batman-adv/device.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/staging/batman-adv/device.c -+++ b/drivers/staging/batman-adv/device.c -@@ -196,7 +196,7 @@ ssize_t bat_device_read(struct file *fil - kfree(device_packet); - - if (error) -- return error; -+ return -EFAULT; - - return sizeof(struct icmp_packet); - } diff --git a/staging.current/staging-comedi-drivers-adl_pci9111-fix-ai-commands-in-trig_follow-case.patch b/staging.current/staging-comedi-drivers-adl_pci9111-fix-ai-commands-in-trig_follow-case.patch deleted file mode 100644 index b07c9c5e09ec8d..00000000000000 --- a/staging.current/staging-comedi-drivers-adl_pci9111-fix-ai-commands-in-trig_follow-case.patch +++ /dev/null @@ -1,53 +0,0 @@ -From abbotti@mev.co.uk Fri Jun 18 08:50:02 2010 -From: Ian Abbott <abbotti@mev.co.uk> -Date: Fri, 18 Jun 2010 12:11:28 +0100 -Subject: Staging: comedi: drivers: adl_pci9111: Fix AI commands in TRIG_FOLLOW case -Cc: Frank Mori Hess <fmhess@users.sourceforge.net>, Ian Abbott <abbotti@mev.co.uk>, Greg Kroah-Hartman <gregkh@suse.de> -Message-ID: <1276859488-10456-1-git-send-email-abbotti@mev.co.uk> - - -From: Ian Abbott <abbotti@mev.co.uk> - -I received a report that AI streaming acquisitions do not work properly -for the adl_pci9111 driver when convert_src is TRIG_TIMER and -scan_begin_src is TRIG_FOLLOW (and scan_begin_arg is therefore 0). This -seems to be down to the incorrect setting of dev_private->scan_delay in -pci9111_ai_do_cmd(). Under the previously stated conditions, -dev_private->scan_delay ends up set to (unsigned int)-1, but it ought to -be set to 0. The function sets it to 0 initially, and it only makes -sense to change it if both convert_src and scan_begin_src are set to -TRIG_TIMER. - -Note: 'scan_delay' is the number of unwanted scans to discard after each -valid scan. The hardware does not support 'scan' timing as such, just a -regularly paced conversion timer (with automatic channel switching -between conversions). The driver simulates a scan period that is some -(>1) multiple of the conversion period times the scan length -(chanlist_len samples) by reading chanlist_len samples and discarding -the next scan_delay times chanlist_len samples. - -Signed-off-by: Ian Abbott <abbotti@mev.co.uk> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/comedi/drivers/adl_pci9111.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/drivers/staging/comedi/drivers/adl_pci9111.c -+++ b/drivers/staging/comedi/drivers/adl_pci9111.c -@@ -824,9 +824,12 @@ static int pci9111_ai_do_cmd(struct come - plx9050_interrupt_control(dev_private->lcr_io_base, true, true, - false, true, true); - -- dev_private->scan_delay = -- (async_cmd->scan_begin_arg / (async_cmd->convert_arg * -- async_cmd->chanlist_len)) - 1; -+ if (async_cmd->scan_begin_src == TRIG_TIMER) { -+ dev_private->scan_delay = -+ (async_cmd->scan_begin_arg / -+ (async_cmd->convert_arg * -+ async_cmd->chanlist_len)) - 1; -+ } - - break; - diff --git a/staging.current/staging-comedi-fix-read-past-end-of-array-in-cb_pcidda_attach.patch b/staging.current/staging-comedi-fix-read-past-end-of-array-in-cb_pcidda_attach.patch deleted file mode 100644 index 6a85df35b12e11..00000000000000 --- a/staging.current/staging-comedi-fix-read-past-end-of-array-in-cb_pcidda_attach.patch +++ /dev/null @@ -1,40 +0,0 @@ -From error27@gmail.com Tue Jun 22 15:34:56 2010 -From: Dan Carpenter <error27@gmail.com> -Date: Mon, 21 Jun 2010 08:49:25 +0200 -Subject: Staging: comedi: fix read past end of array in cb_pcidda_attach() -To: Greg Kroah-Hartman <gregkh@suse.de> -Cc: devel@driverdev.osuosl.org, Dirk Hohndel <hohndel@infradead.org>, Jiri Kosina <jkosina@suse.cz>, kernel-janitors@vger.kernel.org, Andrea Gelmini <andrea.gelmini@gelma.net> -Message-ID: <20100621064924.GC5940@bicker> -Content-Disposition: inline - - -There are only 6 elements in the cb_pcidda_boards[] array so the -original code read past the end. After this change nothing uses N_BOARDS -so I removed the definition. - -Signed-off-by: Dan Carpenter <error27@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/comedi/drivers/cb_pcidda.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/drivers/staging/comedi/drivers/cb_pcidda.c -+++ b/drivers/staging/comedi/drivers/cb_pcidda.c -@@ -52,7 +52,6 @@ Please report success/failure with other - #include "8255.h" - - #define PCI_VENDOR_ID_CB 0x1307 /* PCI vendor number of ComputerBoards */ --#define N_BOARDS 10 /* Number of boards in cb_pcidda_boards */ - #define EEPROM_SIZE 128 /* number of entries in eeprom */ - #define MAX_AO_CHANNELS 8 /* maximum number of ao channels for supported boards */ - -@@ -307,7 +306,7 @@ static int cb_pcidda_attach(struct comed - continue; - } - } -- for (index = 0; index < N_BOARDS; index++) { -+ for (index = 0; index < ARRAY_SIZE(cb_pcidda_boards); index++) { - if (cb_pcidda_boards[index].device_id == - pcidev->device) { - goto found; diff --git a/staging.current/staging-hv-fix-hv_utils-module-to-properly-autoload.patch b/staging.current/staging-hv-fix-hv_utils-module-to-properly-autoload.patch deleted file mode 100644 index 8b2b8631208b4f..00000000000000 --- a/staging.current/staging-hv-fix-hv_utils-module-to-properly-autoload.patch +++ /dev/null @@ -1,70 +0,0 @@ -From haiyangz@microsoft.com Wed May 19 08:56:34 2010 -From: Haiyang Zhang <haiyangz@microsoft.com> -Date: Wed, 19 May 2010 15:56:28 +0000 -Subject: Staging: hv: fix hv_utils module to properly autoload -To: "'linux-kernel@vger.kernel.org'" <linux-kernel@vger.kernel.org>, "'devel@driverdev.osuosl.org'" <devel@driverdev.osuosl.org>, "'virtualization@lists.osdl.org'" <virtualization@lists.osdl.org>, "'gregkh@suse.de'" <gregkh@suse.de> -Cc: Hank Janssen <hjanssen@microsoft.com> -Message-ID: <1FB5E1D5CA062146B38059374562DF7266B8931E@TK5EX14MBXC128.redmond.corp.microsoft.com> - - -From: Haiyang Zhang <haiyangz@microsoft.com> - -Added autoloading based on pci id and dmi strings. - -Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> -Signed-off-by: Hank Janssen <hjanssen@microsoft.com> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/hv/hv_utils.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - ---- a/drivers/staging/hv/hv_utils.c -+++ b/drivers/staging/hv/hv_utils.c -@@ -24,6 +24,8 @@ - #include <linux/slab.h> - #include <linux/sysctl.h> - #include <linux/reboot.h> -+#include <linux/dmi.h> -+#include <linux/pci.h> - - #include "logging.h" - #include "osd.h" -@@ -251,10 +253,36 @@ static void heartbeat_onchannelcallback( - DPRINT_EXIT(VMBUS); - } - -+static const struct pci_device_id __initconst -+hv_utils_pci_table[] __maybe_unused = { -+ { PCI_DEVICE(0x1414, 0x5353) }, /* Hyper-V emulated VGA controller */ -+ { 0 } -+}; -+MODULE_DEVICE_TABLE(pci, hv_utils_pci_table); -+ -+ -+static const struct dmi_system_id __initconst -+hv_utils_dmi_table[] __maybe_unused = { -+ { -+ .ident = "Hyper-V", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), -+ DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"), -+ }, -+ }, -+ { }, -+}; -+MODULE_DEVICE_TABLE(dmi, hv_utils_dmi_table); -+ -+ - static int __init init_hyperv_utils(void) - { - printk(KERN_INFO "Registering HyperV Utility Driver\n"); - -+ if (!dmi_check_system(hv_utils_dmi_table)) -+ return -ENODEV; -+ - hv_cb_utils[HV_SHUTDOWN_MSG].channel->OnChannelCallback = - &shutdown_onchannelcallback; - hv_cb_utils[HV_SHUTDOWN_MSG].callback = &shutdown_onchannelcallback; diff --git a/staging.current/staging-hv-fix-race-condition-on-vmbus-channel-initialization.patch b/staging.current/staging-hv-fix-race-condition-on-vmbus-channel-initialization.patch deleted file mode 100644 index 5778dfd466ad6d..00000000000000 --- a/staging.current/staging-hv-fix-race-condition-on-vmbus-channel-initialization.patch +++ /dev/null @@ -1,123 +0,0 @@ -From haiyangz@microsoft.com Fri May 28 16:22:49 2010 -From: Haiyang Zhang <haiyangz@microsoft.com> -Date: Fri, 28 May 2010 23:22:44 +0000 -Subject: Staging: hv: Fix race condition on vmbus channel initialization -Cc: Hank Janssen <hjanssen@microsoft.com> -Message-ID: <1FB5E1D5CA062146B38059374562DF7266B8D340@TK5EX14MBXC128.redmond.corp.microsoft.com> - -From: Haiyang Zhang <haiyangz@microsoft.com> - -Subject: [PATCH] staging: hv: Fix race condition on vmbus channel initialization -There is a possible race condition when hv_utils starts to load immediately -after hv_vmbus is loading - null pointer error could happen. -This patch added wait/completion to ensure all channels are ready before -vmbus loading completes. So another module won't have any uninitialized channel. - -Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> -Signed-off-by: Hank Janssen <hjanssen@microsoft.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - - ---- - drivers/staging/hv/channel_mgmt.c | 41 +++++++++++++++++++++++++++----------- - drivers/staging/hv/vmbus.h | 2 + - drivers/staging/hv/vmbus_drv.c | 3 ++ - 3 files changed, 35 insertions(+), 11 deletions(-) - ---- a/drivers/staging/hv/channel_mgmt.c -+++ b/drivers/staging/hv/channel_mgmt.c -@@ -23,6 +23,7 @@ - #include <linux/slab.h> - #include <linux/list.h> - #include <linux/module.h> -+#include <linux/completion.h> - #include "osd.h" - #include "logging.h" - #include "vmbus_private.h" -@@ -293,6 +294,25 @@ void FreeVmbusChannel(struct vmbus_chann - Channel); - } - -+ -+DECLARE_COMPLETION(hv_channel_ready); -+ -+/* -+ * Count initialized channels, and ensure all channels are ready when hv_vmbus -+ * module loading completes. -+ */ -+static void count_hv_channel(void) -+{ -+ static int counter; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags); -+ if (++counter == MAX_MSG_TYPES) -+ complete(&hv_channel_ready); -+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags); -+} -+ -+ - /* - * VmbusChannelProcessOffer - Process the offer by creating a channel/device - * associated with this offer -@@ -373,22 +393,21 @@ static void VmbusChannelProcessOffer(voi - * can cleanup properly - */ - newChannel->State = CHANNEL_OPEN_STATE; -- cnt = 0; - -- while (cnt != MAX_MSG_TYPES) { -+ /* Open IC channels */ -+ for (cnt = 0; cnt < MAX_MSG_TYPES; cnt++) { - if (memcmp(&newChannel->OfferMsg.Offer.InterfaceType, - &hv_cb_utils[cnt].data, -- sizeof(struct hv_guid)) == 0) { -+ sizeof(struct hv_guid)) == 0 && -+ VmbusChannelOpen(newChannel, 2 * PAGE_SIZE, -+ 2 * PAGE_SIZE, NULL, 0, -+ hv_cb_utils[cnt].callback, -+ newChannel) == 0) { -+ hv_cb_utils[cnt].channel = newChannel; - DPRINT_INFO(VMBUS, "%s", -- hv_cb_utils[cnt].log_msg); -- -- if (VmbusChannelOpen(newChannel, 2 * PAGE_SIZE, -- 2 * PAGE_SIZE, NULL, 0, -- hv_cb_utils[cnt].callback, -- newChannel) == 0) -- hv_cb_utils[cnt].channel = newChannel; -+ hv_cb_utils[cnt].log_msg); -+ count_hv_channel(); - } -- cnt++; - } - } - DPRINT_EXIT(VMBUS); ---- a/drivers/staging/hv/vmbus.h -+++ b/drivers/staging/hv/vmbus.h -@@ -74,4 +74,6 @@ int vmbus_child_driver_register(struct d - void vmbus_child_driver_unregister(struct driver_context *driver_ctx); - void vmbus_get_interface(struct vmbus_channel_interface *interface); - -+extern struct completion hv_channel_ready; -+ - #endif /* _VMBUS_H_ */ ---- a/drivers/staging/hv/vmbus_drv.c -+++ b/drivers/staging/hv/vmbus_drv.c -@@ -27,6 +27,7 @@ - #include <linux/pci.h> - #include <linux/dmi.h> - #include <linux/slab.h> -+#include <linux/completion.h> - #include "version_info.h" - #include "osd.h" - #include "logging.h" -@@ -356,6 +357,8 @@ static int vmbus_bus_init(int (*drv_init - - vmbus_drv_obj->GetChannelOffers(); - -+ wait_for_completion(&hv_channel_ready); -+ - cleanup: - DPRINT_EXIT(VMBUS_DRV); - diff --git a/staging.current/staging-mrst-touchscreen-fix-dereferencing-free-memory.patch b/staging.current/staging-mrst-touchscreen-fix-dereferencing-free-memory.patch deleted file mode 100644 index 006982d77bca0b..00000000000000 --- a/staging.current/staging-mrst-touchscreen-fix-dereferencing-free-memory.patch +++ /dev/null @@ -1,33 +0,0 @@ -From error27@gmail.com Mon Jun 14 15:51:12 2010 -From: Dan Carpenter <error27@gmail.com> -Date: Sat, 5 Jun 2010 19:16:42 +0200 -Subject: Staging: mrst-touchscreen: fix dereferencing free memory -To: Greg Kroah-Hartman <gregkh@suse.de> -Cc: devel@driverdev.osuosl.org, kernel-janitors@vger.kernel.org, Alan Cox <alan@linux.intel.com> -Message-ID: <20100605171642.GM5483@bicker> -Content-Disposition: inline - - -I moved the kfree() down a couple lines after the dereference. - -Signed-off-by: Dan Carpenter <error27@gmail.com> -Acked-by: Alan Cox <alan@linux.intel.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/mrst-touchscreen/intel-mid-touch.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/staging/mrst-touchscreen/intel-mid-touch.c -+++ b/drivers/staging/mrst-touchscreen/intel-mid-touch.c -@@ -817,9 +817,9 @@ static int mrstouch_remove(struct spi_de - free_irq(mrstouchdevp->irq, mrstouchdevp); - input_unregister_device(mrstouchdevp->input); - input_free_device(mrstouchdevp->input); -- kfree(mrstouchdevp); - if (mrstouchdevp->pendet_thrd) - kthread_stop(mrstouchdevp->pendet_thrd); -+ kfree(mrstouchdevp); - return 0; - } - diff --git a/staging.current/staging-rt2870-add-device-id-for-zyxel-nwd-270n.patch b/staging.current/staging-rt2870-add-device-id-for-zyxel-nwd-270n.patch deleted file mode 100644 index 78dd5a38aaf03b..00000000000000 --- a/staging.current/staging-rt2870-add-device-id-for-zyxel-nwd-270n.patch +++ /dev/null @@ -1,28 +0,0 @@ -From ozan@pardus.org.tr Tue Jun 22 15:35:20 2010 -From: Ozan ÇaÄŸlayan <ozan@pardus.org.tr> -Date: Mon, 21 Jun 2010 14:00:56 +0300 -Subject: Staging: rt2870: add device id for Zyxel NWD-270N -To: linux-kernel@vger.kernel.org -Cc: gregkh@suse.de -Message-ID: <1277118056-21367-1-git-send-email-ozan@pardus.org.tr> - - -Add device id for Zyxel NWD-270N USB dongle. - -Signed-off-by: Ozan ÇaÄŸlayan <ozan@pardus.org.tr> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rt2860/usb_main_dev.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/staging/rt2860/usb_main_dev.c -+++ b/drivers/staging/rt2860/usb_main_dev.c -@@ -77,6 +77,7 @@ struct usb_device_id rtusb_usb_id[] = { - {USB_DEVICE(0x083A, 0x7522)}, /* Arcadyan */ - {USB_DEVICE(0x0CDE, 0x0022)}, /* ZCOM */ - {USB_DEVICE(0x0586, 0x3416)}, /* Zyxel */ -+ {USB_DEVICE(0x0586, 0x341a)}, /* Zyxel NWD-270N */ - {USB_DEVICE(0x0CDE, 0x0025)}, /* Zyxel */ - {USB_DEVICE(0x1740, 0x9701)}, /* EnGenius */ - {USB_DEVICE(0x1740, 0x9702)}, /* EnGenius */ diff --git a/staging.current/staging-rtl8187se-fix-compile-warnings-in-2.6.35-rc2.patch b/staging.current/staging-rtl8187se-fix-compile-warnings-in-2.6.35-rc2.patch deleted file mode 100644 index 5310c89d3883c3..00000000000000 --- a/staging.current/staging-rtl8187se-fix-compile-warnings-in-2.6.35-rc2.patch +++ /dev/null @@ -1,41 +0,0 @@ -From Larry.Finger@lwfinger.net Mon Jun 7 10:00:31 2010 -From: Larry Finger <Larry.Finger@lwfinger.net> -Date: Mon, 07 Jun 2010 12:00:44 -0500 -Subject: Staging: rtl8187se: Fix compile warnings in 2.6.35-rc2 -To: Greg Kroah-Hartman <gregkh@suse.de> -Cc: linux-kernel@vger.kernel.org -Message-ID: <4c0d25bc.kKU10fWqlRtt6mUb%Larry.Finger@lwfinger.net> - - -In commit bbfb5652, the spacing in the definitions of eqMacAddr and cpMacAddr -in drivers/staging/rtl8187se/r8180_core.c were changed to conform to kernel -standards. These definitions were duplicates of lines found in -drivers/staging/rtl8187se/ieee80211/dot11d.h. Once the change was made, the -following warnings were emitted: - - CC [M] drivers/staging/rtl8187se/r8180_core.o -drivers/staging/rtl8187se/r8180_core.c:69:0: warning: "eqMacAddr" redefined -drivers/staging/rtl8187se/ieee80211/dot11d.h:39:0: note: this is the location of the previous definition -drivers/staging/rtl8187se/r8180_core.c:70:0: warning: "cpMacAddr" redefined -drivers/staging/rtl8187se/ieee80211/dot11d.h:40:0: note: this is the location of the previous definition - -The fix is to keep only the difinition in the header file. - -Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rtl8187se/r8180_core.c | 2 -- - 1 file changed, 2 deletions(-) - ---- a/drivers/staging/rtl8187se/r8180_core.c -+++ b/drivers/staging/rtl8187se/r8180_core.c -@@ -66,8 +66,6 @@ static int hwseqnum = 0; - static int hwwep = 0; - static int channels = 0x3fff; - --#define eqMacAddr(a, b) (((a)[0] == (b)[0] && (a)[1] == (b)[1] && (a)[2] == (b)[2] && (a)[3] == (b)[3] && (a)[4] == (b)[4] && (a)[5] == (b)[5]) ? 1 : 0) --#define cpMacAddr(des, src) ((des)[0] = (src)[0], (des)[1] = (src)[1], (des)[2] = (src)[2], (des)[3] = (src)[3], (des)[4] = (src)[4], (des)[5] = (src)[5]) - MODULE_LICENSE("GPL"); - MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl); - MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>"); diff --git a/staging.current/staging-rtl8192s_usb-remove-duplicate-device-id.patch b/staging.current/staging-rtl8192s_usb-remove-duplicate-device-id.patch deleted file mode 100644 index 52fba2b037f6bf..00000000000000 --- a/staging.current/staging-rtl8192s_usb-remove-duplicate-device-id.patch +++ /dev/null @@ -1,26 +0,0 @@ -From ben@decadent.org.uk Thu Jun 24 17:35:06 2010 -From: Ben Hutchings <ben@decadent.org.uk> -Date: Fri, 25 Jun 2010 01:35:01 +0100 -Subject: Staging: rtl8192s_usb: Remove duplicate device ID -To: Greg KH <greg@kroah.com> -Cc: devel@driverdev.osuosl.org, Florian Schilhabel <florian.c.schilhabel@googlemail.com>, Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>, Guy Sheffer <guysoft@gmail.com> -Message-ID: <1277426101.26161.168.camel@localhost> - - -Signed-off-by: Ben Hutchings <ben@decadent.org.uk> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rtl8192su/r8192U_core.c | 1 - - 1 file changed, 1 deletion(-) - ---- a/drivers/staging/rtl8192su/r8192U_core.c -+++ b/drivers/staging/rtl8192su/r8192U_core.c -@@ -134,7 +134,6 @@ static const struct usb_device_id rtl819 - {USB_DEVICE(0x0E66, 0x0016)}, - {USB_DEVICE(0x0b05, 0x1786)}, - /* these are not in the official list */ -- {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ - {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ - {} - }; diff --git a/staging.current/staging-rtl8192su-add-device-ids.patch b/staging.current/staging-rtl8192su-add-device-ids.patch deleted file mode 100644 index 4b35a2bdf2961a..00000000000000 --- a/staging.current/staging-rtl8192su-add-device-ids.patch +++ /dev/null @@ -1,62 +0,0 @@ -From florian.c.schilhabel@googlemail.com Tue Jun 22 15:32:46 2010 -From: Florian Schilhabel <florian.c.schilhabel@googlemail.com> -Date: Tue, 8 Jun 2010 03:47:13 +0200 -Subject: Staging: rtl8192su: add device ids -To: greg@kroah.com -Message-ID: <20100608014713.GD13449@localhost.localdomain> -Content-Disposition: inline - - -This patch adds some device ids. -The list of supported devices was extracted from realteks driver package. -(0x050d, 0x815F) and (0x0df6, 0x004b) are not in the official list of -supported devices and may not work correctly. -In case of problems with these, they should probably be removed from the list. - -Signed-off-by: Florian Schilhabel <florian.c.schilhabel@googlemail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rtl8192su/r8192U_core.c | 30 +++++++++++++++++++++++------- - 1 file changed, 23 insertions(+), 7 deletions(-) - ---- a/drivers/staging/rtl8192su/r8192U_core.c -+++ b/drivers/staging/rtl8192su/r8192U_core.c -@@ -112,14 +112,30 @@ u32 rt_global_debug_component = \ - #define CAM_CONTENT_COUNT 8 - - static const struct usb_device_id rtl8192_usb_id_tbl[] = { -- /* Realtek */ -- {USB_DEVICE(0x0bda, 0x8171)}, -- {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ -- {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ -- /* Guillemot */ -- {USB_DEVICE(0x06f8, 0xe031)}, -- //92SU -+ {USB_DEVICE(0x0bda, 0x8171)}, /* Realtek */ - {USB_DEVICE(0x0bda, 0x8172)}, -+ {USB_DEVICE(0x0bda, 0x8173)}, -+ {USB_DEVICE(0x0bda, 0x8174)}, -+ {USB_DEVICE(0x0bda, 0x8712)}, -+ {USB_DEVICE(0x0bda, 0x8713)}, -+ {USB_DEVICE(0x07aa, 0x0047)}, -+ {USB_DEVICE(0x07d1, 0x3303)}, -+ {USB_DEVICE(0x07d1, 0x3302)}, -+ {USB_DEVICE(0x07d1, 0x3300)}, -+ {USB_DEVICE(0x1740, 0x9603)}, -+ {USB_DEVICE(0x1740, 0x9605)}, -+ {USB_DEVICE(0x050d, 0x815F)}, -+ {USB_DEVICE(0x06f8, 0xe031)}, -+ {USB_DEVICE(0x7392, 0x7611)}, -+ {USB_DEVICE(0x7392, 0x7612)}, -+ {USB_DEVICE(0x7392, 0x7622)}, -+ {USB_DEVICE(0x0DF6, 0x0045)}, -+ {USB_DEVICE(0x0E66, 0x0015)}, -+ {USB_DEVICE(0x0E66, 0x0016)}, -+ {USB_DEVICE(0x0b05, 0x1786)}, -+ /* these are not in the official list */ -+ {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ -+ {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ - {} - }; - diff --git a/staging.current/staging-rtl8192su-remove-device-ids.patch b/staging.current/staging-rtl8192su-remove-device-ids.patch deleted file mode 100644 index f975d0a16e6b25..00000000000000 --- a/staging.current/staging-rtl8192su-remove-device-ids.patch +++ /dev/null @@ -1,54 +0,0 @@ -From florian.c.schilhabel@googlemail.com Tue Jun 22 15:32:33 2010 -From: Florian Schilhabel <florian.c.schilhabel@googlemail.com> -Date: Tue, 8 Jun 2010 03:46:26 +0200 -Subject: Staging: rtl8192su: remove device ids -To: greg@kroah.com -Message-ID: <20100608014626.GC13449@localhost.localdomain> -Content-Disposition: inline - - -This patch removes some device-ids. -The list of unsupported devices was extracted from realteks driver package. -removed IDs are: -(0x0bda, 0x8192) -(0x0bda, 0x8709) -(0x07aa, 0x0043) -(0x050d, 0x805E) -(0x0df6, 0x0031) -(0x1740, 0x9201) -(0x2001, 0x3301) -(0x5a57, 0x0290) -These devices are _not_ rtl819su based. - -Signed-off-by: Florian Schilhabel <florian.c.schilhabel@googlemail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rtl8192su/r8192U_core.c | 14 -------------- - 1 file changed, 14 deletions(-) - ---- a/drivers/staging/rtl8192su/r8192U_core.c -+++ b/drivers/staging/rtl8192su/r8192U_core.c -@@ -114,22 +114,8 @@ u32 rt_global_debug_component = \ - static const struct usb_device_id rtl8192_usb_id_tbl[] = { - /* Realtek */ - {USB_DEVICE(0x0bda, 0x8171)}, -- {USB_DEVICE(0x0bda, 0x8192)}, -- {USB_DEVICE(0x0bda, 0x8709)}, -- /* Corega */ -- {USB_DEVICE(0x07aa, 0x0043)}, -- /* Belkin */ -- {USB_DEVICE(0x050d, 0x805E)}, - {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ -- /* Sitecom */ -- {USB_DEVICE(0x0df6, 0x0031)}, - {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ -- /* EnGenius */ -- {USB_DEVICE(0x1740, 0x9201)}, -- /* Dlink */ -- {USB_DEVICE(0x2001, 0x3301)}, -- /* Zinwell */ -- {USB_DEVICE(0x5a57, 0x0290)}, - /* Guillemot */ - {USB_DEVICE(0x06f8, 0xe031)}, - //92SU diff --git a/staging.current/staging-rtl8192u_usb-add-lg-device-id-043e-7a01.patch b/staging.current/staging-rtl8192u_usb-add-lg-device-id-043e-7a01.patch deleted file mode 100644 index 9b8749d1303f63..00000000000000 --- a/staging.current/staging-rtl8192u_usb-add-lg-device-id-043e-7a01.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ben@decadent.org.uk Thu Jun 24 17:35:53 2010 -From: Ben Hutchings <ben@decadent.org.uk> -Date: Fri, 25 Jun 2010 01:35:49 +0100 -Subject: Staging: rtl8192u_usb: Add LG device ID 043e:7a01 -To: Greg KH <greg@kroah.com> -Cc: devel@driverdev.osuosl.org, Florian Schilhabel <florian.c.schilhabel@googlemail.com>, Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>, Guy Sheffer <guysoft@gmail.com> -Message-ID: <1277426149.26161.169.camel@localhost> - - -Add another device ID as listed in the vendor driver version -0003.0825.2009. - -Signed-off-by: Ben Hutchings <ben@decadent.org.uk> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/rtl8192u/r8192U_core.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/staging/rtl8192u/r8192U_core.c -+++ b/drivers/staging/rtl8192u/r8192U_core.c -@@ -121,6 +121,8 @@ static const struct usb_device_id rtl819 - {USB_DEVICE(0x2001, 0x3301)}, - /* Zinwell */ - {USB_DEVICE(0x5a57, 0x0290)}, -+ /* LG */ -+ {USB_DEVICE(0x043e, 0x7a01)}, - {} - }; - diff --git a/staging.current/staging-usbip-usbip_common-kill-rx-thread-on-tx-thread-creation-error.patch b/staging.current/staging-usbip-usbip_common-kill-rx-thread-on-tx-thread-creation-error.patch deleted file mode 100644 index efb224d9d337a5..00000000000000 --- a/staging.current/staging-usbip-usbip_common-kill-rx-thread-on-tx-thread-creation-error.patch +++ /dev/null @@ -1,95 +0,0 @@ -From hschauhan@nulltrace.org Fri Jun 4 13:50:50 2010 -From: Himanshu Chauhan <hschauhan@nulltrace.org> -Date: Fri, 4 Jun 2010 23:16:27 +0530 -Subject: staging: usbip: usbip_common: kill rx thread on tx thread creation error. -To: greg@kroah.com -Cc: usbip-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org -Message-ID: <1275673587-1660-1-git-send-email-hschauhan@nulltrace.org> - - -Signed-off-by: Himanshu Chauhan <hschauhan@nulltrace.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- a/drivers/staging/usbip/usbip_common.c -+++ b/drivers/staging/usbip/usbip_common.c -@@ -378,47 +378,67 @@ int usbip_thread(void *param) - complete_and_exit(&ut->thread_done, 0); - } - -+static void stop_rx_thread(struct usbip_device *ud) -+{ -+ if (ud->tcp_rx.thread != NULL) { -+ send_sig(SIGKILL, ud->tcp_rx.thread, 1); -+ wait_for_completion(&ud->tcp_rx.thread_done); -+ usbip_udbg("rx_thread for ud %p has finished\n", ud); -+ } -+} -+ -+static void stop_tx_thread(struct usbip_device *ud) -+{ -+ if (ud->tcp_tx.thread != NULL) { -+ send_sig(SIGKILL, ud->tcp_tx.thread, 1); -+ wait_for_completion(&ud->tcp_tx.thread_done); -+ usbip_udbg("tx_thread for ud %p has finished\n", ud); -+ } -+} -+ - int usbip_start_threads(struct usbip_device *ud) - { - /* - * threads are invoked per one device (per one connection). - */ - struct task_struct *th; -+ int err = 0; - - th = kthread_run(usbip_thread, (void *)&ud->tcp_rx, "usbip"); - if (IS_ERR(th)) { - printk(KERN_WARNING - "Unable to start control thread\n"); -- return PTR_ERR(th); -+ err = PTR_ERR(th); -+ goto ust_exit; - } -+ - th = kthread_run(usbip_thread, (void *)&ud->tcp_tx, "usbip"); - if (IS_ERR(th)) { - printk(KERN_WARNING - "Unable to start control thread\n"); -- return PTR_ERR(th); -+ err = PTR_ERR(th); -+ goto tx_thread_err; - } - - /* confirm threads are starting */ - wait_for_completion(&ud->tcp_rx.thread_done); - wait_for_completion(&ud->tcp_tx.thread_done); -+ - return 0; -+ -+tx_thread_err: -+ stop_rx_thread(ud); -+ -+ust_exit: -+ return err; - } - EXPORT_SYMBOL_GPL(usbip_start_threads); - - void usbip_stop_threads(struct usbip_device *ud) - { - /* kill threads related to this sdev, if v.c. exists */ -- if (ud->tcp_rx.thread != NULL) { -- send_sig(SIGKILL, ud->tcp_rx.thread, 1); -- wait_for_completion(&ud->tcp_rx.thread_done); -- usbip_udbg("rx_thread for ud %p has finished\n", ud); -- } -- -- if (ud->tcp_tx.thread != NULL) { -- send_sig(SIGKILL, ud->tcp_tx.thread, 1); -- wait_for_completion(&ud->tcp_tx.thread_done); -- usbip_udbg("tx_thread for ud %p has finished\n", ud); -- } -+ stop_rx_thread(ud); -+ stop_tx_thread(ud); - } - EXPORT_SYMBOL_GPL(usbip_stop_threads); - diff --git a/staging.current/staging-wlags49_h2-add-missing-linux-string.h-for-strlen.patch b/staging.current/staging-wlags49_h2-add-missing-linux-string.h-for-strlen.patch deleted file mode 100644 index 144afa34ad7a99..00000000000000 --- a/staging.current/staging-wlags49_h2-add-missing-linux-string.h-for-strlen.patch +++ /dev/null @@ -1,29 +0,0 @@ -From jeffm@suse.com Fri Jun 18 17:07:06 2010 -From: Jeff Mahoney <jeffm@suse.com> -Date: Wed, 09 Jun 2010 16:01:10 -0400 -Subject: Staging: wlags49_h2: add missing <linux/string.h> for strlen -To: Greg KH <gregkh@suse.de> -Message-ID: <4C0FF306.9030605@suse.com> - - - -On ia64, the build fails with incompatible implicit definition of strlen. -This patch adds the <linux/string.h> include to get the real prototype. - -Signed-off-by: Jeff Mahoney <jeffm@suse.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/wlags49_h2/wl_enc.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/staging/wlags49_h2/wl_enc.c -+++ b/drivers/staging/wlags49_h2/wl_enc.c -@@ -62,6 +62,7 @@ - /******************************************************************************* - * include files - ******************************************************************************/ -+#include <linux/string.h> - #include <wl_version.h> - - #include <debug.h> diff --git a/staging.current/staging-wlags49_h2-fix-build-error-when-config_sysfs-is-not-set.patch b/staging.current/staging-wlags49_h2-fix-build-error-when-config_sysfs-is-not-set.patch deleted file mode 100644 index 681ee5b9726e35..00000000000000 --- a/staging.current/staging-wlags49_h2-fix-build-error-when-config_sysfs-is-not-set.patch +++ /dev/null @@ -1,38 +0,0 @@ -From martinez.javier@gmail.com Fri Jun 18 17:08:42 2010 -From: Javier Martinez Canillas <martinez.javier@gmail.com> -Date: Thu, 17 Jun 2010 01:17:44 -0400 -Subject: Staging: wlags49_h2: Fix build error when CONFIG_SYSFS is not set -To: Henk de Groot <pe1dnn@amsat.org>, devel@driverdev.osuosl.org, Greg Kroah-Hartman <gregkh@suse.de>, kernel-janitors <kernel-janitors@vger.kernel.org> -Message-ID: <1276751864.14632.6.camel@lenovo> - -I got a wlags49_h2 driver build error in linux-next when CONFIG_SYSFS is not set. - -CC [M] drivers/staging/wlags49_h2/wl_cs.o -In file included from drivers/staging/wlags49_h2/wl_cs.c:104: -drivers/staging/wlags49_h2/wl_sysfs.h: In function ‘register_wlags_sysfs’: -drivers/staging/wlags49_h2/wl_sysfs.h:5: error: parameter name omitted -drivers/staging/wlags49_h2/wl_sysfs.h: In function ‘unregister_wlags_sysfs’: -drivers/staging/wlags49_h2/wl_sysfs.h:6: error: parameter name omitted -make[1]: *** [drivers/staging/wlags49_h2/wl_cs.o] Error 1 -make: *** [_module_drivers/staging/wlags49_h2] Error 2 - -This is due a wrong function definition (it does not include parameters names). - -Signed-off-by: Javier Martinez Canillas <martinez.javier@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/staging/wlags49_h2/wl_sysfs.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/staging/wlags49_h2/wl_sysfs.h -+++ b/drivers/staging/wlags49_h2/wl_sysfs.h -@@ -2,6 +2,6 @@ - extern void register_wlags_sysfs(struct net_device *); - extern void unregister_wlags_sysfs(struct net_device *); - #else --static void register_wlags_sysfs(struct net_device *) { return; }; --static void unregister_wlags_sysfs(struct net_device *) { return; }; -+static inline void register_wlags_sysfs(struct net_device *net) { } -+static inline void unregister_wlags_sysfs(struct net_device *net) { } - #endif diff --git a/tty.current/serial-cpm_uart-implement-the-cpm_uart_early_write-function-for-console-poll.patch b/tty.current/serial-cpm_uart-implement-the-cpm_uart_early_write-function-for-console-poll.patch deleted file mode 100644 index 161436af0d8f84..00000000000000 --- a/tty.current/serial-cpm_uart-implement-the-cpm_uart_early_write-function-for-console-poll.patch +++ /dev/null @@ -1,197 +0,0 @@ -From dongdong.deng@windriver.com Fri Jun 18 08:48:14 2010 -From: Dongdong Deng <dongdong.deng@windriver.com> -Date: Thu, 17 Jun 2010 11:13:40 +0800 -Subject: serial: cpm_uart: implement the cpm_uart_early_write() function for console poll -To: jason.wessel@windriver.com, gregkh@suse.de, galak@kernel.crashing.org, bruce.ashfield@windriver.com, dongdong.deng@windriver.com -Cc: linux-kernel@vger.kernel.org -Message-ID: <1276744420-7845-1-git-send-email-dongdong.deng@windriver.com> - - -The cpm_uart_early_write() function which was used for console poll -isn't implemented in the cpm uart driver. - -Implementing this function both fixes the build when CONFIG_CONSOLE_POLL -is set and allows kgdboc to work via the cpm uart. - -Signed-off-by: Dongdong Deng <dongdong.deng@windriver.com> -Reviewed-by: Bruce Ashfield <bruce.ashfield@windriver.com> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/serial/cpm_uart/cpm_uart_core.c | 143 +++++++++++++++++--------------- - 1 file changed, 79 insertions(+), 64 deletions(-) - ---- a/drivers/serial/cpm_uart/cpm_uart_core.c -+++ b/drivers/serial/cpm_uart/cpm_uart_core.c -@@ -930,6 +930,83 @@ static void cpm_uart_config_port(struct - } - } - -+#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_CPM_CONSOLE) -+/* -+ * Write a string to the serial port -+ * Note that this is called with interrupts already disabled -+ */ -+static void cpm_uart_early_write(struct uart_cpm_port *pinfo, -+ const char *string, u_int count) -+{ -+ unsigned int i; -+ cbd_t __iomem *bdp, *bdbase; -+ unsigned char *cpm_outp_addr; -+ -+ /* Get the address of the host memory buffer. -+ */ -+ bdp = pinfo->tx_cur; -+ bdbase = pinfo->tx_bd_base; -+ -+ /* -+ * Now, do each character. This is not as bad as it looks -+ * since this is a holding FIFO and not a transmitting FIFO. -+ * We could add the complexity of filling the entire transmit -+ * buffer, but we would just wait longer between accesses...... -+ */ -+ for (i = 0; i < count; i++, string++) { -+ /* Wait for transmitter fifo to empty. -+ * Ready indicates output is ready, and xmt is doing -+ * that, not that it is ready for us to send. -+ */ -+ while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -+ ; -+ -+ /* Send the character out. -+ * If the buffer address is in the CPM DPRAM, don't -+ * convert it. -+ */ -+ cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), -+ pinfo); -+ *cpm_outp_addr = *string; -+ -+ out_be16(&bdp->cbd_datlen, 1); -+ setbits16(&bdp->cbd_sc, BD_SC_READY); -+ -+ if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) -+ bdp = bdbase; -+ else -+ bdp++; -+ -+ /* if a LF, also do CR... */ -+ if (*string == 10) { -+ while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -+ ; -+ -+ cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), -+ pinfo); -+ *cpm_outp_addr = 13; -+ -+ out_be16(&bdp->cbd_datlen, 1); -+ setbits16(&bdp->cbd_sc, BD_SC_READY); -+ -+ if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) -+ bdp = bdbase; -+ else -+ bdp++; -+ } -+ } -+ -+ /* -+ * Finally, Wait for transmitter & holding register to empty -+ * and restore the IER -+ */ -+ while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -+ ; -+ -+ pinfo->tx_cur = bdp; -+} -+#endif -+ - #ifdef CONFIG_CONSOLE_POLL - /* Serial polling routines for writing and reading from the uart while - * in an interrupt or debug context. -@@ -999,7 +1076,7 @@ static void cpm_put_poll_char(struct uar - static char ch[2]; - - ch[0] = (char)c; -- cpm_uart_early_write(pinfo->port.line, ch, 1); -+ cpm_uart_early_write(pinfo, ch, 1); - } - #endif /* CONFIG_CONSOLE_POLL */ - -@@ -1130,9 +1207,6 @@ static void cpm_uart_console_write(struc - u_int count) - { - struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; -- unsigned int i; -- cbd_t __iomem *bdp, *bdbase; -- unsigned char *cp; - unsigned long flags; - int nolock = oops_in_progress; - -@@ -1142,66 +1216,7 @@ static void cpm_uart_console_write(struc - spin_lock_irqsave(&pinfo->port.lock, flags); - } - -- /* Get the address of the host memory buffer. -- */ -- bdp = pinfo->tx_cur; -- bdbase = pinfo->tx_bd_base; -- -- /* -- * Now, do each character. This is not as bad as it looks -- * since this is a holding FIFO and not a transmitting FIFO. -- * We could add the complexity of filling the entire transmit -- * buffer, but we would just wait longer between accesses...... -- */ -- for (i = 0; i < count; i++, s++) { -- /* Wait for transmitter fifo to empty. -- * Ready indicates output is ready, and xmt is doing -- * that, not that it is ready for us to send. -- */ -- while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -- ; -- -- /* Send the character out. -- * If the buffer address is in the CPM DPRAM, don't -- * convert it. -- */ -- cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); -- *cp = *s; -- -- out_be16(&bdp->cbd_datlen, 1); -- setbits16(&bdp->cbd_sc, BD_SC_READY); -- -- if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) -- bdp = bdbase; -- else -- bdp++; -- -- /* if a LF, also do CR... */ -- if (*s == 10) { -- while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -- ; -- -- cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); -- *cp = 13; -- -- out_be16(&bdp->cbd_datlen, 1); -- setbits16(&bdp->cbd_sc, BD_SC_READY); -- -- if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) -- bdp = bdbase; -- else -- bdp++; -- } -- } -- -- /* -- * Finally, Wait for transmitter & holding register to empty -- * and restore the IER -- */ -- while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) -- ; -- -- pinfo->tx_cur = bdp; -+ cpm_uart_early_write(pinfo, s, count); - - if (unlikely(nolock)) { - local_irq_restore(flags); diff --git a/usb.current/usb-ehci-mxc-bail-out-on-transceiver-problems.patch b/usb.current/usb-ehci-mxc-bail-out-on-transceiver-problems.patch deleted file mode 100644 index 1d6323fefa3830..00000000000000 --- a/usb.current/usb-ehci-mxc-bail-out-on-transceiver-problems.patch +++ /dev/null @@ -1,69 +0,0 @@ -From w.sang@pengutronix.de Wed Jun 16 13:24:59 2010 -From: Wolfram Sang <w.sang@pengutronix.de> -Date: Tue, 15 Jun 2010 12:34:23 +0200 -Subject: USB: ehci-mxc: bail out on transceiver problems -To: linux-usb@vger.kernel.org -Cc: linux-arm-kernel@lists.infradead.org, Wolfram Sang <w.sang@pengutronix.de>, Sascha Hauer <s.hauer@pengutronix.de>, Daniel Mack <daniel@caiaq.de>, Greg KH <gregkh@suse.de>, stable@kernel.org -Message-ID: <1276598063-3956-2-git-send-email-w.sang@pengutronix.de> - - -The old code registered the hcd even if there were no transceivers -detected, leading to oopses like this if we try to probe a non-existant -ULPI: - -[ 2.730000] mxc-ehci mxc-ehci.0: unable to init transceiver -[ 2.740000] timeout polling for ULPI device -[ 2.740000] timeout polling for ULPI device -[ 2.750000] mxc-ehci mxc-ehci.0: unable to enable vbus on transceiver -[ 2.750000] mxc-ehci mxc-ehci.0: Freescale On-Chip EHCI Host Controller -[ 2.760000] mxc-ehci mxc-ehci.0: new USB bus registered, assigned bus number 2 -[ 2.770000] Unhandled fault: external abort on non-linefetch (0x808) at 0xc4876184 -[ 2.770000] Internal error: : 808 [#1] PREEMPT -[ 2.770000] last sysfs file: -[ 2.770000] Modules linked in: -[ 2.770000] CPU: 0 Not tainted (2.6.33.5 #5) -[ 2.770000] PC is at ehci_hub_control+0x4d4/0x8f8 -[ 2.770000] LR is at ehci_mxc_setup+0xbc/0xdc -[ 2.770000] pc : [<c0196dfc>] lr : [<c019bc8c>] psr: 00000093 -[ 2.770000] sp : c3815e40 ip : 00000001 fp : 60000013 -[ 2.770000] r10: c4876184 r9 : 00000000 r8 : c3814000 -[ 2.770000] r7 : c391d2cc r6 : 00000001 r5 : 00000001 r4 : 00000000 -[ 2.770000] r3 : 80000000 r2 : 00000007 r1 : 80000000 r0 : c4876184 -[ 2.770000] Flags: nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel -[ 2.770000] Control: 0005317f Table: a0004000 DAC: 00000017 -[ 2.770000] Process swapper (pid: 1, stack limit = 0xc3814270) -... - -Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> -Cc: Sascha Hauer <s.hauer@pengutronix.de> -Cc: stable <stable@kernel.org> -Acked-by: Daniel Mack <daniel@caiaq.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/host/ehci-mxc.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - ---- a/drivers/usb/host/ehci-mxc.c -+++ b/drivers/usb/host/ehci-mxc.c -@@ -207,10 +207,17 @@ static int ehci_mxc_drv_probe(struct pla - /* Initialize the transceiver */ - if (pdata->otg) { - pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; -- if (otg_init(pdata->otg) != 0) -- dev_err(dev, "unable to init transceiver\n"); -- else if (otg_set_vbus(pdata->otg, 1) != 0) -+ ret = otg_init(pdata->otg); -+ if (ret) { -+ dev_err(dev, "unable to init transceiver, probably missing\n"); -+ ret = -ENODEV; -+ goto err_add; -+ } -+ ret = otg_set_vbus(pdata->otg, 1); -+ if (ret) { - dev_err(dev, "unable to enable vbus on transceiver\n"); -+ goto err_add; -+ } - } - - priv->hcd = hcd; diff --git a/usb.current/usb-fix-oops-in-usb_sg_init.patch b/usb.current/usb-fix-oops-in-usb_sg_init.patch deleted file mode 100644 index 08be68a0d0f95c..00000000000000 --- a/usb.current/usb-fix-oops-in-usb_sg_init.patch +++ /dev/null @@ -1,37 +0,0 @@ -From stern@rowland.harvard.edu Fri Jun 18 08:50:48 2010 -From: Alan Stern <stern@rowland.harvard.edu> -Date: Fri, 18 Jun 2010 10:16:33 -0400 (EDT) -Subject: USB: fix oops in usb_sg_init() -To: Greg KH <greg@kroah.com> -Cc: "Gupta, Ajay Kumar" <ajay.gupta@ti.com>, "matthew@wil.cx" <matthew@wil.cx> -Message-ID: <Pine.LNX.4.44L0.1006181014130.1606-100000@iolanthe.rowland.org> - - -This patch (as1401) fixes a bug in usb_sg_init() that can cause an -invalid pointer dereference. An inner loop reuses some local variables -in an unsafe manner, so new variables are introduced. - -Signed-off-by: Alan Stern <stern@rowland.harvard.edu> -Tested-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/core/message.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - ---- a/drivers/usb/core/message.c -+++ b/drivers/usb/core/message.c -@@ -416,8 +416,11 @@ int usb_sg_init(struct usb_sg_request *i - /* A length of zero means transfer the whole sg list */ - len = length; - if (len == 0) { -- for_each_sg(sg, sg, nents, i) -- len += sg->length; -+ struct scatterlist *sg2; -+ int j; -+ -+ for_each_sg(sg, sg2, nents, j) -+ len += sg2->length; - } - } else { - /* diff --git a/usb.current/usb-g_serial-don-t-set-low_latency-flag.patch b/usb.current/usb-g_serial-don-t-set-low_latency-flag.patch deleted file mode 100644 index 49c719778183e7..00000000000000 --- a/usb.current/usb-g_serial-don-t-set-low_latency-flag.patch +++ /dev/null @@ -1,59 +0,0 @@ -From jon.povey@racelogic.co.uk Mon Jun 14 15:21:46 2010 -From: Jon Povey <jon.povey@racelogic.co.uk> -Date: Mon, 14 Jun 2010 19:41:04 +0900 -Subject: USB: g_serial: don't set low_latency flag -To: linux-usb@vger.kernel.org -Cc: Jon Povey <jon.povey@racelogic.co.uk>, chrisv@cyberswitching.com, david-b@pacbell.net -Message-ID: <1276512064-3229-1-git-send-email-jon.povey@racelogic.co.uk> - - -No longer set low_latency flag as it causes this warning backtrace: - - WARNING: at kernel/mutex.c:207 __mutex_lock_slowpath+0x6c/0x288() - -Fix associated locking and wakeups. - -Signed-off-by: Jon Povey <jon.povey@racelogic.co.uk> -Cc: Maulik Mankad <x0082077@ti.com> -Cc: stable <stable@kernel.org> -Acked-by: David Brownell <dbrownell@users.sourceforge.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/u_serial.c | 15 ++------------- - 1 file changed, 2 insertions(+), 13 deletions(-) - ---- a/drivers/usb/gadget/u_serial.c -+++ b/drivers/usb/gadget/u_serial.c -@@ -536,17 +536,11 @@ recycle: - list_move(&req->list, &port->read_pool); - } - -- /* Push from tty to ldisc; this is immediate with low_latency, and -- * may trigger callbacks to this driver ... so drop the spinlock. -+ /* Push from tty to ldisc; without low_latency set this is handled by -+ * a workqueue, so we won't get callbacks and can hold port_lock - */ - if (tty && do_push) { -- spin_unlock_irq(&port->port_lock); - tty_flip_buffer_push(tty); -- wake_up_interruptible(&tty->read_wait); -- spin_lock_irq(&port->port_lock); -- -- /* tty may have been closed */ -- tty = port->port_tty; - } - - -@@ -784,11 +778,6 @@ static int gs_open(struct tty_struct *tt - port->open_count = 1; - port->openclose = false; - -- /* low_latency means ldiscs work in tasklet context, without -- * needing a workqueue schedule ... easier to keep up. -- */ -- tty->low_latency = 1; -- - /* if connected, start the I/O stream */ - if (port->port_usb) { - struct gserial *gser = port->port_usb; diff --git a/usb.current/usb-g_serial-fix-tty-cleanup-on-unload.patch b/usb.current/usb-g_serial-fix-tty-cleanup-on-unload.patch deleted file mode 100644 index 833a9258c4db2e..00000000000000 --- a/usb.current/usb-g_serial-fix-tty-cleanup-on-unload.patch +++ /dev/null @@ -1,31 +0,0 @@ -From jon.povey@racelogic.co.uk Mon Jun 14 15:22:32 2010 -From: Jon Povey <jon.povey@racelogic.co.uk> -Date: Mon, 14 Jun 2010 19:42:10 +0900 -Subject: USB: g_serial: fix tty cleanup on unload -To: linux-usb@vger.kernel.org -Cc: Jon Povey <jon.povey@racelogic.co.uk>, chrisv@cyberswitching.com, david-b@pacbell.net -Message-ID: <1276512130-3317-1-git-send-email-jon.povey@racelogic.co.uk> - - -Call put_tty_driver() in cleanup function, to fix Oops when trying to open -gadget serial char device after module unload. - -Signed-off-by: Jon Povey <jon.povey@racelogic.co.uk> -Acked-by: David Brownell <dbrownell@users.sourceforge.net> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/u_serial.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/usb/gadget/u_serial.c -+++ b/drivers/usb/gadget/u_serial.c -@@ -1184,6 +1184,7 @@ void gserial_cleanup(void) - n_ports = 0; - - tty_unregister_driver(gs_tty_driver); -+ put_tty_driver(gs_tty_driver); - gs_tty_driver = NULL; - - pr_debug("%s: cleaned up ttyGS* support\n", __func__); diff --git a/usb.current/usb-gadget-eth-fix-calculate-crc32-in-eem.patch b/usb.current/usb-gadget-eth-fix-calculate-crc32-in-eem.patch deleted file mode 100644 index 9534a591bd705e..00000000000000 --- a/usb.current/usb-gadget-eth-fix-calculate-crc32-in-eem.patch +++ /dev/null @@ -1,31 +0,0 @@ -From Jiri.Pinkava@vscht.cz Mon Jun 21 14:40:59 2010 -From: Jiri Pinkava <jiri.pinkava@vscht.cz> -Date: Sun, 20 Jun 2010 20:05:52 +0200 -Subject: USB: gadget eth: Fix calculate CRC32 in EEM -To: linux-usb@vger.kernel.org, dbrownell@users.sourceforge.net -Cc: gregkh@suse.de, bniebuhr@efjohnson.com, tj@kernel.org, stevel@netspectrum.com -Message-ID: <4C1E5880.4050007@vscht.cz> - - -CRC should be calculated for Ethernet frame, not for whole recievede EEM data. -This bug shows rarely, because in many times len == skb->len. - -Signed-off-by: Jiri Pinkava <jiri.pinkava@vscht.cz> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/f_eem.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - ---- a/drivers/usb/gadget/f_eem.c -+++ b/drivers/usb/gadget/f_eem.c -@@ -469,8 +469,7 @@ static int eem_unwrap(struct gether *por - crc = get_unaligned_le32(skb->data + len - - ETH_FCS_LEN); - crc2 = ~crc32_le(~0, -- skb->data, -- skb->len - ETH_FCS_LEN); -+ skb->data, len - ETH_FCS_LEN); - } else { - crc = get_unaligned_be32(skb->data + len - - ETH_FCS_LEN); diff --git a/usb.current/usb-gadget-f_mass_storage-fixed-fs-descriptors-not-being-updated.patch b/usb.current/usb-gadget-f_mass_storage-fixed-fs-descriptors-not-being-updated.patch deleted file mode 100644 index 053d59cd4fc6d1..00000000000000 --- a/usb.current/usb-gadget-f_mass_storage-fixed-fs-descriptors-not-being-updated.patch +++ /dev/null @@ -1,106 +0,0 @@ -From m.nazarewicz@samsung.com Fri Jun 25 11:23:02 2010 -From: Michal Nazarewicz <m.nazarewicz@samsung.com> -Date: Fri, 25 Jun 2010 16:29:26 +0200 -Subject: USB: gadget: f_mass_storage: fixed fs descriptors not being updated -To: linux-usb@vger.kernel.org -Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org, Dries Van Puymbroeck <Dries.VanPuymbroeck@dekimo.com> -Message-ID: <195465048ef0e96371d42a9bc754a2f35a03bccd.1277461024.git.m.nazarewicz@samsung.com> - - -The full speed descriptors were copied to the usb_function structure -in the fsg_bind_config function before call to the usb_ep_autoconfig. -The usb_ep_autoconfig was called in fsg_bind using the original -descriptors. In effect copied descriptors were not updated. - -This patch changes the copy full speed descriptors after the call to -usb_op_autoconfig is performed. This way, copied full speed -descriptors have updated values. - -Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com> -Cc: Kyungmin Park <kyungmin.park@samsung.com> -Reported-by: Dries Van Puymbroeck <Dries.VanPuymbroeck@dekimo.com> -Tested-by: Dries Van Puymbroeck <Dries.VanPuymbroeck@dekimo.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/f_mass_storage.c | 34 ++++++++++++---------------------- - 1 file changed, 12 insertions(+), 22 deletions(-) - ---- a/drivers/usb/gadget/f_mass_storage.c -+++ b/drivers/usb/gadget/f_mass_storage.c -@@ -2970,7 +2970,6 @@ static int fsg_bind(struct usb_configura - { - struct fsg_dev *fsg = fsg_from_func(f); - struct usb_gadget *gadget = c->cdev->gadget; -- int rc; - int i; - struct usb_ep *ep; - -@@ -2996,6 +2995,11 @@ static int fsg_bind(struct usb_configura - ep->driver_data = fsg->common; /* claim the endpoint */ - fsg->bulk_out = ep; - -+ /* Copy descriptors */ -+ f->descriptors = usb_copy_descriptors(fsg_fs_function); -+ if (unlikely(!f->descriptors)) -+ return -ENOMEM; -+ - if (gadget_is_dualspeed(gadget)) { - /* Assume endpoint addresses are the same for both speeds */ - fsg_hs_bulk_in_desc.bEndpointAddress = -@@ -3003,16 +3007,17 @@ static int fsg_bind(struct usb_configura - fsg_hs_bulk_out_desc.bEndpointAddress = - fsg_fs_bulk_out_desc.bEndpointAddress; - f->hs_descriptors = usb_copy_descriptors(fsg_hs_function); -- if (unlikely(!f->hs_descriptors)) -+ if (unlikely(!f->hs_descriptors)) { -+ usb_free_descriptors(f->descriptors); - return -ENOMEM; -+ } - } - - return 0; - - autoconf_fail: - ERROR(fsg, "unable to autoconfigure all endpoints\n"); -- rc = -ENOTSUPP; -- return rc; -+ return -ENOTSUPP; - } - - -@@ -3036,11 +3041,6 @@ static int fsg_add(struct usb_composite_ - - fsg->function.name = FSG_DRIVER_DESC; - fsg->function.strings = fsg_strings_array; -- fsg->function.descriptors = usb_copy_descriptors(fsg_fs_function); -- if (unlikely(!fsg->function.descriptors)) { -- rc = -ENOMEM; -- goto error_free_fsg; -- } - fsg->function.bind = fsg_bind; - fsg->function.unbind = fsg_unbind; - fsg->function.setup = fsg_setup; -@@ -3056,19 +3056,9 @@ static int fsg_add(struct usb_composite_ - - rc = usb_add_function(c, &fsg->function); - if (unlikely(rc)) -- goto error_free_all; -- -- fsg_common_get(fsg->common); -- return 0; -- --error_free_all: -- usb_free_descriptors(fsg->function.descriptors); -- /* fsg_bind() might have copied those; or maybe not? who cares -- * -- free it just in case. */ -- usb_free_descriptors(fsg->function.hs_descriptors); --error_free_fsg: -- kfree(fsg); -- -+ kfree(fsg); -+ else -+ fsg_common_get(fsg->common); - return rc; - } - diff --git a/usb.current/usb-gadget-f_mass_storage-stale-common-fsg-value-bug-fix.patch b/usb.current/usb-gadget-f_mass_storage-stale-common-fsg-value-bug-fix.patch deleted file mode 100644 index 2e2d400d9aaca8..00000000000000 --- a/usb.current/usb-gadget-f_mass_storage-stale-common-fsg-value-bug-fix.patch +++ /dev/null @@ -1,326 +0,0 @@ -From m.nazarewicz@samsung.com Fri Jun 25 11:23:22 2010 -From: Michal Nazarewicz <m.nazarewicz@samsung.com> -Date: Fri, 25 Jun 2010 16:29:28 +0200 -Subject: USB: gadget: f_mass_storage: stale common->fsg value bug fix -To: linux-usb@vger.kernel.org -Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org -Message-ID: <023d27cf18cf64018bb96f0913b0e61bade38c39.1277475111.git.m.nazarewicz@samsung.com> - - -On fsg_unbind the common->fsg pointer was not NULLed if the -unbound fsg_dev instance was the current one. As an effect, -the incorrect pointer was preserved in all further operations -which caused do_set_interface to reference an invalid region. - -This commit fixes this by raising an exception in fsg_bind -which will change the common->fsg pointer. This also requires -an wait queue so that the thread in fsg_bind can wait till the -worker thread handles the exception. - -This commit removes also a config and new_config fields of -fsg_common as they are no longer needed since fsg can be -used to determine whether function is active or not. - -Moreover, this commit removes possible race condition where -the fsg field was modified in both the worker thread and -form various other contexts. This is fixed by replacing -prev_fsg with new_fsg. At this point, fsg is assigned only -in worker thread. - -Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com> -Cc: Kyungmin Park <kyungmin.park@samsung.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/f_mass_storage.c | 162 +++++++++++++----------------------- - 1 file changed, 62 insertions(+), 100 deletions(-) - ---- a/drivers/usb/gadget/f_mass_storage.c -+++ b/drivers/usb/gadget/f_mass_storage.c -@@ -321,8 +321,8 @@ struct fsg_dev; - /* Data shared by all the FSG instances. */ - struct fsg_common { - struct usb_gadget *gadget; -- struct fsg_dev *fsg; -- struct fsg_dev *prev_fsg; -+ struct fsg_dev *fsg, *new_fsg; -+ wait_queue_head_t fsg_wait; - - /* filesem protects: backing files in use */ - struct rw_semaphore filesem; -@@ -351,7 +351,6 @@ struct fsg_common { - enum fsg_state state; /* For exception handling */ - unsigned int exception_req_tag; - -- u8 config, new_config; - enum data_direction data_dir; - u32 data_size; - u32 data_size_from_cmnd; -@@ -595,7 +594,7 @@ static int fsg_setup(struct usb_function - u16 w_value = le16_to_cpu(ctrl->wValue); - u16 w_length = le16_to_cpu(ctrl->wLength); - -- if (!fsg->common->config) -+ if (!fsg_is_set(fsg->common)) - return -EOPNOTSUPP; - - switch (ctrl->bRequest) { -@@ -2303,24 +2302,20 @@ static int alloc_request(struct fsg_comm - return -ENOMEM; - } - --/* -- * Reset interface setting and re-init endpoint state (toggle etc). -- * Call with altsetting < 0 to disable the interface. The only other -- * available altsetting is 0, which enables the interface. -- */ --static int do_set_interface(struct fsg_common *common, int altsetting) -+/* Reset interface setting and re-init endpoint state (toggle etc). */ -+static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg) - { -- int rc = 0; -- int i; -- const struct usb_endpoint_descriptor *d; -+ const struct usb_endpoint_descriptor *d; -+ struct fsg_dev *fsg; -+ int i, rc = 0; - - if (common->running) - DBG(common, "reset interface\n"); - - reset: - /* Deallocate the requests */ -- if (common->prev_fsg) { -- struct fsg_dev *fsg = common->prev_fsg; -+ if (common->fsg) { -+ fsg = common->fsg; - - for (i = 0; i < FSG_NUM_BUFFERS; ++i) { - struct fsg_buffhd *bh = &common->buffhds[i]; -@@ -2345,88 +2340,53 @@ reset: - fsg->bulk_out_enabled = 0; - } - -- common->prev_fsg = 0; -+ common->fsg = NULL; -+ wake_up(&common->fsg_wait); - } - - common->running = 0; -- if (altsetting < 0 || rc != 0) -+ if (!new_fsg || rc) - return rc; - -- DBG(common, "set interface %d\n", altsetting); -+ common->fsg = new_fsg; -+ fsg = common->fsg; -+ -+ /* Enable the endpoints */ -+ d = fsg_ep_desc(common->gadget, -+ &fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); -+ rc = enable_endpoint(common, fsg->bulk_in, d); -+ if (rc) -+ goto reset; -+ fsg->bulk_in_enabled = 1; -+ -+ d = fsg_ep_desc(common->gadget, -+ &fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); -+ rc = enable_endpoint(common, fsg->bulk_out, d); -+ if (rc) -+ goto reset; -+ fsg->bulk_out_enabled = 1; -+ common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); -+ clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); -+ -+ /* Allocate the requests */ -+ for (i = 0; i < FSG_NUM_BUFFERS; ++i) { -+ struct fsg_buffhd *bh = &common->buffhds[i]; - -- if (fsg_is_set(common)) { -- struct fsg_dev *fsg = common->fsg; -- common->prev_fsg = common->fsg; -- -- /* Enable the endpoints */ -- d = fsg_ep_desc(common->gadget, -- &fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc); -- rc = enable_endpoint(common, fsg->bulk_in, d); -+ rc = alloc_request(common, fsg->bulk_in, &bh->inreq); - if (rc) - goto reset; -- fsg->bulk_in_enabled = 1; -- -- d = fsg_ep_desc(common->gadget, -- &fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc); -- rc = enable_endpoint(common, fsg->bulk_out, d); -+ rc = alloc_request(common, fsg->bulk_out, &bh->outreq); - if (rc) - goto reset; -- fsg->bulk_out_enabled = 1; -- common->bulk_out_maxpacket = le16_to_cpu(d->wMaxPacketSize); -- clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); -- -- /* Allocate the requests */ -- for (i = 0; i < FSG_NUM_BUFFERS; ++i) { -- struct fsg_buffhd *bh = &common->buffhds[i]; -- -- rc = alloc_request(common, fsg->bulk_in, &bh->inreq); -- if (rc) -- goto reset; -- rc = alloc_request(common, fsg->bulk_out, &bh->outreq); -- if (rc) -- goto reset; -- bh->inreq->buf = bh->outreq->buf = bh->buf; -- bh->inreq->context = bh->outreq->context = bh; -- bh->inreq->complete = bulk_in_complete; -- bh->outreq->complete = bulk_out_complete; -- } -- -- common->running = 1; -- for (i = 0; i < common->nluns; ++i) -- common->luns[i].unit_attention_data = SS_RESET_OCCURRED; -- return rc; -- } else { -- return -EIO; -+ bh->inreq->buf = bh->outreq->buf = bh->buf; -+ bh->inreq->context = bh->outreq->context = bh; -+ bh->inreq->complete = bulk_in_complete; -+ bh->outreq->complete = bulk_out_complete; - } --} -- -- --/* -- * Change our operational configuration. This code must agree with the code -- * that returns config descriptors, and with interface altsetting code. -- * -- * It's also responsible for power management interactions. Some -- * configurations might not work with our current power sources. -- * For now we just assume the gadget is always self-powered. -- */ --static int do_set_config(struct fsg_common *common, u8 new_config) --{ -- int rc = 0; - -- /* Disable the single interface */ -- if (common->config != 0) { -- DBG(common, "reset config\n"); -- common->config = 0; -- rc = do_set_interface(common, -1); -- } -- -- /* Enable the interface */ -- if (new_config != 0) { -- common->config = new_config; -- rc = do_set_interface(common, 0); -- if (rc != 0) -- common->config = 0; /* Reset on errors */ -- } -+ common->running = 1; -+ for (i = 0; i < common->nluns; ++i) -+ common->luns[i].unit_attention_data = SS_RESET_OCCURRED; - return rc; - } - -@@ -2437,9 +2397,7 @@ static int do_set_config(struct fsg_comm - static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) - { - struct fsg_dev *fsg = fsg_from_func(f); -- fsg->common->prev_fsg = fsg->common->fsg; -- fsg->common->fsg = fsg; -- fsg->common->new_config = 1; -+ fsg->common->new_fsg = fsg; - raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); - return 0; - } -@@ -2447,9 +2405,7 @@ static int fsg_set_alt(struct usb_functi - static void fsg_disable(struct usb_function *f) - { - struct fsg_dev *fsg = fsg_from_func(f); -- fsg->common->prev_fsg = fsg->common->fsg; -- fsg->common->fsg = fsg; -- fsg->common->new_config = 0; -+ fsg->common->new_fsg = NULL; - raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); - } - -@@ -2459,19 +2415,17 @@ static void fsg_disable(struct usb_funct - static void handle_exception(struct fsg_common *common) - { - siginfo_t info; -- int sig; - int i; - struct fsg_buffhd *bh; - enum fsg_state old_state; -- u8 new_config; - struct fsg_lun *curlun; - unsigned int exception_req_tag; -- int rc; - - /* Clear the existing signals. Anything but SIGUSR1 is converted - * into a high-priority EXIT exception. */ - for (;;) { -- sig = dequeue_signal_lock(current, ¤t->blocked, &info); -+ int sig = -+ dequeue_signal_lock(current, ¤t->blocked, &info); - if (!sig) - break; - if (sig != SIGUSR1) { -@@ -2482,7 +2436,7 @@ static void handle_exception(struct fsg_ - } - - /* Cancel all the pending transfers */ -- if (fsg_is_set(common)) { -+ if (likely(common->fsg)) { - for (i = 0; i < FSG_NUM_BUFFERS; ++i) { - bh = &common->buffhds[i]; - if (bh->inreq_busy) -@@ -2523,7 +2477,6 @@ static void handle_exception(struct fsg_ - common->next_buffhd_to_fill = &common->buffhds[0]; - common->next_buffhd_to_drain = &common->buffhds[0]; - exception_req_tag = common->exception_req_tag; -- new_config = common->new_config; - old_state = common->state; - - if (old_state == FSG_STATE_ABORT_BULK_OUT) -@@ -2573,12 +2526,12 @@ static void handle_exception(struct fsg_ - break; - - case FSG_STATE_CONFIG_CHANGE: -- rc = do_set_config(common, new_config); -+ do_set_interface(common, common->new_fsg); - break; - - case FSG_STATE_EXIT: - case FSG_STATE_TERMINATED: -- do_set_config(common, 0); /* Free resources */ -+ do_set_interface(common, NULL); /* Free resources */ - spin_lock_irq(&common->lock); - common->state = FSG_STATE_TERMINATED; /* Stop the thread */ - spin_unlock_irq(&common->lock); -@@ -2863,6 +2816,7 @@ buffhds_first_it: - goto error_release; - } - init_completion(&common->thread_notifier); -+ init_waitqueue_head(&common->fsg_wait); - #undef OR - - -@@ -2957,9 +2911,17 @@ static void fsg_common_release(struct kr - static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) - { - struct fsg_dev *fsg = fsg_from_func(f); -+ struct fsg_common *common = fsg->common; - - DBG(fsg, "unbind\n"); -- fsg_common_put(fsg->common); -+ if (fsg->common->fsg == fsg) { -+ fsg->common->new_fsg = NULL; -+ raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); -+ /* FIXME: make interruptible or killable somehow? */ -+ wait_event(common->fsg_wait, common->fsg != fsg); -+ } -+ -+ fsg_common_put(common); - usb_free_descriptors(fsg->function.descriptors); - usb_free_descriptors(fsg->function.hs_descriptors); - kfree(fsg); diff --git a/usb.current/usb-gadget-g_fs-possible-invalid-pointer-reference-bug-fixed.patch b/usb.current/usb-gadget-g_fs-possible-invalid-pointer-reference-bug-fixed.patch deleted file mode 100644 index e5677d0b03fdec..00000000000000 --- a/usb.current/usb-gadget-g_fs-possible-invalid-pointer-reference-bug-fixed.patch +++ /dev/null @@ -1,50 +0,0 @@ -From m.nazarewicz@samsung.com Mon Jun 14 15:23:58 2010 -From: Michal Nazarewicz <m.nazarewicz@samsung.com> -Date: Mon, 14 Jun 2010 10:43:34 +0200 -Subject: [PATCH] USB: gadget: g_fs: possible invalid pointer reference bug fixed -To: linux-usb@vger.kernel.org -Cc: David Brownell <dbrownell@users.sourceforge.net>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org -Message-ID: <f8fbee30a711b740b5875514715c3c58b4eb196c.1276170819.git.m.nazarewicz@samsung.com> - - -During __gfs_do_config() some invalid pointers may be left -in usb_configuration::interfaces array from previous calls -to the __gfs_do_config() for the same configuration. This -will always happen if an user space function which has -a fewer then the last user space function registers itself. -Composite's set_config() function that a pointer after the -last interface in usb_configuration::interface is NULL -unless the array is full. - -This patch makes the __gfs_do_config() make sure that if the -usb_configuration::interface is not full then a pointer -after the last interface is NULL. - -Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com> -Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/g_ffs.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - ---- a/drivers/usb/gadget/g_ffs.c -+++ b/drivers/usb/gadget/g_ffs.c -@@ -392,6 +392,17 @@ static int __gfs_do_config(struct usb_co - if (unlikely(ret < 0)) - return ret; - -+ /* After previous do_configs there may be some invalid -+ * pointers in c->interface array. This happens every time -+ * a user space function with fewer interfaces than a user -+ * space function that was run before the new one is run. The -+ * compasit's set_config() assumes that if there is no more -+ * then MAX_CONFIG_INTERFACES interfaces in a configuration -+ * then there is a NULL pointer after the last interface in -+ * c->interface array. We need to make sure this is true. */ -+ if (c->next_interface_id < ARRAY_SIZE(c->interface)) -+ c->interface[c->next_interface_id] = NULL; -+ - return 0; - } - diff --git a/usb.current/usb-gadget-printer-fix-sleep-inside-atomic.patch b/usb.current/usb-gadget-printer-fix-sleep-inside-atomic.patch deleted file mode 100644 index 07bf916a2c9011..00000000000000 --- a/usb.current/usb-gadget-printer-fix-sleep-inside-atomic.patch +++ /dev/null @@ -1,163 +0,0 @@ -From jslaby@suse.cz Mon Jun 21 14:19:25 2010 -From: Jiri Slaby <jslaby@suse.cz> -Date: Mon, 21 Jun 2010 17:02:40 +0200 -Subject: USB: gadget/printer, fix sleep inside atomic -To: gregkh@suse.de -Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, jirislaby@gmail.com, "Craig W. Nadler" <craig@nadler.us>, David Brownell <dbrownell@users.sourceforge.net> -Message-ID: <1277132560-14284-1-git-send-email-jslaby@suse.cz> - - -Stanse found that sleep is called inside atomic context created by -lock_printer_io spinlock in several functions. It's used in process -context only and some functions sleep inside its critical section. As -this is not allowed for spinlocks, switch it to mutex. - -Signed-off-by: Jiri Slaby <jslaby@suse.cz> -Cc: Craig W. Nadler <craig@nadler.us> -Acked-by: David Brownell <dbrownell@users.sourceforge.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/printer.c | 32 ++++++++++++++++---------------- - 1 file changed, 16 insertions(+), 16 deletions(-) - ---- a/drivers/usb/gadget/printer.c -+++ b/drivers/usb/gadget/printer.c -@@ -82,7 +82,7 @@ static struct class *usb_gadget_class; - struct printer_dev { - spinlock_t lock; /* lock this structure */ - /* lock buffer lists during read/write calls */ -- spinlock_t lock_printer_io; -+ struct mutex lock_printer_io; - struct usb_gadget *gadget; - struct usb_request *req; /* for control responses */ - u8 config; -@@ -567,7 +567,7 @@ printer_read(struct file *fd, char __use - - DBG(dev, "printer_read trying to read %d bytes\n", (int)len); - -- spin_lock(&dev->lock_printer_io); -+ mutex_lock(&dev->lock_printer_io); - spin_lock_irqsave(&dev->lock, flags); - - /* We will use this flag later to check if a printer reset happened -@@ -601,7 +601,7 @@ printer_read(struct file *fd, char __use - * call or not. - */ - if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return -EAGAIN; - } - -@@ -648,7 +648,7 @@ printer_read(struct file *fd, char __use - if (dev->reset_printer) { - list_add(¤t_rx_req->list, &dev->rx_reqs); - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return -EAGAIN; - } - -@@ -673,7 +673,7 @@ printer_read(struct file *fd, char __use - dev->current_rx_buf = current_rx_buf; - - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - - DBG(dev, "printer_read returned %d bytes\n", (int)bytes_copied); - -@@ -697,7 +697,7 @@ printer_write(struct file *fd, const cha - if (len == 0) - return -EINVAL; - -- spin_lock(&dev->lock_printer_io); -+ mutex_lock(&dev->lock_printer_io); - spin_lock_irqsave(&dev->lock, flags); - - /* Check if a printer reset happens while we have interrupts on */ -@@ -713,7 +713,7 @@ printer_write(struct file *fd, const cha - * a NON-Blocking call or not. - */ - if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return -EAGAIN; - } - -@@ -752,7 +752,7 @@ printer_write(struct file *fd, const cha - - if (copy_from_user(req->buf, buf, size)) { - list_add(&req->list, &dev->tx_reqs); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return bytes_copied; - } - -@@ -766,14 +766,14 @@ printer_write(struct file *fd, const cha - if (dev->reset_printer) { - list_add(&req->list, &dev->tx_reqs); - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return -EAGAIN; - } - - if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) { - list_add(&req->list, &dev->tx_reqs); - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - return -EAGAIN; - } - -@@ -782,7 +782,7 @@ printer_write(struct file *fd, const cha - } - - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - - DBG(dev, "printer_write sent %d bytes\n", (int)bytes_copied); - -@@ -820,11 +820,11 @@ printer_poll(struct file *fd, poll_table - unsigned long flags; - int status = 0; - -- spin_lock(&dev->lock_printer_io); -+ mutex_lock(&dev->lock_printer_io); - spin_lock_irqsave(&dev->lock, flags); - setup_rx_reqs(dev); - spin_unlock_irqrestore(&dev->lock, flags); -- spin_unlock(&dev->lock_printer_io); -+ mutex_unlock(&dev->lock_printer_io); - - poll_wait(fd, &dev->rx_wait, wait); - poll_wait(fd, &dev->tx_wait, wait); -@@ -1461,7 +1461,7 @@ autoconf_fail: - } - - spin_lock_init(&dev->lock); -- spin_lock_init(&dev->lock_printer_io); -+ mutex_init(&dev->lock_printer_io); - INIT_LIST_HEAD(&dev->tx_reqs); - INIT_LIST_HEAD(&dev->tx_reqs_active); - INIT_LIST_HEAD(&dev->rx_reqs); -@@ -1594,7 +1594,7 @@ cleanup(void) - { - int status; - -- spin_lock(&usb_printer_gadget.lock_printer_io); -+ mutex_lock(&usb_printer_gadget.lock_printer_io); - class_destroy(usb_gadget_class); - unregister_chrdev_region(g_printer_devno, 2); - -@@ -1602,6 +1602,6 @@ cleanup(void) - if (status) - ERROR(dev, "usb_gadget_unregister_driver %x\n", status); - -- spin_unlock(&usb_printer_gadget.lock_printer_io); -+ mutex_unlock(&usb_printer_gadget.lock_printer_io); - } - module_exit(cleanup); diff --git a/usb.current/usb-isp1362-hcd-fix-double-lock.patch b/usb.current/usb-isp1362-hcd-fix-double-lock.patch deleted file mode 100644 index d8e8f0950af3c8..00000000000000 --- a/usb.current/usb-isp1362-hcd-fix-double-lock.patch +++ /dev/null @@ -1,66 +0,0 @@ -From jslaby@suse.cz Mon Jun 21 14:19:09 2010 -From: Jiri Slaby <jslaby@suse.cz> -Date: Mon, 21 Jun 2010 17:02:51 +0200 -Subject: USB: isp1362-hcd, fix double lock -To: gregkh@suse.de -Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, jirislaby@gmail.com, Lothar Wassmann <LW@KARO-electronics.de>, Michael Hennerich <michael.hennerich@analog.com>, Bryan Wu <cooloney@kernel.org>, Mike Frysinger <vapier@gentoo.org> -Message-ID: <1277132571-14320-1-git-send-email-jslaby@suse.cz> - - -Stanse found that isp1362_sw_reset tries to take a isp1362_hcd->lock, -but it is already held in isp1362_hc_stop. Avoid that by introducing -__isp1362_sw_reset which doesn't take the lock and call it from -isp1362_hc_stop. isp1362_sw_reset is then as simple as lock -- -__isp1362_sw_reset -- unlock. - -Signed-off-by: Jiri Slaby <jslaby@suse.cz> -Cc: Lothar Wassmann <LW@KARO-electronics.de> -Cc: Michael Hennerich <michael.hennerich@analog.com> -Cc: Bryan Wu <cooloney@kernel.org> -Cc: Mike Frysinger <vapier@gentoo.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/host/isp1362-hcd.c | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - ---- a/drivers/usb/host/isp1362-hcd.c -+++ b/drivers/usb/host/isp1362-hcd.c -@@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp - - /*-------------------------------------------------------------------------*/ - --static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) -+static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) - { - int tmp = 20; -- unsigned long flags; -- -- spin_lock_irqsave(&isp1362_hcd->lock, flags); - - isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC); - isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); -@@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1 - } - if (!tmp) - pr_err("Software reset timeout\n"); -+} -+ -+static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&isp1362_hcd->lock, flags); -+ __isp1362_sw_reset(isp1362_hcd); - spin_unlock_irqrestore(&isp1362_hcd->lock, flags); - } - -@@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_h - if (isp1362_hcd->board && isp1362_hcd->board->reset) - isp1362_hcd->board->reset(hcd->self.controller, 1); - else -- isp1362_sw_reset(isp1362_hcd); -+ __isp1362_sw_reset(isp1362_hcd); - - if (isp1362_hcd->board && isp1362_hcd->board->clock) - isp1362_hcd->board->clock(hcd->self.controller, 0); diff --git a/usb.current/usb-musb-enable-the-maximum-supported-burst-mode-for-dma.patch b/usb.current/usb-musb-enable-the-maximum-supported-burst-mode-for-dma.patch deleted file mode 100644 index e97c95b10ecadf..00000000000000 --- a/usb.current/usb-musb-enable-the-maximum-supported-burst-mode-for-dma.patch +++ /dev/null @@ -1,53 +0,0 @@ -From gadiyar@ti.com Thu Jun 24 14:38:20 2010 -From: Hema HK <hemahk@ti.com> -Date: Thu, 24 Jun 2010 23:07:09 +0530 -Subject: USB: musb: Enable the maximum supported burst mode for DMA -To: linux-usb@vger.kernel.org -Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Ajay Kumar Gupta <ajay.gupta@ti.com>, Hema HK <hemahk@ti.com>, Anand Gadiyar <gadiyar@ti.com> -Message-ID: <1277401029-13761-5-git-send-email-gadiyar@ti.com> - - -From: Hema HK <hemahk@ti.com> - -Setting MUSB Burst Mode 3 automatically enables support for -lower burst modes (BURST4, BURST8, BURST16 or bursts of unspecified -length). There is no need to set these burst modes based on the -packet size. Also enable the burst mode for both mode1 and mode0. - -This is a fix for buggy hardware - having the lower burst modes -enabled can potentially cause lockups of the DMA engine used in -OMAP2/3/4 chips. - -Signed-off-by: Hema HK <hemahk@ti.com> -Signed-off-by: Anand Gadiyar <gadiyar@ti.com> -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -Acked-by: Felipe Balbi <felipe.balbi@nokia.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/musb/musbhsdma.c | 13 ++----------- - 1 file changed, 2 insertions(+), 11 deletions(-) - ---- a/drivers/usb/musb/musbhsdma.c -+++ b/drivers/usb/musb/musbhsdma.c -@@ -132,18 +132,9 @@ static void configure_channel(struct dma - if (mode) { - csr |= 1 << MUSB_HSDMA_MODE1_SHIFT; - BUG_ON(len < packet_sz); -- -- if (packet_sz >= 64) { -- csr |= MUSB_HSDMA_BURSTMODE_INCR16 -- << MUSB_HSDMA_BURSTMODE_SHIFT; -- } else if (packet_sz >= 32) { -- csr |= MUSB_HSDMA_BURSTMODE_INCR8 -- << MUSB_HSDMA_BURSTMODE_SHIFT; -- } else if (packet_sz >= 16) { -- csr |= MUSB_HSDMA_BURSTMODE_INCR4 -- << MUSB_HSDMA_BURSTMODE_SHIFT; -- } - } -+ csr |= MUSB_HSDMA_BURSTMODE_INCR16 -+ << MUSB_HSDMA_BURSTMODE_SHIFT; - - csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT) - | (1 << MUSB_HSDMA_ENABLE_SHIFT) diff --git a/usb.current/usb-musb-fix-a-bug-by-making-suspend-interrupt-available-in-device-mode.patch b/usb.current/usb-musb-fix-a-bug-by-making-suspend-interrupt-available-in-device-mode.patch deleted file mode 100644 index bca576b6d5aa45..00000000000000 --- a/usb.current/usb-musb-fix-a-bug-by-making-suspend-interrupt-available-in-device-mode.patch +++ /dev/null @@ -1,49 +0,0 @@ -From x0082077@ti.com Wed Jun 16 13:23:21 2010 -From: Maulik Mankad <x0082077@ti.com> -Date: Tue, 15 Jun 2010 14:40:27 +0530 -Subject: usb: musb: Fix a bug by making suspend interrupt available in device mode -To: linux-usb@vger.kernel.org -Cc: Maulik Mankad <x0082077@ti.com>, David Brownell <david-b@pacbell.net>, Felipe Balbi <felipe.balbi@nokia.com> -Message-ID: <1276593027-30168-1-git-send-email-x0082077@ti.com> - - -As a part of aligning the ISR code for MUSB with the specs, the -ISR code was re-written. - -See Commit 1c25fda4a09e8229800979986ef399401053b46e (usb: musb: handle -irqs in the order dictated by programming guide) - -With this the suspend interrupt came accidently under CONFIG_USB_MUSB_HDRC_HCD. - -The fix brings suspend interrupt handling outside -CONFIG_USB_MUSB_HDRC_HCD. - -Signed-off-by: Maulik Mankad <x0082077@ti.com> -Cc: David Brownell <david-b@pacbell.net> -Acked-by: Felipe Balbi <felipe.balbi@nokia.com> -Cc: stable <stable@kernel.org> [.34] -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/musb/musb_core.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/usb/musb/musb_core.c -+++ b/drivers/usb/musb/musb_core.c -@@ -642,7 +642,7 @@ static irqreturn_t musb_stage0_irq(struc - handled = IRQ_HANDLED; - } - -- -+#endif - if (int_usb & MUSB_INTR_SUSPEND) { - DBG(1, "SUSPEND (%s) devctl %02x power %02x\n", - otg_state_string(musb), devctl, power); -@@ -705,6 +705,7 @@ static irqreturn_t musb_stage0_irq(struc - } - } - -+#ifdef CONFIG_USB_MUSB_HDRC_HCD - if (int_usb & MUSB_INTR_CONNECT) { - struct usb_hcd *hcd = musb_to_hcd(musb); - void __iomem *mbase = musb->mregs; diff --git a/usb.current/usb-musb-fix-blackfin-ulpi-stubs.patch b/usb.current/usb-musb-fix-blackfin-ulpi-stubs.patch deleted file mode 100644 index a58c456de24a93..00000000000000 --- a/usb.current/usb-musb-fix-blackfin-ulpi-stubs.patch +++ /dev/null @@ -1,40 +0,0 @@ -From gadiyar@ti.com Thu Jun 24 14:37:59 2010 -From: Mike Frysinger <vapier@gentoo.org> -Date: Thu, 24 Jun 2010 23:07:08 +0530 -Subject: USB: musb: fix Blackfin ulpi stubs -To: linux-usb@vger.kernel.org -Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Ajay Kumar Gupta <ajay.gupta@ti.com>, Mike Frysinger <vapier@gentoo.org> -Message-ID: <1277401029-13761-4-git-send-email-gadiyar@ti.com> - - -From: Mike Frysinger <vapier@gentoo.org> - -The new ulpi code defines fallback stubs for the Blackfin arch, but does -so incorrectly leading to a build failure: -drivers/usb/musb/musb_core.c:227: error: 'musb_ulpi_read' undeclared here (not in a function) -drivers/usb/musb/musb_core.c:228: error: 'musb_ulpi_write' undeclared here (not in a function) - -Tweak the fallback stubs so that they do work as intended. - -Signed-off-by: Mike Frysinger <vapier@gentoo.org> -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -Acked-by: Felipe Balbi <felipe.balbi@nokia.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/musb/musb_core.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/usb/musb/musb_core.c -+++ b/drivers/usb/musb/musb_core.c -@@ -219,8 +219,8 @@ static int musb_ulpi_write(struct otg_tr - return 0; - } - #else --#define musb_ulpi_read(a, b) NULL --#define musb_ulpi_write(a, b, c) NULL -+#define musb_ulpi_read NULL -+#define musb_ulpi_write NULL - #endif - - static struct otg_io_access_ops musb_ulpi_access = { diff --git a/usb.current/usb-musb-make-non-omap-platforms-build-with-config_pm-y.patch b/usb.current/usb-musb-make-non-omap-platforms-build-with-config_pm-y.patch deleted file mode 100644 index 0d838296eea571..00000000000000 --- a/usb.current/usb-musb-make-non-omap-platforms-build-with-config_pm-y.patch +++ /dev/null @@ -1,58 +0,0 @@ -From gadiyar@ti.com Thu Jun 24 14:37:31 2010 -From: Sergei Shtylyov <sshtylyov@ru.mvista.com> -Date: Thu, 24 Jun 2010 23:07:07 +0530 -Subject: USB: MUSB: make non-OMAP platforms build with CONFIG_PM=y -To: linux-usb@vger.kernel.org -Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Ajay Kumar Gupta <ajay.gupta@ti.com>, Sergei Shtylyov <sshtylyov@ru.mvista.com> -Message-ID: <1277401029-13761-3-git-send-email-gadiyar@ti.com> - -From: Sergei Shtylyov <sshtylyov@ru.mvista.com> - -Attempt to build MUSB driver with CONFIG_PM=y (e.g. in the OTG mode) on DaVinci -results in these link errors: - -drivers/built-in.o: In function `musb_restore_context': -led-triggers.c:(.text+0x714d8): undefined reference to -`musb_platform_restore_context' -drivers/built-in.o: In function `musb_save_context': -led-triggers.c:(.text+0x71788): undefined reference to -`musb_platform_save_context' - -This turned out to be caused by commit 9957dd97ec5e98dd334f87ade1d9a0b24d1f86eb -(usb: musb: Fix compile error for omaps for musb_hdrc). Revert it, taking into -account the rename of CONFIG_ARCH_OMAP34XX into CONFIG_ARCH_OMAP3 (which that -commit fixed in a completely inappropriate way) and the recent addition of -OMAP4 support. - -Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -Acked-by: Felipe Balbi <felipe.balbi@nokia.com> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/musb/musb_core.h | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - ---- a/drivers/usb/musb/musb_core.h -+++ b/drivers/usb/musb/musb_core.h -@@ -470,7 +470,8 @@ struct musb_csr_regs { - - struct musb_context_registers { - --#ifdef CONFIG_PM -+#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ -+ defined(CONFIG_ARCH_OMAP4) - u32 otg_sysconfig, otg_forcestandby; - #endif - u8 power; -@@ -484,7 +485,8 @@ struct musb_context_registers { - struct musb_csr_regs index_regs[MUSB_C_NUM_EPS]; - }; - --#ifdef CONFIG_PM -+#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ -+ defined(CONFIG_ARCH_OMAP4) - extern void musb_platform_save_context(struct musb *musb, - struct musb_context_registers *musb_context); - extern void musb_platform_restore_context(struct musb *musb, diff --git a/usb.current/usb-musb_core-make-disconnect-and-suspend-interrupts-work-again.patch b/usb.current/usb-musb_core-make-disconnect-and-suspend-interrupts-work-again.patch deleted file mode 100644 index 44846b6ce76245..00000000000000 --- a/usb.current/usb-musb_core-make-disconnect-and-suspend-interrupts-work-again.patch +++ /dev/null @@ -1,48 +0,0 @@ -From gadiyar@ti.com Thu Jun 24 14:36:43 2010 -From: Sergei Shtylyov <sshtylyov@ru.mvista.com> -Date: Thu, 24 Jun 2010 23:07:06 +0530 -Subject: USB: musb_core: make disconnect and suspend interrupts work again -To: linux-usb@vger.kernel.org -Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Ajay Kumar Gupta <ajay.gupta@ti.com>, Sergei Shtylyov <sshtylyov@ru.mvista.com>, stable@kernel.org -Message-ID: <1277401029-13761-2-git-send-email-gadiyar@ti.com> - - -From: Sergei Shtylyov <sshtylyov@ru.mvista.com> - -Commit 1c25fda4a09e8229800979986ef399401053b46e (usb: musb: handle irqs in the -order dictated by programming guide) forgot to get rid of the old 'STAGE0_MASK' -filter for calling musb_stage0_irq(), so now disconnect and suspend interrupts -are effectively ignored... - -Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> -Cc: stable <stable@kernel.org> -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -Acked-by: Felipe Balbi <felipe.balbi@nokia.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/musb/musb_core.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - ---- a/drivers/usb/musb/musb_core.c -+++ b/drivers/usb/musb/musb_core.c -@@ -451,10 +451,6 @@ void musb_hnp_stop(struct musb *musb) - * @param power - */ - --#define STAGE0_MASK (MUSB_INTR_RESUME | MUSB_INTR_SESSREQ \ -- | MUSB_INTR_VBUSERROR | MUSB_INTR_CONNECT \ -- | MUSB_INTR_RESET) -- - static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, - u8 devctl, u8 power) - { -@@ -1598,7 +1594,7 @@ irqreturn_t musb_interrupt(struct musb * - /* the core can interrupt us for multiple reasons; docs have - * a generic interrupt flowchart to follow - */ -- if (musb->int_usb & STAGE0_MASK) -+ if (musb->int_usb) - retval |= musb_stage0_irq(musb, musb->int_usb, - devctl, power); - diff --git a/usb.current/usb-obey-the-sysfs-power-wakeup-setting.patch b/usb.current/usb-obey-the-sysfs-power-wakeup-setting.patch deleted file mode 100644 index 4e40090dc26da5..00000000000000 --- a/usb.current/usb-obey-the-sysfs-power-wakeup-setting.patch +++ /dev/null @@ -1,67 +0,0 @@ -From stern@rowland.harvard.edu Thu Jun 24 14:33:30 2010 -From: Alan Stern <stern@rowland.harvard.edu> -Date: Tue, 22 Jun 2010 16:14:48 -0400 (EDT) -Subject: USB: obey the sysfs power/wakeup setting -To: Greg KH <greg@kroah.com> -Message-ID: <Pine.LNX.4.44L0.1006221603330.1322-100000@iolanthe.rowland.org> - - -This patch (as1403) is a partial reversion of an earlier change -(commit 5f677f1d45b2bf08085bbba7394392dfa586fa8e "USB: fix remote -wakeup settings during system sleep"). After hearing from a user, I -realized that remote wakeup should be enabled during system sleep -whenever userspace allows it, and not only if a driver requests it -too. - -Indeed, there could be a device with no driver, that does nothing but -generate a wakeup request when the user presses a button. Such a -device should be allowed to do its job. - -The problem fixed by the earlier patch -- device generating a wakeup -request for no reason, causing system suspend to abort -- was also -addressed by a later patch ("USB: don't enable remote wakeup by -default", accepted but not yet merged into mainline). The device -won't be able to generate the bogus wakeup requests because it will be -disabled for remote wakeup by default. Hence this reversion will not -re-introduce any old problems. - -Signed-off-by: Alan Stern <stern@rowland.harvard.edu> -Cc: stable <stable@kernel.org> [.34] -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - - ---- - drivers/usb/core/driver.c | 13 +++---------- - 1 file changed, 3 insertions(+), 10 deletions(-) - ---- a/drivers/usb/core/driver.c -+++ b/drivers/usb/core/driver.c -@@ -1272,8 +1272,7 @@ static int usb_resume_both(struct usb_de - - static void choose_wakeup(struct usb_device *udev, pm_message_t msg) - { -- int w, i; -- struct usb_interface *intf; -+ int w; - - /* Remote wakeup is needed only when we actually go to sleep. - * For things like FREEZE and QUIESCE, if the device is already -@@ -1285,16 +1284,10 @@ static void choose_wakeup(struct usb_dev - return; - } - -- /* If remote wakeup is permitted, see whether any interface drivers -+ /* Enable remote wakeup if it is allowed, even if no interface drivers - * actually want it. - */ -- w = 0; -- if (device_may_wakeup(&udev->dev) && udev->actconfig) { -- for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { -- intf = udev->actconfig->interface[i]; -- w |= intf->needs_remote_wakeup; -- } -- } -+ w = device_may_wakeup(&udev->dev); - - /* If the device is autosuspended with the wrong wakeup setting, - * autoresume now so the setting can be changed. diff --git a/usb.current/usb-otg-ulpi-bail-out-on-read-errors.patch b/usb.current/usb-otg-ulpi-bail-out-on-read-errors.patch deleted file mode 100644 index 733b614dacb4dc..00000000000000 --- a/usb.current/usb-otg-ulpi-bail-out-on-read-errors.patch +++ /dev/null @@ -1,46 +0,0 @@ -From w.sang@pengutronix.de Wed Jun 16 13:24:08 2010 -From: Wolfram Sang <w.sang@pengutronix.de> -Date: Tue, 15 Jun 2010 12:34:22 +0200 -Subject: USB: otg/ulpi: bail out on read errors -To: linux-usb@vger.kernel.org -Cc: linux-arm-kernel@lists.infradead.org, Wolfram Sang <w.sang@pengutronix.de>, Sascha Hauer <s.hauer@pengutronix.de>, Daniel Mack <daniel@caiaq.de>, Greg KH <gregkh@suse.de> -Message-ID: <1276598063-3956-1-git-send-email-w.sang@pengutronix.de> - -otg_read may return errnos, so bail out correctly to prevent bogus -ID-numbers. - -Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> -Cc: Sascha Hauer <s.hauer@pengutronix.de> -Acked-by: Daniel Mack <daniel@caiaq.de> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/otg/ulpi.c | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - ---- a/drivers/usb/otg/ulpi.c -+++ b/drivers/usb/otg/ulpi.c -@@ -59,12 +59,17 @@ static int ulpi_set_flags(struct otg_tra - - static int ulpi_init(struct otg_transceiver *otg) - { -- int i, vid, pid; -+ int i, vid, pid, ret; -+ u32 ulpi_id = 0; - -- vid = (otg_io_read(otg, ULPI_VENDOR_ID_HIGH) << 8) | -- otg_io_read(otg, ULPI_VENDOR_ID_LOW); -- pid = (otg_io_read(otg, ULPI_PRODUCT_ID_HIGH) << 8) | -- otg_io_read(otg, ULPI_PRODUCT_ID_LOW); -+ for (i = 0; i < 4; i++) { -+ ret = otg_io_read(otg, ULPI_PRODUCT_ID_HIGH - i); -+ if (ret < 0) -+ return ret; -+ ulpi_id = (ulpi_id << 8) | ret; -+ } -+ vid = ulpi_id & 0xffff; -+ pid = ulpi_id >> 16; - - pr_info("ULPI transceiver vendor/product ID 0x%04x/0x%04x\n", vid, pid); - diff --git a/usb.current/usb-qcserial-fix-a-memory-leak-in-qcprobe-error-path.patch b/usb.current/usb-qcserial-fix-a-memory-leak-in-qcprobe-error-path.patch deleted file mode 100644 index 3332c336e757d5..00000000000000 --- a/usb.current/usb-qcserial-fix-a-memory-leak-in-qcprobe-error-path.patch +++ /dev/null @@ -1,43 +0,0 @@ -From axel.lin@gmail.com Mon Jun 21 14:40:38 2010 -From: Axel Lin <axel.lin@gmail.com> -Date: Mon, 21 Jun 2010 08:44:17 +0800 -Subject: USB: qcserial: fix a memory leak in qcprobe error path -Cc: Greg Kroah-Hartman <gregkh@suse.de>, Matthew Garrett <mjg@redhat.com>, Anssi Hannula <anssi.hannula@gmail.com>, Bernhard Rosenkraenzer <bero@arklinux.org>, linux-usb@vger.kernel.org -Message-ID: <1277081057.15579.3.camel@mola> - - -This patch adds missing kfree(data) before return -ENODEV. - -Signed-off-by: Axel Lin <axel.lin@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/serial/qcserial.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/usb/serial/qcserial.c -+++ b/drivers/usb/serial/qcserial.c -@@ -139,6 +139,7 @@ static int qcprobe(struct usb_serial *se - "Could not set interface, error %d\n", - retval); - retval = -ENODEV; -+ kfree(data); - } - return retval; - } -@@ -155,6 +156,7 @@ static int qcprobe(struct usb_serial *se - "Could not set interface, error %d\n", - retval); - retval = -ENODEV; -+ kfree(data); - } - return retval; - } -@@ -163,6 +165,7 @@ static int qcprobe(struct usb_serial *se - default: - dev_err(&serial->dev->dev, - "unknown number of interfaces: %d\n", nintf); -+ kfree(data); - return -ENODEV; - } - diff --git a/usb.current/usb-r8a66597-fix-failure-in-change-of-status.patch b/usb.current/usb-r8a66597-fix-failure-in-change-of-status.patch deleted file mode 100644 index 720e5023a9b3fd..00000000000000 --- a/usb.current/usb-r8a66597-fix-failure-in-change-of-status.patch +++ /dev/null @@ -1,34 +0,0 @@ -From nobuhiro.iwamatsu.yj@renesas.com Mon Jun 14 15:48:15 2010 -From: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> -Date: Mon, 7 Jun 2010 16:55:56 +0900 -Subject: USB: r8a66597: Fix failure in change of status -To: gregkh@suse.de -Cc: stern@rowland.harvard.edu, shimoda.yoshihiro@renesas.com, Paul Mundt <lethal@linux-sh.org> -Message-ID: <AANLkTimQgvU-pG67QWVjXY5rzLCclelHc7hhsUb_fpJF@mail.gmail.com> - - -In the change by 749da5f82fe33ff68dd4aa1a5e35cd9aa6246dab, -The change in the status when the USB device is connected is wrong. -Therefore, the device is not recognized. - -Acked-by: Alan Stern <stern@rowland.harvard.edu> -CC: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com> -CC: Paul Mundt" <lethal@linux-sh.org> -Signed-off-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/host/r8a66597-hcd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/usb/host/r8a66597-hcd.c -+++ b/drivers/usb/host/r8a66597-hcd.c -@@ -1065,7 +1065,7 @@ static void r8a66597_usb_connect(struct - else if (speed == LSMODE) - rh->port |= USB_PORT_STAT_LOW_SPEED; - -- rh->port &= USB_PORT_STAT_RESET; -+ rh->port &= ~USB_PORT_STAT_RESET; - rh->port |= USB_PORT_STAT_ENABLE; - } - diff --git a/usb.current/usb-s3c2410-deactivate-endpoints-before-gadget-unbinding.patch b/usb.current/usb-s3c2410-deactivate-endpoints-before-gadget-unbinding.patch deleted file mode 100644 index 4b2ab94bd43d81..00000000000000 --- a/usb.current/usb-s3c2410-deactivate-endpoints-before-gadget-unbinding.patch +++ /dev/null @@ -1,36 +0,0 @@ -From vzapolskiy@gmail.com Fri Jun 18 08:49:24 2010 -From: Vladimir Zapolskiy <vzapolskiy@gmail.com> -Date: Fri, 18 Jun 2010 08:25:00 +0400 -Subject: USB: s3c2410: deactivate endpoints before gadget unbinding -To: linux-usb@vger.kernel.org -Cc: Vladimir Zapolskiy <vzapolskiy@gmail.com>, Greg Kroah-Hartman <gregkh@suse.de> -Message-ID: <1276835100-28326-1-git-send-email-vzapolskiy@gmail.com> - - -Gadget disconnect must be called before unbinding to avoid races. -The change fixes an oops on g_ether module unregistering. - -Signed-off-by: Vladimir Zapolskiy <vzapolskiy@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/gadget/s3c2410_udc.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - ---- a/drivers/usb/gadget/s3c2410_udc.c -+++ b/drivers/usb/gadget/s3c2410_udc.c -@@ -1700,9 +1700,13 @@ int usb_gadget_unregister_driver(struct - if (!driver || driver != udc->driver || !driver->unbind) - return -EINVAL; - -- dprintk(DEBUG_NORMAL,"usb_gadget_register_driver() '%s'\n", -+ dprintk(DEBUG_NORMAL, "usb_gadget_unregister_driver() '%s'\n", - driver->driver.name); - -+ /* report disconnect */ -+ if (driver->disconnect) -+ driver->disconnect(&udc->gadget); -+ - driver->unbind(&udc->gadget); - - device_del(&udc->gadget.dev); diff --git a/usb.current/usb-serial-ftdi-correct-merge-conflict-with-contec-id.patch b/usb.current/usb-serial-ftdi-correct-merge-conflict-with-contec-id.patch deleted file mode 100644 index 86db9d73a0652c..00000000000000 --- a/usb.current/usb-serial-ftdi-correct-merge-conflict-with-contec-id.patch +++ /dev/null @@ -1,53 +0,0 @@ -From daniel.sangorrin@gmail.com Mon Jun 21 14:18:14 2010 -From: Daniel Sangorrin <daniel.sangorrin@gmail.com> -Date: Fri, 18 Jun 2010 15:30:02 +0900 -Subject: USB: serial: ftdi: correct merge conflict with CONTEC id -To: Andreas Mohr <andi@lisas.de> -Cc: Greg Kroah-Hartman <gregkh@suse.de>, Radek Liboska <liboska@uochb.cas.cz>, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org -Message-ID: <AANLkTimx1HWYzG0qQqP12ObWQI1eiH5SoFpRic06uN3f@mail.gmail.com> - - -This patch corrects a problem with the merge of a previous -patch to add the CONTEC identifier. - -I believe the merge problem occurred with the commit: -dee5658b482e9e2ac7d6205dc876fc11d4008138 - -Originally I submitted a patch and then they asked me to order the IDs -and resubmit, so did I. But unfortunately in the end somehow both -patches were merged. - -Signed-off-by: Daniel Sangorrin <daniel.sangorrin@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/serial/ftdi_sio.c | 1 - - drivers/usb/serial/ftdi_sio_ids.h | 7 ------- - 2 files changed, 8 deletions(-) - ---- a/drivers/usb/serial/ftdi_sio.c -+++ b/drivers/usb/serial/ftdi_sio.c -@@ -653,7 +653,6 @@ static struct usb_device_id id_table_com - { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, - { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, - { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, -- { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, ---- a/drivers/usb/serial/ftdi_sio_ids.h -+++ b/drivers/usb/serial/ftdi_sio_ids.h -@@ -501,13 +501,6 @@ - #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ - - /* -- * Contec products (http://www.contec.com) -- * Submitted by Daniel Sangorrin -- */ --#define CONTEC_VID 0x06CE /* Vendor ID */ --#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ -- --/* - * Definitions for B&B Electronics products. - */ - #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ diff --git a/usb.current/usb-xhci-fix-bug-in-link-trb-activation-change.patch b/usb.current/usb-xhci-fix-bug-in-link-trb-activation-change.patch deleted file mode 100644 index ba943d301b1b08..00000000000000 --- a/usb.current/usb-xhci-fix-bug-in-link-trb-activation-change.patch +++ /dev/null @@ -1,196 +0,0 @@ -From sarah.a.sharp@linux.intel.com Mon Jun 14 15:25:09 2010 -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Date: Thu, 10 Jun 2010 12:25:28 -0700 -Subject: USB: xHCI: Fix bug in link TRB activation change. -To: Greg KH <gregkh@suse.de> -Cc: linux-usb@vger.kernel.org, John Youn <John.Youn@synopsys.com> -Message-ID: <20100610192528.GA17572@xanatos> -Content-Disposition: inline - - -Commit 6c12db90f19727c76990e7f4801c67a148b30111 introduced a bug for -control transfers. The patch was supposed to change when the link TRBs at -the end of each ring segment were given to the hardware. If a transfer -descriptor (TD) ended just before the link TRB, the code wouldn't give -back the link TRB to the hardware; instead it would be given back in -prepare_ring() just before the next TD was enqueued at the top of the -ring. - -Unfortunately, the code relied on checking the chain bit of the TRB to -determine whether the TD ended just before the link TRB. It assumed that -the ring enqueuing code would call prepare_ring() before enqueuing the -next TD. However, control transfers are made of multiple TDs, and -prepare_ring() is only called once before enqueuing two or three TDs. - -If the first or second TD of the control transfer ended just before the -link TRB, then the code in inc_enq() would not move the enqueue pointer -past the link TRB, and the link TRB would get overwritten. This would -cause the xHCI driver to start writing to memory past the ring segment, -and eventually the system would crash or hang. - -The fix is to add a flag to inc_enq() that says whether the caller will -enqueue more TDs before calling prepare_ring(). If the chain bit is -cleared (meaning this is the last TRB in a TD), and the caller will not -enqueue more TDs, then we defer giving back the link TRB. - -Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Cc: stable <stable@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/host/xhci-ring.c | 62 +++++++++++++++++++++++++++++++------------ - 1 file changed, 46 insertions(+), 16 deletions(-) - ---- a/drivers/usb/host/xhci-ring.c -+++ b/drivers/usb/host/xhci-ring.c -@@ -182,8 +182,12 @@ static void inc_deq(struct xhci_hcd *xhc - * set, but other sections talk about dealing with the chain bit set. This was - * fixed in the 0.96 specification errata, but we have to assume that all 0.95 - * xHCI hardware can't handle the chain bit being cleared on a link TRB. -+ * -+ * @more_trbs_coming: Will you enqueue more TRBs before calling -+ * prepare_transfer()? - */ --static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) -+static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, -+ bool consumer, bool more_trbs_coming) - { - u32 chain; - union xhci_trb *next; -@@ -199,15 +203,28 @@ static void inc_enq(struct xhci_hcd *xhc - while (last_trb(xhci, ring, ring->enq_seg, next)) { - if (!consumer) { - if (ring != xhci->event_ring) { -- if (chain) { -- next->link.control |= TRB_CHAIN; -- -- /* Give this link TRB to the hardware */ -- wmb(); -- next->link.control ^= TRB_CYCLE; -- } else { -+ /* -+ * If the caller doesn't plan on enqueueing more -+ * TDs before ringing the doorbell, then we -+ * don't want to give the link TRB to the -+ * hardware just yet. We'll give the link TRB -+ * back in prepare_ring() just before we enqueue -+ * the TD at the top of the ring. -+ */ -+ if (!chain && !more_trbs_coming) - break; -+ -+ /* If we're not dealing with 0.95 hardware, -+ * carry over the chain bit of the previous TRB -+ * (which may mean the chain bit is cleared). -+ */ -+ if (!xhci_link_trb_quirk(xhci)) { -+ next->link.control &= ~TRB_CHAIN; -+ next->link.control |= chain; - } -+ /* Give this link TRB to the hardware */ -+ wmb(); -+ next->link.control ^= TRB_CYCLE; - } - /* Toggle the cycle bit after the last ring segment. */ - if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { -@@ -1707,9 +1724,12 @@ void xhci_handle_event(struct xhci_hcd * - /* - * Generic function for queueing a TRB on a ring. - * The caller must have checked to make sure there's room on the ring. -+ * -+ * @more_trbs_coming: Will you enqueue more TRBs before calling -+ * prepare_transfer()? - */ - static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, -- bool consumer, -+ bool consumer, bool more_trbs_coming, - u32 field1, u32 field2, u32 field3, u32 field4) - { - struct xhci_generic_trb *trb; -@@ -1719,7 +1739,7 @@ static void queue_trb(struct xhci_hcd *x - trb->field[1] = field2; - trb->field[2] = field3; - trb->field[3] = field4; -- inc_enq(xhci, ring, consumer); -+ inc_enq(xhci, ring, consumer, more_trbs_coming); - } - - /* -@@ -1988,6 +2008,7 @@ static int queue_bulk_sg_tx(struct xhci_ - int trb_buff_len, this_sg_len, running_total; - bool first_trb; - u64 addr; -+ bool more_trbs_coming; - - struct xhci_generic_trb *start_trb; - int start_cycle; -@@ -2073,7 +2094,11 @@ static int queue_bulk_sg_tx(struct xhci_ - length_field = TRB_LEN(trb_buff_len) | - remainder | - TRB_INTR_TARGET(0); -- queue_trb(xhci, ep_ring, false, -+ if (num_trbs > 1) -+ more_trbs_coming = true; -+ else -+ more_trbs_coming = false; -+ queue_trb(xhci, ep_ring, false, more_trbs_coming, - lower_32_bits(addr), - upper_32_bits(addr), - length_field, -@@ -2124,6 +2149,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd * - int num_trbs; - struct xhci_generic_trb *start_trb; - bool first_trb; -+ bool more_trbs_coming; - int start_cycle; - u32 field, length_field; - -@@ -2212,7 +2238,11 @@ int xhci_queue_bulk_tx(struct xhci_hcd * - length_field = TRB_LEN(trb_buff_len) | - remainder | - TRB_INTR_TARGET(0); -- queue_trb(xhci, ep_ring, false, -+ if (num_trbs > 1) -+ more_trbs_coming = true; -+ else -+ more_trbs_coming = false; -+ queue_trb(xhci, ep_ring, false, more_trbs_coming, - lower_32_bits(addr), - upper_32_bits(addr), - length_field, -@@ -2291,7 +2321,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd * - /* Queue setup TRB - see section 6.4.1.2.1 */ - /* FIXME better way to translate setup_packet into two u32 fields? */ - setup = (struct usb_ctrlrequest *) urb->setup_packet; -- queue_trb(xhci, ep_ring, false, -+ queue_trb(xhci, ep_ring, false, true, - /* FIXME endianness is probably going to bite my ass here. */ - setup->bRequestType | setup->bRequest << 8 | setup->wValue << 16, - setup->wIndex | setup->wLength << 16, -@@ -2307,7 +2337,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd * - if (urb->transfer_buffer_length > 0) { - if (setup->bRequestType & USB_DIR_IN) - field |= TRB_DIR_IN; -- queue_trb(xhci, ep_ring, false, -+ queue_trb(xhci, ep_ring, false, true, - lower_32_bits(urb->transfer_dma), - upper_32_bits(urb->transfer_dma), - length_field, -@@ -2324,7 +2354,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd * - field = 0; - else - field = TRB_DIR_IN; -- queue_trb(xhci, ep_ring, false, -+ queue_trb(xhci, ep_ring, false, false, - 0, - 0, - TRB_INTR_TARGET(0), -@@ -2361,7 +2391,7 @@ static int queue_command(struct xhci_hcd - "unfailable commands failed.\n"); - return -ENOMEM; - } -- queue_trb(xhci, xhci->cmd_ring, false, field1, field2, field3, -+ queue_trb(xhci, xhci->cmd_ring, false, false, field1, field2, field3, - field4 | xhci->cmd_ring->cycle_state); - return 0; - } |
