Update to 3.7.2
svn path=/dists/trunk/linux/; revision=19721
This commit is contained in:
parent
e5d8d9ad1e
commit
1f0bfbac17
|
@ -1,4 +1,7 @@
|
|||
linux (3.7.1-1~experimental.3) UNRELEASED; urgency=low
|
||||
linux (3.7.2-1~experimental.1) UNRELEASED; urgency=low
|
||||
|
||||
* New upstream stable update:
|
||||
http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.7.2
|
||||
|
||||
[ Ben Hutchings ]
|
||||
* [ia64] nouveau: Disable another bit of ACPI support (fixes FTBFS)
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
From: Takashi Iwai <tiwai@suse.de>
|
||||
Date: Mon, 3 Dec 2012 11:12:46 +0100
|
||||
Subject: [1/2] ALSA: usb-audio: Avoid autopm calls after disconnection
|
||||
|
||||
commit 59866da9e4ae54819e3c4e0a8f426bdb0c2ef993 upstream.
|
||||
|
||||
Add a similar protection against the disconnection race and the
|
||||
invalid use of usb instance after disconnection, as well as we've done
|
||||
for the USB audio PCM.
|
||||
|
||||
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51201
|
||||
|
||||
Reviewd-by: Clemens Ladisch <clemens@ladisch.de>
|
||||
Tested-by: Clemens Ladisch <clemens@ladisch.de>
|
||||
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||||
---
|
||||
sound/usb/midi.c | 23 ++++++++++++++++++++++-
|
||||
1 file changed, 22 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
||||
index eeefbce..c0054ee 100644
|
||||
--- a/sound/usb/midi.c
|
||||
+++ b/sound/usb/midi.c
|
||||
@@ -116,6 +116,7 @@ struct snd_usb_midi {
|
||||
struct list_head list;
|
||||
struct timer_list error_timer;
|
||||
spinlock_t disc_lock;
|
||||
+ struct rw_semaphore disc_rwsem;
|
||||
struct mutex mutex;
|
||||
u32 usb_id;
|
||||
int next_midi_device;
|
||||
@@ -1038,6 +1039,12 @@ static void substream_open(struct snd_rawmidi_substream *substream, int open)
|
||||
struct snd_usb_midi* umidi = substream->rmidi->private_data;
|
||||
struct snd_kcontrol *ctl;
|
||||
|
||||
+ down_read(&umidi->disc_rwsem);
|
||||
+ if (umidi->disconnected) {
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
mutex_lock(&umidi->mutex);
|
||||
if (open) {
|
||||
if (umidi->opened++ == 0 && umidi->roland_load_ctl) {
|
||||
@@ -1056,6 +1063,7 @@ static void substream_open(struct snd_rawmidi_substream *substream, int open)
|
||||
}
|
||||
}
|
||||
mutex_unlock(&umidi->mutex);
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
}
|
||||
|
||||
static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
|
||||
@@ -1076,8 +1084,15 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
|
||||
snd_BUG();
|
||||
return -ENXIO;
|
||||
}
|
||||
+
|
||||
+ down_read(&umidi->disc_rwsem);
|
||||
+ if (umidi->disconnected) {
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
err = usb_autopm_get_interface(umidi->iface);
|
||||
port->autopm_reference = err >= 0;
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
if (err < 0 && err != -EACCES)
|
||||
return -EIO;
|
||||
substream->runtime->private_data = port;
|
||||
@@ -1092,8 +1107,10 @@ static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)
|
||||
struct usbmidi_out_port *port = substream->runtime->private_data;
|
||||
|
||||
substream_open(substream, 0);
|
||||
- if (port->autopm_reference)
|
||||
+ down_read(&umidi->disc_rwsem);
|
||||
+ if (!umidi->disconnected && port->autopm_reference)
|
||||
usb_autopm_put_interface(umidi->iface);
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1403,9 +1420,12 @@ void snd_usbmidi_disconnect(struct list_head* p)
|
||||
* a timer may submit an URB. To reliably break the cycle
|
||||
* a flag under lock must be used
|
||||
*/
|
||||
+ down_write(&umidi->disc_rwsem);
|
||||
spin_lock_irq(&umidi->disc_lock);
|
||||
umidi->disconnected = 1;
|
||||
spin_unlock_irq(&umidi->disc_lock);
|
||||
+ up_write(&umidi->disc_rwsem);
|
||||
+
|
||||
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
|
||||
struct snd_usb_midi_endpoint* ep = &umidi->endpoints[i];
|
||||
if (ep->out)
|
||||
@@ -2117,6 +2137,7 @@ int snd_usbmidi_create(struct snd_card *card,
|
||||
umidi->usb_protocol_ops = &snd_usbmidi_standard_ops;
|
||||
init_timer(&umidi->error_timer);
|
||||
spin_lock_init(&umidi->disc_lock);
|
||||
+ init_rwsem(&umidi->disc_rwsem);
|
||||
mutex_init(&umidi->mutex);
|
||||
umidi->usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor),
|
||||
le16_to_cpu(umidi->dev->descriptor.idProduct));
|
|
@ -1,217 +0,0 @@
|
|||
From: Takashi Iwai <tiwai@suse.de>
|
||||
Date: Mon, 3 Dec 2012 11:30:50 +0100
|
||||
Subject: [2/2] ALSA: usb-audio: Fix missing autopm for MIDI input
|
||||
|
||||
commit f5f165418cabf2218eb466c0e94693b8b1aee88b upstream.
|
||||
|
||||
The commit [88a8516a: ALSA: usbaudio: implement USB autosuspend] added
|
||||
the support of autopm for USB MIDI output, but it didn't take the MIDI
|
||||
input into account.
|
||||
|
||||
This patch adds the following for fixing the autopm:
|
||||
- Manage the URB start at the first MIDI input stream open, instead of
|
||||
the time of instance creation
|
||||
- Move autopm code to the common substream_open()
|
||||
- Make snd_usbmidi_input_start/_stop() more robust and add the running
|
||||
state check
|
||||
|
||||
Reviewd-by: Clemens Ladisch <clemens@ladisch.de>
|
||||
Tested-by: Clemens Ladisch <clemens@ladisch.de>
|
||||
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||||
---
|
||||
sound/usb/midi.c | 88 ++++++++++++++++++++++++++++--------------------------
|
||||
1 file changed, 46 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
||||
index c0054ee..34b9bb7 100644
|
||||
--- a/sound/usb/midi.c
|
||||
+++ b/sound/usb/midi.c
|
||||
@@ -126,8 +126,10 @@ struct snd_usb_midi {
|
||||
struct snd_usb_midi_in_endpoint *in;
|
||||
} endpoints[MIDI_MAX_ENDPOINTS];
|
||||
unsigned long input_triggered;
|
||||
- unsigned int opened;
|
||||
+ bool autopm_reference;
|
||||
+ unsigned int opened[2];
|
||||
unsigned char disconnected;
|
||||
+ unsigned char input_running;
|
||||
|
||||
struct snd_kcontrol *roland_load_ctl;
|
||||
};
|
||||
@@ -149,7 +151,6 @@ struct snd_usb_midi_out_endpoint {
|
||||
struct snd_usb_midi_out_endpoint* ep;
|
||||
struct snd_rawmidi_substream *substream;
|
||||
int active;
|
||||
- bool autopm_reference;
|
||||
uint8_t cable; /* cable number << 4 */
|
||||
uint8_t state;
|
||||
#define STATE_UNKNOWN 0
|
||||
@@ -1034,36 +1035,58 @@ static void update_roland_altsetting(struct snd_usb_midi* umidi)
|
||||
snd_usbmidi_input_start(&umidi->list);
|
||||
}
|
||||
|
||||
-static void substream_open(struct snd_rawmidi_substream *substream, int open)
|
||||
+static int substream_open(struct snd_rawmidi_substream *substream, int dir,
|
||||
+ int open)
|
||||
{
|
||||
struct snd_usb_midi* umidi = substream->rmidi->private_data;
|
||||
struct snd_kcontrol *ctl;
|
||||
+ int err;
|
||||
|
||||
down_read(&umidi->disc_rwsem);
|
||||
if (umidi->disconnected) {
|
||||
up_read(&umidi->disc_rwsem);
|
||||
- return;
|
||||
+ return open ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
mutex_lock(&umidi->mutex);
|
||||
if (open) {
|
||||
- if (umidi->opened++ == 0 && umidi->roland_load_ctl) {
|
||||
- ctl = umidi->roland_load_ctl;
|
||||
- ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
- snd_ctl_notify(umidi->card,
|
||||
+ if (!umidi->opened[0] && !umidi->opened[1]) {
|
||||
+ err = usb_autopm_get_interface(umidi->iface);
|
||||
+ umidi->autopm_reference = err >= 0;
|
||||
+ if (err < 0 && err != -EACCES) {
|
||||
+ mutex_unlock(&umidi->mutex);
|
||||
+ up_read(&umidi->disc_rwsem);
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+ if (umidi->roland_load_ctl) {
|
||||
+ ctl = umidi->roland_load_ctl;
|
||||
+ ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
+ snd_ctl_notify(umidi->card,
|
||||
SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
|
||||
- update_roland_altsetting(umidi);
|
||||
+ update_roland_altsetting(umidi);
|
||||
+ }
|
||||
}
|
||||
+ umidi->opened[dir]++;
|
||||
+ if (umidi->opened[1])
|
||||
+ snd_usbmidi_input_start(&umidi->list);
|
||||
} else {
|
||||
- if (--umidi->opened == 0 && umidi->roland_load_ctl) {
|
||||
- ctl = umidi->roland_load_ctl;
|
||||
- ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
- snd_ctl_notify(umidi->card,
|
||||
+ umidi->opened[dir]--;
|
||||
+ if (!umidi->opened[1])
|
||||
+ snd_usbmidi_input_stop(&umidi->list);
|
||||
+ if (!umidi->opened[0] && !umidi->opened[1]) {
|
||||
+ if (umidi->roland_load_ctl) {
|
||||
+ ctl = umidi->roland_load_ctl;
|
||||
+ ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
+ snd_ctl_notify(umidi->card,
|
||||
SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
|
||||
+ }
|
||||
+ if (umidi->autopm_reference)
|
||||
+ usb_autopm_put_interface(umidi->iface);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&umidi->mutex);
|
||||
up_read(&umidi->disc_rwsem);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
|
||||
@@ -1071,7 +1094,6 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
|
||||
struct snd_usb_midi* umidi = substream->rmidi->private_data;
|
||||
struct usbmidi_out_port* port = NULL;
|
||||
int i, j;
|
||||
- int err;
|
||||
|
||||
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i)
|
||||
if (umidi->endpoints[i].out)
|
||||
@@ -1085,33 +1107,14 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
- down_read(&umidi->disc_rwsem);
|
||||
- if (umidi->disconnected) {
|
||||
- up_read(&umidi->disc_rwsem);
|
||||
- return -ENODEV;
|
||||
- }
|
||||
- err = usb_autopm_get_interface(umidi->iface);
|
||||
- port->autopm_reference = err >= 0;
|
||||
- up_read(&umidi->disc_rwsem);
|
||||
- if (err < 0 && err != -EACCES)
|
||||
- return -EIO;
|
||||
substream->runtime->private_data = port;
|
||||
port->state = STATE_UNKNOWN;
|
||||
- substream_open(substream, 1);
|
||||
- return 0;
|
||||
+ return substream_open(substream, 0, 1);
|
||||
}
|
||||
|
||||
static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
- struct snd_usb_midi* umidi = substream->rmidi->private_data;
|
||||
- struct usbmidi_out_port *port = substream->runtime->private_data;
|
||||
-
|
||||
- substream_open(substream, 0);
|
||||
- down_read(&umidi->disc_rwsem);
|
||||
- if (!umidi->disconnected && port->autopm_reference)
|
||||
- usb_autopm_put_interface(umidi->iface);
|
||||
- up_read(&umidi->disc_rwsem);
|
||||
- return 0;
|
||||
+ return substream_open(substream, 0, 0);
|
||||
}
|
||||
|
||||
static void snd_usbmidi_output_trigger(struct snd_rawmidi_substream *substream, int up)
|
||||
@@ -1164,14 +1167,12 @@ static void snd_usbmidi_output_drain(struct snd_rawmidi_substream *substream)
|
||||
|
||||
static int snd_usbmidi_input_open(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
- substream_open(substream, 1);
|
||||
- return 0;
|
||||
+ return substream_open(substream, 1, 1);
|
||||
}
|
||||
|
||||
static int snd_usbmidi_input_close(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
- substream_open(substream, 0);
|
||||
- return 0;
|
||||
+ return substream_open(substream, 1, 0);
|
||||
}
|
||||
|
||||
static void snd_usbmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
|
||||
@@ -2080,12 +2081,15 @@ void snd_usbmidi_input_stop(struct list_head* p)
|
||||
unsigned int i, j;
|
||||
|
||||
umidi = list_entry(p, struct snd_usb_midi, list);
|
||||
+ if (!umidi->input_running)
|
||||
+ return;
|
||||
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
|
||||
struct snd_usb_midi_endpoint* ep = &umidi->endpoints[i];
|
||||
if (ep->in)
|
||||
for (j = 0; j < INPUT_URBS; ++j)
|
||||
usb_kill_urb(ep->in->urbs[j]);
|
||||
}
|
||||
+ umidi->input_running = 0;
|
||||
}
|
||||
|
||||
static void snd_usbmidi_input_start_ep(struct snd_usb_midi_in_endpoint* ep)
|
||||
@@ -2110,8 +2114,11 @@ void snd_usbmidi_input_start(struct list_head* p)
|
||||
int i;
|
||||
|
||||
umidi = list_entry(p, struct snd_usb_midi, list);
|
||||
+ if (umidi->input_running || !umidi->opened[1])
|
||||
+ return;
|
||||
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i)
|
||||
snd_usbmidi_input_start_ep(umidi->endpoints[i].in);
|
||||
+ umidi->input_running = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2250,9 +2257,6 @@ int snd_usbmidi_create(struct snd_card *card,
|
||||
}
|
||||
|
||||
list_add_tail(&umidi->list, midi_list);
|
||||
-
|
||||
- for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i)
|
||||
- snd_usbmidi_input_start_ep(umidi->endpoints[i].in);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
From: Kees Cook <keescook@chromium.org>
|
||||
Date: Thu, 6 Dec 2012 17:00:21 +1100
|
||||
Subject: [1/2] exec: do not leave bprm->interp on stack
|
||||
|
||||
commit 1e1b8374592f5fb347625e84d8a5f2f40d858a24 upstream.
|
||||
|
||||
If a series of scripts are executed, each triggering module loading via
|
||||
unprintable bytes in the script header, kernel stack contents can leak
|
||||
into the command line.
|
||||
|
||||
Normally execution of binfmt_script and binfmt_misc happens recursively.
|
||||
However, when modules are enabled, and unprintable bytes exist in the
|
||||
bprm->buf, execution will restart after attempting to load matching binfmt
|
||||
modules. Unfortunately, the logic in binfmt_script and binfmt_misc does
|
||||
not expect to get restarted. They leave bprm->interp pointing to their
|
||||
local stack. This means on restart bprm->interp is left pointing into
|
||||
unused stack memory which can then be copied into the userspace argv
|
||||
areas.
|
||||
|
||||
After additional study, it seems that both recursion and restart remains
|
||||
the desirable way to handle exec with scripts, misc, and modules. As
|
||||
such, we need to protect the changes to interp.
|
||||
|
||||
This changes the logic to require allocation for any changes to the
|
||||
bprm->interp. To avoid adding a new kmalloc to every exec, the default
|
||||
value is left as-is. Only when passing through binfmt_script or
|
||||
binfmt_misc does an allocation take place.
|
||||
|
||||
For a proof of concept, see DoTest.sh from:
|
||||
http://www.halfdog.net/Security/2012/LinuxKernelBinfmtScriptStackDataDisclosure/
|
||||
|
||||
Signed-off-by: Kees Cook <keescook@chromium.org>
|
||||
Cc: halfdog <me@halfdog.net>
|
||||
Cc: P J P <ppandit@redhat.com>
|
||||
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
---
|
||||
fs/binfmt_misc.c | 5 ++++-
|
||||
fs/binfmt_script.c | 4 +++-
|
||||
fs/exec.c | 15 +++++++++++++++
|
||||
include/linux/binfmts.h | 1 +
|
||||
4 files changed, 23 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
|
||||
index b0b70fb..b0c1755 100644
|
||||
--- a/fs/binfmt_misc.c
|
||||
+++ b/fs/binfmt_misc.c
|
||||
@@ -176,7 +176,10 @@ static int load_misc_binary(struct linux_binprm *bprm)
|
||||
goto _error;
|
||||
bprm->argc ++;
|
||||
|
||||
- bprm->interp = iname; /* for binfmt_script */
|
||||
+ /* Update interp in case binfmt_script needs it. */
|
||||
+ retval = bprm_change_interp(iname, bprm);
|
||||
+ if (retval < 0)
|
||||
+ goto _error;
|
||||
|
||||
interp_file = open_exec (iname);
|
||||
retval = PTR_ERR (interp_file);
|
||||
diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
|
||||
index 8c95499..4834f2c 100644
|
||||
--- a/fs/binfmt_script.c
|
||||
+++ b/fs/binfmt_script.c
|
||||
@@ -82,7 +82,9 @@ static int load_script(struct linux_binprm *bprm)
|
||||
retval = copy_strings_kernel(1, &i_name, bprm);
|
||||
if (retval) return retval;
|
||||
bprm->argc++;
|
||||
- bprm->interp = interp;
|
||||
+ retval = bprm_change_interp(interp, bprm);
|
||||
+ if (retval < 0)
|
||||
+ return retval;
|
||||
|
||||
/*
|
||||
* OK, now restart the process with the interpreter's dentry.
|
||||
diff --git a/fs/exec.c b/fs/exec.c
|
||||
index b71b08c..bf50973 100644
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -1175,9 +1175,24 @@ void free_bprm(struct linux_binprm *bprm)
|
||||
mutex_unlock(¤t->signal->cred_guard_mutex);
|
||||
abort_creds(bprm->cred);
|
||||
}
|
||||
+ /* If a binfmt changed the interp, free it. */
|
||||
+ if (bprm->interp != bprm->filename)
|
||||
+ kfree(bprm->interp);
|
||||
kfree(bprm);
|
||||
}
|
||||
|
||||
+int bprm_change_interp(char *interp, struct linux_binprm *bprm)
|
||||
+{
|
||||
+ /* If a binfmt changed the interp, free it first. */
|
||||
+ if (bprm->interp != bprm->filename)
|
||||
+ kfree(bprm->interp);
|
||||
+ bprm->interp = kstrdup(interp, GFP_KERNEL);
|
||||
+ if (!bprm->interp)
|
||||
+ return -ENOMEM;
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(bprm_change_interp);
|
||||
+
|
||||
/*
|
||||
* install the new credentials for this executable
|
||||
*/
|
||||
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
|
||||
index 2630c9b..7f0e297 100644
|
||||
--- a/include/linux/binfmts.h
|
||||
+++ b/include/linux/binfmts.h
|
||||
@@ -114,6 +114,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm,
|
||||
unsigned long stack_top,
|
||||
int executable_stack);
|
||||
extern int bprm_mm_init(struct linux_binprm *bprm);
|
||||
+extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);
|
||||
extern int copy_strings_kernel(int argc, const char *const *argv,
|
||||
struct linux_binprm *bprm);
|
||||
extern int prepare_bprm_creds(struct linux_binprm *bprm);
|
|
@ -1533,10 +1533,10 @@ upstream submission.
|
|||
hdr = (struct b43_fw_header *)(blob->data);
|
||||
--- a/drivers/net/wireless/b43legacy/main.c
|
||||
+++ b/drivers/net/wireless/b43legacy/main.c
|
||||
@@ -1529,11 +1529,8 @@ static int do_request_fw(struct b43legac
|
||||
"b43legacy%s/%s.fw",
|
||||
modparam_fwpostfix, name);
|
||||
err = request_firmware(fw, path, dev->dev->dev);
|
||||
@@ -1554,11 +1554,8 @@ static int do_request_fw(struct b43legac
|
||||
} else {
|
||||
err = request_firmware(fw, path, dev->dev->dev);
|
||||
}
|
||||
- if (err) {
|
||||
- b43legacyerr(dev->wl, "Firmware file \"%s\" not found "
|
||||
- "or load failed.\n", path);
|
||||
|
@ -1794,7 +1794,7 @@ upstream submission.
|
|||
if (ret) {
|
||||
--- a/drivers/net/wireless/p54/p54usb.c
|
||||
+++ b/drivers/net/wireless/p54/p54usb.c
|
||||
@@ -931,7 +931,6 @@ static void p54u_load_firmware_cb(const
|
||||
@@ -935,7 +935,6 @@ static void p54u_load_firmware_cb(const
|
||||
err = p54u_start_ops(priv);
|
||||
} else {
|
||||
err = -ENOENT;
|
||||
|
@ -2747,7 +2747,7 @@ upstream submission.
|
|||
/* The FPGA is a Xilinx Spartan IIE XC2S50E */
|
||||
--- a/sound/pci/hda/hda_intel.c
|
||||
+++ b/sound/pci/hda/hda_intel.c
|
||||
@@ -3280,10 +3280,8 @@ static void azx_firmware_cb(const struct
|
||||
@@ -3289,10 +3289,8 @@ static void azx_firmware_cb(const struct
|
||||
struct azx *chip = card->private_data;
|
||||
struct pci_dev *pci = chip->pci;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ removed in later patches.
|
|||
|
||||
--- a/drivers/base/firmware_class.c
|
||||
+++ b/drivers/base/firmware_class.c
|
||||
@@ -500,14 +500,23 @@ static ssize_t firmware_loading_store(st
|
||||
@@ -502,14 +502,23 @@ static ssize_t firmware_loading_store(st
|
||||
* is completed.
|
||||
* */
|
||||
fw_map_pages_buf(fw_buf);
|
||||
|
@ -45,17 +45,17 @@ removed in later patches.
|
|||
fw_load_abort(fw_priv);
|
||||
break;
|
||||
}
|
||||
@@ -671,6 +680,9 @@ static void firmware_class_timeout(u_lon
|
||||
{
|
||||
struct firmware_priv *fw_priv = (struct firmware_priv *) data;
|
||||
|
||||
@@ -679,6 +688,9 @@ static void firmware_class_timeout_work(
|
||||
mutex_unlock(&fw_lock);
|
||||
return;
|
||||
}
|
||||
+ dev_err(fw_priv->dev.parent,
|
||||
+ "firmware: agent did not handle request for %s\n",
|
||||
+ fw_priv->buf->fw_id);
|
||||
fw_load_abort(fw_priv);
|
||||
mutex_unlock(&fw_lock);
|
||||
}
|
||||
|
||||
@@ -798,7 +810,8 @@ _request_firmware_prepare(const struct f
|
||||
@@ -807,7 +819,8 @@ _request_firmware_prepare(const struct f
|
||||
}
|
||||
|
||||
if (fw_get_builtin_firmware(firmware, name)) {
|
||||
|
@ -65,7 +65,7 @@ removed in later patches.
|
|||
return NULL;
|
||||
}
|
||||
|
||||
@@ -874,25 +887,28 @@ static int _request_firmware_load(struct
|
||||
@@ -885,25 +898,28 @@ static int _request_firmware_load(struct
|
||||
|
||||
retval = device_add(f_dev);
|
||||
if (retval) {
|
||||
|
@ -96,9 +96,9 @@ removed in later patches.
|
|||
- dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
|
||||
+ dev_dbg(f_dev->parent, "firmware: requesting %s\n", buf->fw_id);
|
||||
if (timeout != MAX_SCHEDULE_TIMEOUT)
|
||||
mod_timer(&fw_priv->timeout,
|
||||
round_jiffies_up(jiffies + timeout));
|
||||
@@ -906,8 +922,15 @@ static int _request_firmware_load(struct
|
||||
schedule_delayed_work(&fw_priv->timeout_work, timeout);
|
||||
|
||||
@@ -916,8 +932,15 @@ static int _request_firmware_load(struct
|
||||
|
||||
handle_fw:
|
||||
mutex_lock(&fw_lock);
|
||||
|
@ -115,7 +115,7 @@ removed in later patches.
|
|||
|
||||
/*
|
||||
* add firmware name into devres list so that we can auto cache
|
||||
@@ -986,6 +1009,9 @@ request_firmware(const struct firmware *
|
||||
@@ -996,6 +1019,9 @@ request_firmware(const struct firmware *
|
||||
}
|
||||
if (ret)
|
||||
_request_firmware_cleanup(firmware_p);
|
||||
|
@ -125,7 +125,7 @@ removed in later patches.
|
|||
|
||||
return ret;
|
||||
}
|
||||
@@ -1035,7 +1061,7 @@ static void request_firmware_work_func(s
|
||||
@@ -1045,7 +1071,7 @@ static void request_firmware_work_func(s
|
||||
ret = _request_firmware_load(fw_priv, fw_work->uevent, timeout);
|
||||
usermodehelper_read_unlock();
|
||||
} else {
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Subject: HID: Add Apple wireless keyboard 2011 ANSI to special driver list
|
||||
Date: Sun, 02 Dec 2012 14:29:04 +0000
|
||||
Bug-Debian: http://bugs.debian.org/694546
|
||||
|
||||
Commit 0a97e1e9f9a6 ('HID: apple: Add Apple wireless keyboard 2011 ANSI PID')
|
||||
did not update the special driver list in hid-core.c.
|
||||
|
||||
Reported-by: Ari Pollak <ari@scvngr.com>
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -1528,6 +1528,7 @@
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
|
@ -44,7 +44,6 @@ bugfix/alpha/alpha-use-large-data-model.diff
|
|||
debian/iwlwifi-do-not-request-unreleased-firmware.patch
|
||||
debian/cirrus-disable-modeset-by-default.patch
|
||||
debian/fs-enable-link-security-restrictions-by-default.patch
|
||||
bugfix/all/hid-add-apple-wireless-keyboard-2011-ansi-to-special-driver-list.patch
|
||||
bugfix/arm/lis3l02dq-fix-building-without-irq-to-gpio.patch
|
||||
bugfix/arm/omap-musb-choice.patch
|
||||
bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
|
||||
|
@ -57,7 +56,6 @@ features/all/xen/microcode-typo.patch
|
|||
bugfix/all/firmware_class-log-every-success-and-failure.patch
|
||||
bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch
|
||||
|
||||
bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch
|
||||
bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch
|
||||
bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch
|
||||
bugfix/all/pps-ptp-Remove-dependencies-on-EXPERIMENTAL.patch
|
||||
|
@ -70,5 +68,3 @@ debian/ast-disable-autoload.patch
|
|||
debian/mgag200-disable-autoload.patch
|
||||
clean-modules-without-link-vmlinux.sh.patch
|
||||
bugfix/all/ath6kl-do-not-use-virt_addr_valid.patch
|
||||
bugfix/all/ALSA-usb-audio-Avoid-autopm-calls-after-disconnectio.patch
|
||||
bugfix/all/ALSA-usb-audio-Fix-missing-autopm-for-MIDI-input.patch
|
||||
|
|
Loading…
Reference in New Issue