3.5.6-stable review
Subsystems (33)
Greg Kroah-Hartman
maintainercover 3.5.6-stable review
This is the start of the stable review cycle for the 3.5.6 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Oct 6 21:03:20 UTC 2012. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.5.6-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Bart Van Assche <[email protected]>
SCSI: scsi_dh_alua: Enable STPG for unavailable ports
Dan Williams <[email protected]>
SCSI: scsi_remove_target: fix softlockup regression on hot remove
Avi Kivity <[email protected]>
x86/alternatives: Fix p6 nops on non-modular kernels
Dan Williams <[email protected]>
isci: fix isci_pci_probe() generates warning on efi failure path
Bart Van Assche <[email protected]>
IB/srp: Avoid having aborted requests hang
Bart Van Assche <[email protected]>
IB/srp: Fix use-after-free in srp_reset_req()
Patrick McHardy <[email protected]>
IPoIB: Fix use-after-free of multicast object
Dan Carpenter <[email protected]>
remoteproc: fix a potential NULL-dereference on cleanup
Ohad Ben-Cohen <[email protected]>
remoteproc: select VIRTIO to avoid build breakage
Wei Yongjun <[email protected]>
can: mscan-mpc5xxx: fix return value check in mpc512x_can_get_clock()
Stephen M. Cameron <[email protected]>
SCSI: hpsa: Use LUN reset instead of target reset
Benjamin Herrenschmidt <[email protected]>
SCSI: ibmvscsi: Fix host config length field overflow
Kees Cook <[email protected]>
Yama: handle 32-bit userspace prctl
Matthieu CASTET <[email protected]>
UBI: erase free PEB with bitflip in EC header
Artem Bityutskiy <[email protected]>
UBI: fix autoresize handling in R/O mode
Russ Gorby <[email protected]>
n_gsm: memory leak in uplink error path
Russ Gorby <[email protected]>
n_gsm: added interlocking for gsm_data_lock for certain code paths
Russ Gorby <[email protected]>
n_gsm: uplink SKBs accumulate on list
xiaojin <[email protected]>
n_gsm.c: Implement 3GPP27.010 DLC start-up procedure in MUX
Denys Vlasenko <[email protected]>
coredump: prevent double-free on an error path in core dumper
Konrad Rzeszutek Wilk <[email protected]>
xen/pciback: Restore the PCI config space after an FLR.
Sujith Manoharan <[email protected]>
ath9k: Disable ASPM only for AR9285
Kevin Daughtridge <[email protected]>
HID: keep dev_rdesc unmodified and use it for comparisons
Michael Spang <[email protected]>
Increase XHCI suspend timeout to 16ms
Elric Fu <[email protected]>
xHCI: handle command after aborting the command ring
Elric Fu <[email protected]>
xHCI: cancel command after command timeout
Elric Fu <[email protected]>
xHCI: add aborting command ring function
Elric Fu <[email protected]>
xHCI: add cmd_ring_state
Sarah Sharp <[email protected]>
xhci: Intel Panther Point BEI quirk.
Khalid Aziz <[email protected]>
firmware: Add missing attributes to EFI variable attribute print out from sysfs
Larry Finger <[email protected]>
b43legacy: Fix crash on unload when firmware not available
Ben Hutchings <[email protected]>
tools/hv: Check for read/write errors
Ben Hutchings <[email protected]>
tools/hv: Fix exit() error code
Ben Hutchings <[email protected]>
tools/hv: Fix file handle leak
Flavio Leitner <[email protected]>
serial: set correct baud_base for EXSYS EX-41092 Dual 16950
Linus Walleij <[email protected]>
serial: pl011: handle corruption at high clock speeds
Vikram Pandita <[email protected]>
serial: omap: fix software flow control
Jiri Slaby <[email protected]>
TTY: ttyprintk, don't touch behind tty->write_buf
Stanislav Kozina <[email protected]>
Remove BUG_ON from n_tty_read()
Ian Abbott <[email protected]>
staging: comedi: fix memory leak for saved channel list
Ian Abbott <[email protected]>
staging: comedi: don't dereference user memory for INSN_INTTRIG
Ian Abbott <[email protected]>
staging: comedi: jr3_pci: fix iomem dereference
Ian Abbott <[email protected]>
staging: comedi: s626: don't dereference insn->data
Larry Finger <[email protected]>
staging: r8712u: Do not queue cloned skb
Christopher Brannon <[email protected]>
tty: keyboard.c: Remove locking from vt_get_leds.
Ben Hutchings <[email protected]>
staging: speakup_soft: Fix reading of init string
Greg Kroah-Hartman <[email protected]>
USB: serial: fix up bug with missing {}Vivek Gautam <[email protected]>
usb: host: xhci: Fix Null pointer dereferencing with 71c731a for non-x86 systems
Bjørn Mork <[email protected]>
USB: qcaux: add Pantech vendor class match
Antonio Ospite <[email protected]>
USB: ftdi_sio: add TIAO USB Multi-Protocol Adapter (TUMPA) support
Bjørn Mork <[email protected]>
USB: option: blacklist QMI interface on ZTE MF683
Sebastian Andrzej Siewior <[email protected]>
usb: gadget: initialize the strings in tcm_usb_gadget properly
Sebastian Andrzej Siewior <[email protected]>
usb: gadget: make g_printer enumerate again
Mikulas Patocka <[email protected]>
dm verity: fix overflow check
Milan Broz <[email protected]>
dm table: clear add_random unless all devices have it set
Mike Snitzer <[email protected]>
dm: handle requests beyond end of device instead of using BUG_ON
Mike Snitzer <[email protected]>
dm mpath: only retry ioctl when no paths if queue_if_no_path set
Miklos Szeredi <[email protected]>
vfs: dcache: fix deadlock in tree traversal
-------------
Diffstat:
Makefile | 4 +- arch/arm/plat-omap/include/plat/omap-serial.h | 4 +- arch/x86/kernel/alternative.c | 2 +- drivers/char/ttyprintk.c | 2 +- drivers/firmware/efivars.c | 17 +- drivers/hid/hid-core.c | 16 +- drivers/hid/usbhid/hid-core.c | 6 +- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 +- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 19 +- drivers/infiniband/ulp/srp/ib_srp.c | 3 +- drivers/md/dm-mpath.c | 11 +- drivers/md/dm-table.c | 26 ++- drivers/md/dm-verity.c | 8 +- drivers/md/dm.c | 56 +++-- drivers/mtd/ubi/attach.c | 2 +- drivers/mtd/ubi/build.c | 5 + drivers/net/can/mscan/mpc5xxx_can.c | 4 +- drivers/net/wireless/ath/ath9k/pci.c | 5 +- drivers/net/wireless/b43legacy/main.c | 2 + drivers/remoteproc/Kconfig | 1 + drivers/remoteproc/remoteproc_core.c | 22 +- drivers/scsi/device_handler/scsi_dh_alua.c | 3 +- drivers/scsi/hpsa.c | 2 +- drivers/scsi/ibmvscsi/ibmvscsi.c | 3 + drivers/scsi/isci/init.c | 1 - drivers/scsi/isci/probe_roms.c | 1 - drivers/scsi/scsi_sysfs.c | 30 ++- drivers/staging/comedi/comedi_fops.c | 5 +- drivers/staging/comedi/drivers/jr3_pci.c | 2 +- drivers/staging/comedi/drivers/s626.c | 2 +- drivers/staging/rtl8712/rtl8712_recv.c | 5 +- drivers/staging/speakup/speakup_soft.c | 13 +- drivers/tty/n_gsm.c | 26 ++- drivers/tty/n_tty.c | 3 +- drivers/tty/serial/8250/8250_pci.c | 9 +- drivers/tty/serial/amba-pl011.c | 15 +- drivers/tty/serial/omap-serial.c | 12 +- drivers/tty/vt/keyboard.c | 3 - drivers/usb/gadget/printer.c | 128 +++++------ drivers/usb/gadget/tcm_usb_gadget.c | 33 +-- drivers/usb/gadget/tcm_usb_gadget.h | 14 +- drivers/usb/host/xhci-mem.c | 7 + drivers/usb/host/xhci-pci.c | 1 + drivers/usb/host/xhci-ring.c | 286 ++++++++++++++++++++++++- drivers/usb/host/xhci.c | 38 +++- drivers/usb/host/xhci.h | 20 ++ drivers/usb/serial/ftdi_sio.c | 2 + drivers/usb/serial/ftdi_sio_ids.h | 5 + drivers/usb/serial/option.c | 3 +- drivers/usb/serial/qcaux.c | 10 +- drivers/usb/serial/usb-serial.c | 3 +- drivers/xen/xen-pciback/pci_stub.c | 1 + fs/binfmt_elf.c | 19 +- fs/dcache.c | 6 + include/linux/pci_ids.h | 1 - security/yama/yama_lsm.c | 2 +- tools/hv/hv_kvp_daemon.c | 45 ++-- 57 files changed, 710 insertions(+), 266 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/58 vfs: dcache: fix deadlock in tree traversal
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 8110e16d42d587997bcaee0c864179e6d93603fe upstream.
IBM reported a deadlock in select_parent(). This was found to be caused by taking rename_lock when already locked when restarting the tree traversal.
There are two cases when the traversal needs to be restarted:
1) concurrent d_move(); this can only happen when not already locked, since taking rename_lock protects against concurrent d_move().
2) racing with final d_put() on child just at the moment of ascending to parent; rename_lock doesn't protect against this rare race, so it can happen when already locked.
Because of case 2, we need to be able to handle restarting the traversal when rename_lock is already held. This patch fixes all three callers of try_to_ascend().
IBM reported that the deadlock is gone with this patch.
[ I rewrote the patch to be smaller and just do the "goto again" if the
lock was already held, but credit goes to Miklos for the real work.
- Linus ]
--- fs/dcache.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/dcache.c +6 -0
@@ -1132,6 +1132,8 @@ positive:return 1 ; rename_retry: +if (locked) + goto again; locked =1 ;write_seqlock (&rename_lock); goto again;
@@ -1234,6 +1236,8 @@ out: rename_retry:if (found)return found; +if (locked) + goto again; locked =1 ;write_seqlock (&rename_lock); goto again;
@@ -3031,6 +3035,8 @@ resume:return ; rename_retry: +if (locked) + goto again; locked =1 ;write_seqlock (&rename_lock); goto again;
Greg Kroah-Hartman
maintainerPATCH 2/58 dm mpath: only retry ioctl when no paths if queue_if_no_path set
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit 7ba10aa6fbac7158a50bec142132b04bc480bb29 upstream.
When there are no paths and multipath receives an ioctl, it waits until a path becomes available. This behaviour is incorrect if the "queue_if_no_path" setting was not specified, as then the ioctl should be rejected immediately, which this patch now does.
commit 35991652b ("dm mpath: allow ioctls to trigger pg init") should have checked if queue_if_no_path was configured before queueing IO.
Checking for the queue_if_no_path feature, like is done in map_io(), allows the following table load to work without blocking in the multipath_ioctl retry loop:
echo "0 1024 multipath 0 0 0 0" | dmsetup create mpath_nodevs
Without this fix the multipath_ioctl will block with the following stack trace:
blkid D 0000000000000002 0 23936 1 0x00000000
ffff8802b89e5cd8 0000000000000082 ffff8802b89e5fd8 0000000000012440 ffff8802b89e4010 0000000000012440 0000000000012440 0000000000012440 ffff8802b89e5fd8 0000000000012440 ffff88030c2aab30 ffff880325794040
Call Trace: [<ffffffff814ce099>] schedule+0x29/0x70 [<ffffffff814cc312>] schedule_timeout+0x182/0x2e0 [<ffffffff8104dee0>] ? lock_timer_base+0x70/0x70 [<ffffffff814cc48e>] schedule_timeout_uninterruptible+0x1e/0x20 [<ffffffff8104f840>] msleep+0x20/0x30 [<ffffffffa0000839>] multipath_ioctl+0x109/0x170 [dm_multipath] [<ffffffffa06bfb9c>] dm_blk_ioctl+0xbc/0xd0 [dm_mod] [<ffffffff8122a408>] __blkdev_driver_ioctl+0x28/0x30 [<ffffffff8122a79e>] blkdev_ioctl+0xce/0x730 [<ffffffff811970ac>] block_ioctl+0x3c/0x40 [<ffffffff8117321c>] do_vfs_ioctl+0x8c/0x340 [<ffffffff81166293>] ? sys_newfstat+0x33/0x40 [<ffffffff81173571>] sys_ioctl+0xa1/0xb0 [<ffffffff814d70a9>] system_call_fastpath+0x16/0x1b
--- drivers/md/dm-mpath.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/md/dm-mpath.c +7 -4
@@ -1520,6 +1520,7 @@ static int multipath_ioctl(struct dm_tar unsigned long arg) {struct multipath *m = ti->private; +struct pgpath *pgpath;struct block_device *bdev;fmode_t mode;unsigned long flags;
@@ -1535,12 +1536,14 @@ again:if (!m->current_pgpath)__choose_pgpath (m,0 ); -if (m->current_pgpath) { - bdev = m->current_pgpath->path.dev->bdev; - mode = m->current_pgpath->path.dev->mode; + pgpath = m->current_pgpath; + +if (pgpath) { + bdev = pgpath->path.dev->bdev; + mode = pgpath->path.dev->mode; } -if (m->queue_io) +if ((pgpath && m->queue_io) || (!pgpath && m->queue_if_no_path)) r = -EAGAIN ;else if (!bdev) r = -EIO ;
Greg Kroah-Hartman
maintainerPATCH 3/58 dm: handle requests beyond end of device instead of using BUG_ON
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit ba1cbad93dd47223b1f3b8edd50dd9ef2abcb2ed upstream.
The access beyond the end of device BUG_ON that was introduced to dm_request_fn via commit 29e4013de7ad950280e4b2208 ("dm: implement REQ_FLUSH/FUA support for request-based dm") was an overly drastic (but simple) response to this situation.
I have received a report that this BUG_ON was hit and now think it would be better to use dm_kill_unmapped_request() to fail the clone and original request with -EIO.
map_request() will assign the valid target returned by dm_table_find_target to tio->ti. But when the target isn't valid tio->ti is never assigned (because map_request isn't called); so add a check for tio->ti != NULL to dm_done().
--- drivers/md/dm.c | 56 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 18 deletions(-)
drivers/md/dm.c +38 -18
@@ -865,10 +865,14 @@ static void dm_done(struct request *clon {int r = error;struct dm_rq_target_io *tio = clone->end_io_data; -dm_request_endio_fn rq_end_io = tio->ti->type->rq_end_io; +dm_request_endio_fn rq_end_io =NULL ; -if (mapped && rq_end_io) - r =rq_end_io (tio->ti, clone, error, &tio->info); +if (tio->ti) { + rq_end_io = tio->ti->type->rq_end_io; + +if (mapped && rq_end_io) + r =rq_end_io (tio->ti, clone, error, &tio->info); + }if (r <=0 )/* The target wants to complete the I/O */
@@ -1566,15 +1570,6 @@ static int map_request(struct dm_targetint r, requeued =0 ;struct dm_rq_target_io *tio = clone->end_io_data; -/* -* Hold the md reference here for the in-flight I/O. -* We can't rely on the reference count by device opener, -* because the device may be closed during the request completion -* when all bios are completed. -* See the comment in rq_completed() too. -*/ -dm_get (md); - tio->ti = ti; r = ti->type->map_rq (ti, clone, &tio->info);switch (r) {
@@ -1606,6 +1601,26 @@ static int map_request(struct dm_targetreturn requeued; } +static struct request *dm_start_request (struct mapped_device *md,struct request *orig) +{ +struct request *clone; + +blk_start_request (orig); + clone = orig->special; +atomic_inc (&md->pending[rq_data_dir (clone)]); + +/* +* Hold the md reference here for the in-flight I/O. +* We can't rely on the reference count by device opener, +* because the device may be closed during the request completion +* when all bios are completed. +* See the comment in rq_completed() too. +*/ +dm_get (md); + +return clone; +} +/* * q->request_fn for request-based dm. * Called with the queue lock held.
@@ -1635,14 +1650,21 @@ static void dm_request_fn(struct request pos =blk_rq_pos (rq); ti =dm_table_find_target (map, pos); -BUG_ON (!dm_target_is_valid (ti)); +if (!dm_target_is_valid (ti)) { +/* +* Must perform setup, that dm_done() requires, +* before calling dm_kill_unmapped_request +*/ +DMERR_LIMIT ("request attempted access beyond the end of device" ); + clone =dm_start_request (md, rq); +dm_kill_unmapped_request (clone, -EIO ); +continue ; + }if (ti->type->busy && ti->type->busy (ti)) goto delay_and_out; -blk_start_request (rq); - clone = rq->special; -atomic_inc (&md->pending[rq_data_dir (clone)]); + clone =dm_start_request (md, rq);spin_unlock (q->queue_lock);if (map_request (ti, clone, md))
@@ -1662,8 +1684,6 @@ delay_and_out:blk_delay_queue (q,HZ /10 ); out:dm_table_put (map); - -return ; }int dm_underlying_device_busy (struct request_queue *q)
Greg Kroah-Hartman
maintainerPATCH 4/58 dm table: clear add_random unless all devices have it set
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Milan Broz <[email protected]>
commit c3c4555edd10dbc0b388a0125b9c50de5e79af05 upstream.
Always clear QUEUE_FLAG_ADD_RANDOM if any underlying device does not have it set. Otherwise devices with predictable characteristics may contribute entropy.
QUEUE_FLAG_ADD_RANDOM specifies whether or not queue IO timings contribute to the random pool.
For bio-based targets this flag is always 0 because such devices have no real queue.
For request-based devices this flag was always set to 1 by default.
Now set it according to the flags on underlying devices. If there is at least one device which should not contribute, set the flag to zero: If a device, such as fast SSD storage, is not suitable for supplying entropy, a request-based queue stacked over it will not be either.
Because the checking logic is exactly same as for the rotational flag, share the iteration function with device_is_nonrot().
--- drivers/md/dm-table.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
drivers/md/dm-table.c +22 -4
@@ -1351,17 +1351,25 @@ static int device_is_nonrot(struct dm_tareturn q &&blk_queue_nonrot (q); } -static bool dm_table_is_nonrot (struct dm_table *t) +static int device_is_not_random (struct dm_target *ti,struct dm_dev *dev, +sector_t start,sector_t len,void *data) +{ +struct request_queue *q =bdev_get_queue (dev->bdev); + +return q && !blk_queue_add_random (q); +} + +static bool dm_table_all_devices_attribute (struct dm_table *t, +iterate_devices_callout_fn func) {struct dm_target *ti;unsigned i =0 ; -/* Ensure that all underlying device are non-rotational. */ while (i <dm_table_get_num_targets (t)) { ti =dm_table_get_target (t, i++);if (!ti->type->iterate_devices || - !ti->type->iterate_devices (ti, device_is_nonrot,NULL )) + !ti->type->iterate_devices (ti, func,NULL ))return 0 ; }
@@ -1393,7 +1401,8 @@ void dm_table_set_restrictions(struct dmif (!dm_table_discard_zeroes_data (t)) q->limits.discard_zeroes_data =0 ; -if (dm_table_is_nonrot (t)) +/* Ensure that all underlying devices are non-rotational. */ +if (dm_table_all_devices_attribute (t, device_is_nonrot))queue_flag_set_unlocked (QUEUE_FLAG_NONROT , q);else queue_flag_clear_unlocked (QUEUE_FLAG_NONROT , q);
@@ -1401,6 +1410,15 @@ void dm_table_set_restrictions(struct dmdm_table_set_integrity (t);/* +* Determine whether or not this queue's I/O timings contribute +* to the entropy pool, Only request-based targets use this. +* Clear QUEUE_FLAG_ADD_RANDOM if any underlying device does not +* have it set. +*/ +if (blk_queue_add_random (q) &&dm_table_all_devices_attribute (t, device_is_not_random)) +queue_flag_clear_unlocked (QUEUE_FLAG_ADD_RANDOM , q); + +/* * QUEUE_FLAG_STACKABLE must be set after all queue settings are * visible to other CPUs because, once the flag is set, incoming bios * are processed by request-based dm, which refers to the queue
Greg Kroah-Hartman
maintainerPATCH 5/58 dm verity: fix overflow check
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 1d55f6bcc0331d744cd5b56c4ee79e3809438161 upstream.
This patch fixes sector_t overflow checking in dm-verity.
Without this patch, the code checks for overflow only if sector_t is smaller than long long, not if sector_t and long long have the same size.
--- drivers/md/dm-verity.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/md/dm-verity.c +4 -4
@@ -718,8 +718,8 @@ static int verity_ctr(struct dm_target * v->hash_dev_block_bits =ffs (num) -1 ;if (sscanf (argv[5 ],"%llu%c" , &num_ll, &dummy) !=1 || - num_ll << (v->data_dev_block_bits -SECTOR_SHIFT ) != - (sector_t )num_ll << (v->data_dev_block_bits -SECTOR_SHIFT )) { + (sector_t)(num_ll << (v->data_dev_block_bits -SECTOR_SHIFT )) + >> (v->data_dev_block_bits -SECTOR_SHIFT ) != num_ll) { ti->error ="Invalid data blocks" ; r = -EINVAL ; goto bad;
@@ -733,8 +733,8 @@ static int verity_ctr(struct dm_target * }if (sscanf (argv[6 ],"%llu%c" , &num_ll, &dummy) !=1 || - num_ll << (v->hash_dev_block_bits -SECTOR_SHIFT ) != - (sector_t )num_ll << (v->hash_dev_block_bits -SECTOR_SHIFT )) { + (sector_t)(num_ll << (v->hash_dev_block_bits -SECTOR_SHIFT )) + >> (v->hash_dev_block_bits -SECTOR_SHIFT ) != num_ll) { ti->error ="Invalid hash start" ; r = -EINVAL ; goto bad;
Greg Kroah-Hartman
maintainerPATCH 6/58 usb: gadget: make g_printer enumerate again
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 5a175bb84d7344fbe5e26cf61b597129e7c80564 upstream.
This was broken in 2e87edf49 ("usb: gadget: make g_printer use composite").
The USB-strings were not setup properly and were not used. No function was added which results in an empty USB config.
While fixing this, the interface number is now auto generated and not hard coded to 0.
--- drivers/usb/gadget/printer.c | 128 +++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 63 deletions(-)
drivers/usb/gadget/printer.c +65 -63
@@ -141,18 +141,14 @@ module_param(qlen, uint, S_IRUGO|S_IWUSR* descriptors are built on demand. */ -#define STRING_MANUFACTURER 1 -#define STRING_PRODUCT 2 -#define STRING_SERIALNUM 3 +#define STRING_MANUFACTURER 0 +#define STRING_PRODUCT 1 +#define STRING_SERIALNUM 2/* holds our biggest descriptor */ #define USB_DESC_BUFSIZE 256#define USB_BUFSIZE 8192 -/* This device advertises one configuration. */ -#define DEV_CONFIG_VALUE 1 -#define PRINTER_INTERFACE 0 -static struct usb_device_descriptor device_desc = { .bLength =sizeof device_desc, .bDescriptorType =USB_DT_DEVICE ,
@@ -162,16 +158,12 @@ static struct usb_device_descriptor devi .bDeviceProtocol = 0, .idVendor = cpu_to_le16(PRINTER_VENDOR_NUM), .idProduct = cpu_to_le16(PRINTER_PRODUCT_NUM), - .iManufacturer = STRING_MANUFACTURER, - .iProduct = STRING_PRODUCT, - .iSerialNumber = STRING_SERIALNUM, .bNumConfigurations = 1 };static struct usb_interface_descriptor intf_desc = { .bLength =sizeof intf_desc, .bDescriptorType =USB_DT_INTERFACE , - .bInterfaceNumber =PRINTER_INTERFACE , .bNumEndpoints =2 , .bInterfaceClass =USB_CLASS_PRINTER , .bInterfaceSubClass =1 ,/* Printer Sub-Class */
@@ -260,9 +252,9 @@ static char pnp_string [1024] =/* static strings, in UTF-8 */ static struct usb_string strings [] = { - {STRING_MANUFACTURER , manufacturer, }, - {STRING_PRODUCT , product_desc, }, - {STRING_SERIALNUM , serial_num, }, + [STRING_MANUFACTURER ].s = manufacturer, + [STRING_PRODUCT ].s = product_desc, + [STRING_SERIALNUM ].s = serial_num, { }/* end of list */ };
@@ -871,25 +863,13 @@ static int set_interface(struct printer_int result =0 ;/* Free the current interface */ -switch (dev->interface) { -case PRINTER_INTERFACE : -printer_reset_interface (dev); -break ; - } +printer_reset_interface (dev); -switch (number) { -case PRINTER_INTERFACE : - result =set_printer_interface (dev); -if (result) { -printer_reset_interface (dev); - }else { - dev->interface =PRINTER_INTERFACE ; - } -break ; -default : - result = -EINVAL ; -/* FALL THROUGH */ - } + result =set_printer_interface (dev); +if (result) +printer_reset_interface (dev); +else + dev->interface = number;if (!result)INFO (dev,"Using interface %x\n" , number);
@@ -972,7 +952,7 @@ static int printer_func_setup(struct usbswitch (ctrl->bRequest) {case 0 :/* Get the IEEE-1284 PNP String */ /* Only one printer interface is supported. */ -if ((wIndex>>8 ) !=PRINTER_INTERFACE ) +if ((wIndex>>8 ) != dev->interface)break ; value = (pnp_string[0 ]<<8 )|pnp_string[1 ];
@@ -983,7 +963,7 @@ static int printer_func_setup(struct usbcase 1 :/* Get Port Status */ /* Only one printer interface is supported. */ -if (wIndex !=PRINTER_INTERFACE ) +if (wIndex != dev->interface)break ; *(u8 *)req->buf = dev->printer_status;
@@ -992,7 +972,7 @@ static int printer_func_setup(struct usbcase 2 :/* Soft Reset */ /* Only one printer interface is supported. */ -if (wIndex !=PRINTER_INTERFACE ) +if (wIndex != dev->interface)break ;printer_soft_reset (dev);
@@ -1020,6 +1000,37 @@ unknown:static int __init printer_func_bind (struct usb_configuration *c,struct usb_function *f) { + struct printer_dev *dev = container_of(f, struct printer_dev, function); +struct usb_composite_dev *cdev = c->cdev; +struct usb_ep *in_ep, *out_ep; +int id; + + id =usb_interface_id (c, f); +if (id <0 ) +return id; + intf_desc.bInterfaceNumber = id; + +/* all we really need is bulk IN/OUT */ + in_ep =usb_ep_autoconfig (cdev->gadget, &fs_ep_in_desc); +if (!in_ep) { +autoconf_fail: +dev_err (&cdev->gadget->dev,"can't autoconfigure on %s\n" , + cdev->gadget->name); +return -ENODEV ; + } + in_ep->driver_data = in_ep;/* claim */ + + out_ep =usb_ep_autoconfig (cdev->gadget, &fs_ep_out_desc); +if (!out_ep) + goto autoconf_fail; + out_ep->driver_data = out_ep;/* claim */ + +/* assumes that all endpoints are dual-speed */ + hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; + hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; + + dev->in_ep = in_ep; + dev->out_ep = out_ep;return 0 ; }
@@ -1035,7 +1046,8 @@ static int printer_func_set_alt(struct uint ret = -ENOTSUPP ;if (!alt) - ret =set_interface (dev,PRINTER_INTERFACE ); + ret =set_interface (dev, intf); +return ret; }
@@ -1107,13 +1119,14 @@ static int __init printer_bind_config(st {struct usb_gadget *gadget = c->cdev->gadget;struct printer_dev *dev; -struct usb_ep *in_ep, *out_ep;int status = -ENOMEM ;int gcnum;size_t len;u32 i;struct usb_request *req; +usb_ep_autoconfig_reset (gadget); + dev = &usb_printer_gadget; dev->function.name = shortname;
@@ -1125,6 +1138,10 @@ static int __init printer_bind_config(st dev->function.set_alt = printer_func_set_alt; dev->function.disable = printer_func_disable; + status =usb_add_function (c, &dev->function); +if (status) +return status; +/* Setup the sysfs files for the printer gadget. */ dev->pdev =device_create (usb_gadget_class,NULL , g_printer_devno,NULL ,"g_printer" );
@@ -1169,26 +1186,6 @@ static int __init printer_bind_config(st pnp_string[0 ] = (len >>8 ) &0xFF ; pnp_string[1 ] = len &0xFF ; -/* all we really need is bulk IN/OUT */ -usb_ep_autoconfig_reset (gadget); - in_ep =usb_ep_autoconfig (gadget, &fs_ep_in_desc); -if (!in_ep) { -autoconf_fail: -dev_err (&gadget->dev,"can't autoconfigure on %s\n" , - gadget->name); -return -ENODEV ; - } - in_ep->driver_data = in_ep;/* claim */ - - out_ep =usb_ep_autoconfig (gadget, &fs_ep_out_desc); -if (!out_ep) - goto autoconf_fail; - out_ep->driver_data = out_ep;/* claim */ - -/* assumes that all endpoints are dual-speed */ - hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; - hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; -usb_gadget_set_selfpowered (gadget);if (gadget->is_otg) {
@@ -1215,9 +1212,6 @@ autoconf_fail: dev->current_rx_bytes =0 ; dev->current_rx_buf =NULL ; - dev->in_ep = in_ep; - dev->out_ep = out_ep; -for (i =0 ; i <QLEN ; i++) { req =printer_req_alloc (dev->in_ep,USB_BUFSIZE ,GFP_KERNEL );if (!req) {
@@ -1250,8 +1244,6 @@ autoconf_fail: dev->gadget = gadget;INFO (dev,"%s, version: " DRIVER_VERSION "\n" , driver_desc); -INFO (dev,"using %s, OUT %s IN %s\n" , gadget->name, out_ep->name, - in_ep->name);return 0 ; fail:
@@ -1266,7 +1258,17 @@ static int printer_unbind(struct usb_comstatic int __init printer_bind (struct usb_composite_dev *cdev) { -return usb_add_config (cdev, &printer_cfg_driver, printer_bind_config); +int ret; + + ret =usb_string_ids_tab (cdev, strings); +if (ret <0 ) +return ret; + device_desc.iManufacturer = strings[STRING_MANUFACTURER ].id; + device_desc.iProduct = strings[STRING_PRODUCT ].id; + device_desc.iSerialNumber = strings[STRING_SERIALNUM ].id; + + ret =usb_add_config (cdev, &printer_cfg_driver, printer_bind_config); +return ret; }static struct usb_composite_driver printer_driver = {
Greg Kroah-Hartman
maintainerPATCH 7/58 usb: gadget: initialize the strings in tcm_usb_gadget properly
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 18786da4853017d983ff6911648543ca617c12d1 upstream.
I have no idea what I've been thinking while I was doing this in the first place. Now the strings are initialized properly and reported by lsusb.
--- drivers/usb/gadget/tcm_usb_gadget.c | 33 ++++++++++++++++++++------------- drivers/usb/gadget/tcm_usb_gadget.h | 14 ++++++++------ 2 files changed, 28 insertions(+), 19 deletions(-)
drivers/usb/gadget/tcm_usb_gadget.c +20 -13
@@ -1983,7 +1983,6 @@ static struct usb_interface_descriptor b .bInterfaceClass = USB_CLASS_MASS_STORAGE, .bInterfaceSubClass = USB_SC_SCSI, .bInterfaceProtocol = USB_PR_BULK, - .iInterface = USB_G_STR_INT_UAS, };static struct usb_interface_descriptor uasp_intf_desc = {
@@ -1994,7 +1993,6 @@ static struct usb_interface_descriptor u .bInterfaceClass = USB_CLASS_MASS_STORAGE, .bInterfaceSubClass = USB_SC_SCSI, .bInterfaceProtocol = USB_PR_UAS, - .iInterface = USB_G_STR_INT_BBB, };static struct usb_endpoint_descriptor uasp_bi_desc = {
@@ -2215,20 +2213,16 @@ static struct usb_device_descriptor usbg .bDeviceClass = USB_CLASS_PER_INTERFACE, .idVendor = cpu_to_le16(UAS_VENDOR_ID), .idProduct = cpu_to_le16(UAS_PRODUCT_ID), - .iManufacturer = USB_G_STR_MANUFACTOR, - .iProduct = USB_G_STR_PRODUCT, - .iSerialNumber = USB_G_STR_SERIAL, - .bNumConfigurations = 1, };static struct usb_string usbg_us_strings[] = { - {USB_G_STR_MANUFACTOR ,"Target Manufactor" }, - {USB_G_STR_PRODUCT ,"Target Product" }, - {USB_G_STR_SERIAL ,"000000000001" }, - {USB_G_STR_CONFIG ,"default config" }, - {USB_G_STR_INT_UAS ,"USB Attached SCSI" }, - {USB_G_STR_INT_BBB ,"Bulk Only Transport" }, + [USB_G_STR_MANUFACTOR ].s ="Target Manufactor" , + [USB_G_STR_PRODUCT ].s ="Target Product" , + [USB_G_STR_SERIAL ].s ="000000000001" , + [USB_G_STR_CONFIG ].s ="default config" , + [USB_G_STR_INT_UAS ].s ="USB Attached SCSI" , + [USB_G_STR_INT_BBB ].s ="Bulk Only Transport" , { }, };
@@ -2250,7 +2244,6 @@ static int guas_unbind(struct usb_composstatic struct usb_configuration usbg_config_driver = { .label ="Linux Target" , .bConfigurationValue =1 , - .iConfiguration =USB_G_STR_CONFIG , .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };
@@ -2423,6 +2416,9 @@ static int usbg_cfg_bind(struct usb_conf fu->function.disable = usbg_disable; fu->tpg = the_only_tpg_I_currently_have; + bot_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_BBB ].id; + uasp_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_UAS ].id; + ret =usb_add_function (c, &fu->function);if (ret) goto err;
@@ -2437,6 +2433,17 @@ static int usb_target_bind(struct usb_co {int ret; + ret =usb_string_ids_tab (cdev, usbg_us_strings); +if (ret) +return ret; + + usbg_device_desc.iManufacturer = + usbg_us_strings[USB_G_STR_MANUFACTOR ].id; + usbg_device_desc.iProduct = usbg_us_strings[USB_G_STR_PRODUCT ].id; + usbg_device_desc.iSerialNumber = usbg_us_strings[USB_G_STR_SERIAL ].id; + usbg_config_driver.iConfiguration = + usbg_us_strings[USB_G_STR_CONFIG ].id; + ret =usb_add_config (cdev, &usbg_config_driver, usbg_cfg_bind);return 0 ;
drivers/usb/gadget/tcm_usb_gadget.h +8 -6
@@ -16,12 +16,14 @@#define UASP_SS_EP_COMP_LOG_STREAMS 4#define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS) -#define USB_G_STR_MANUFACTOR 1 -#define USB_G_STR_PRODUCT 2 -#define USB_G_STR_SERIAL 3 -#define USB_G_STR_CONFIG 4 -#define USB_G_STR_INT_UAS 5 -#define USB_G_STR_INT_BBB 6 +enum { +USB_G_STR_MANUFACTOR , +USB_G_STR_PRODUCT , +USB_G_STR_SERIAL , +USB_G_STR_CONFIG , +USB_G_STR_INT_UAS , +USB_G_STR_INT_BBB , +};#define USB_G_ALT_INT_BBB 0#define USB_G_ALT_INT_UAS 1
Greg Kroah-Hartman
maintainerPATCH 8/58 USB: option: blacklist QMI interface on ZTE MF683
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit 160c9425ac52cb30502be2d9c5e848cec91bb115 upstream.
Interface #5 on ZTE MF683 is a QMI/wwan interface.
--- drivers/usb/serial/option.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/serial/option.c +2 -1
@@ -870,7 +870,8 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) },
Greg Kroah-Hartman
maintainerPATCH 9/58 USB: ftdi_sio: add TIAO USB Multi-Protocol Adapter (TUMPA) support
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Ospite <[email protected]>
commit 54575b05af36959dfb6a49a3e9ca0c2b456b7126 upstream.
TIAO/DIYGADGET USB Multi-Protocol Adapter (TUMPA) is an FTDI FT2232H based device which provides an easily accessible JTAG, SPI, I2C, serial breakout.
http://www.diygadget.com/tiao-usb-multi-protocol-adapter-jtag-spi-i2c-serial.html
http://www.tiaowiki.com/w/TIAO_USB_Multi_Protocol_Adapter_User%27s_Manual
FTDI FT2232H provides two serial channels (A and B), but on the TUMPA channel A is dedicated to JTAG/SPI while channel B can be used for UART/RS-232: use the ftdi_jtag_quirk to expose only channel B as a usb-serial interface to userspace.
--- drivers/usb/serial/ftdi_sio.c | 2 ++ drivers/usb/serial/ftdi_sio_ids.h | 5 +++++ 2 files changed, 7 insertions(+)
drivers/usb/serial/ftdi_sio.c +2 -0
@@ -584,6 +584,8 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },/* * ELV devices: */
drivers/usb/serial/ftdi_sio_ids.h +5 -0
@@ -517,6 +517,11 @@*/ #define FTDI_TAVIR_STK500_PID 0xFA33/* STK500 AVR programmer */ +/* +* TIAO product ids (FTDI_VID) +* http://www.tiaowiki.com/w/Main_Page +*/ +#define FTDI_TIAO_UMPA_PID 0x8a98/* TIAO/DIYGADGET USB Multi-Protocol Adapter */ /********************************/
Greg Kroah-Hartman
maintainerPATCH 10/58 USB: qcaux: add Pantech vendor class match
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit c638eb2872b3af079501e7ee44cbb8a5cce9b4b5 upstream.
The three Pantech devices UML190 (106c:3716), UML290 (106c:3718) and P4200 (106c:3721) all use the same subclasses to identify vendor specific functions. Replace the existing device specific entries with generic vendor matching, adding support for the P4200.
--- drivers/usb/serial/qcaux.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/usb/serial/qcaux.c +3 -7
@@ -36,8 +36,6 @@#define UTSTARCOM_PRODUCT_UM175_V1 0x3712#define UTSTARCOM_PRODUCT_UM175_V2 0x3714#define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 -#define PANTECH_PRODUCT_UML190_VZW 0x3716 -#define PANTECH_PRODUCT_UML290_VZW 0x3718/* CMOTECH devices */ #define CMOTECH_VENDOR_ID 0x16d8
@@ -68,11 +66,9 @@ static struct usb_device_id id_table[] = { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xfe, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfd, 0xff) }, /* NMEA */ - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfe, 0xff) }, /* WMC */ - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, /* DIAG */ + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */ + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */ + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */ { }, };MODULE_DEVICE_TABLE (usb, id_table);
Greg Kroah-Hartman
maintainerPATCH 11/58 usb: host: xhci: Fix Null pointer dereferencing with 71c731a for non-x86 systems
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vivek Gautam <[email protected]>
commit 457a73d346187c2cc5d599072f38676f18f130e0 upstream.
In 71c731a: usb: host: xhci: Fix Compliance Mode on SN65LVPE502CP Hardware when extracting DMI strings (vendor or product_name) to mark them as quirk we may get NULL pointer in case of non-x86 systems which won't define CONFIG_DMI. Hence susbsequent strstr() calls crash while driver probing.
So, returning 'false' here in case we get a NULL vendor or product_name.
This is tested with ARM (exynos) system.
This patch should be backported to stable kernels as old as 3.6, that contain the commit 71c731a296f1b08a3724bd1b514b64f1bda87a23 "usb: host:
xhci: Fix Compliance Mode on SN65LVPE502CP Hardware"
--- drivers/usb/host/xhci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/host/xhci.c +2 -0
@@ -470,6 +470,8 @@ static bool compliance_mode_recovery_tim dmi_product_name =dmi_get_system_info (DMI_PRODUCT_NAME ); dmi_sys_vendor =dmi_get_system_info (DMI_SYS_VENDOR ); +if (!dmi_product_name || !dmi_sys_vendor) +return false;if (!(strstr (dmi_sys_vendor,"Hewlett-Packard" )))return false;
Greg Kroah-Hartman
maintainerPATCH 12/58 USB: serial: fix up bug with missing {}
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 44b0f0836b62171617d56c6528c821ceaa6ea506 upstream.
As reported by Fengguang:
FYI, coccinelle warns about
drivers/usb/serial/usb-serial.c:1415:3-51: code aligned with following code on line 1416
vim +1415 drivers/usb/serial/usb-serial.c
1412 /* we only set the reset_resume field if the serial_driver has one */
1413 for (sd = serial_drivers; *sd; ++sd) {
1414 if ((*sd)->reset_resume)
Quoted 2 lines
1415
udriver->reset_resume=usb_serial_reset_resume;
1416 break;
1417 }
--- drivers/usb/serial/usb-serial.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/serial/usb-serial.c +2 -1
@@ -1426,9 +1426,10 @@ int usb_serial_register_drivers(struct u/* we only set the reset_resume field if the serial_driver has one */ for (sd = serial_drivers; *sd; ++sd) { -if ((*sd)->reset_resume) +if ((*sd)->reset_resume) { udriver->reset_resume = usb_serial_reset_resume;break ; + } } rc =usb_register (udriver);
Greg Kroah-Hartman
maintainerPATCH 13/58 staging: speakup_soft: Fix reading of init string
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 40fe4f89671fb3c7ded94190fb267402a38b0261 upstream.
softsynth_read() reads a character at a time from the init string; when it finds the null terminator it sets the initialized flag but then repeats the last character.
Additionally, if the read() buffer is not big enough for the init string, the next read() will start reading from the beginning again. So the caller may never progress to reading anything else.
Replace the simple initialized flag with the current position in the init string, carried over between calls. Switch to reading real data once this reaches the null terminator.
(This assumes that the length of the init string can't change, which seems to be the case. Really, the string and position belong together in a per-file private struct.)
--- drivers/staging/speakup/speakup_soft.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
drivers/staging/speakup/speakup_soft.c +4 -9
@@ -40,7 +40,7 @@ static int softsynth_is_alive(struct spkstatic unsigned char get_index (void );static struct miscdevice synth_device; -static int initialized; +static int init_pos;static int misc_registered;static struct var_t vars[] = {
@@ -194,7 +194,7 @@ static int softsynth_close(struct inodeunsigned long flags;spk_lock (flags); synth_soft.alive =0 ; - initialized =0 ; + init_pos =0 ;spk_unlock (flags);/* Make sure we let applications go before leaving */ speakup_start_ttys ();
@@ -239,13 +239,8 @@ static ssize_t softsynth_read(struct fil ch ='\x18' ; }else if (synth_buffer_empty ()) {break ; - }else if (!initialized) { -if (*init) { - ch = *init; - init++; - }else { - initialized =1 ; - } + }else if (init[init_pos]) { + ch = init[init_pos++]; }else { ch =synth_buffer_getc (); }
Greg Kroah-Hartman
maintainerPATCH 14/58 tty: keyboard.c: Remove locking from vt_get_leds.
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christopher Brannon <[email protected]>
commit 157a4b311c45c9aba75a990464d9680867dc8805 upstream.
There are three call sites for this function, and all three are called within a keyboard handler. kbd_event_lock is already held within keyboard handlers, so attempting to lock it in vt_get_leds causes deadlock.
--- drivers/tty/vt/keyboard.c | 3 --- 1 file changed, 3 deletions(-)
drivers/tty/vt/keyboard.c +0 -3
@@ -1049,13 +1049,10 @@ static int kbd_update_leds_helper(struct*/ int vt_get_leds (int console,int flag) { -unsigned long flags;struct kbd_struct * kbd = kbd_table + console;int ret; -spin_lock_irqsave (&kbd_event_lock, flags); ret =vc_kbd_led (kbd, flag); -spin_unlock_irqrestore (&kbd_event_lock, flags);return ret; }
Greg Kroah-Hartman
maintainerPATCH 15/58 staging: r8712u: Do not queue cloned skb
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit fa16e5ea25d7dd83f663f333e70713aa2fa5dffe upstream.
Some post-3.4 kernels have a problem when a cloned skb is used in the RX path. This patch handles one such case for r8712u.
The patch was suggested by Eric Dumazet.
--- drivers/staging/rtl8712/rtl8712_recv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/staging/rtl8712/rtl8712_recv.c +4 -1
@@ -1127,6 +1127,9 @@ static void recv_tasklet(void *priv)recvbuf2recvframe (padapter, pskb);skb_reset_tail_pointer (pskb); pskb->len =0 ; -skb_queue_tail (&precvpriv->free_recv_skb_queue, pskb); +if (!skb_cloned (pskb)) +skb_queue_tail (&precvpriv->free_recv_skb_queue, pskb); +else +consume_skb (pskb); } }
Greg Kroah-Hartman
maintainerPATCH 16/58 staging: comedi: s626: dont dereference insn->data
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit b655c2c4782ed3e2e71d2608154e295a3e860311 upstream.
s626_enc_insn_config() is incorrectly dereferencing insn->data which is a pointer to user memory. It should be dereferencing the separate data parameter that points to a copy of the data in kernel memory.
--- drivers/staging/comedi/drivers/s626.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/comedi/drivers/s626.c +1 -1
@@ -2311,7 +2311,7 @@ static int s626_enc_insn_config(struct c/* (data==NULL) ? (Preloadvalue=0) : (Preloadvalue=data[0]); */ k->SetMode (dev, k, Setup, TRUE); -Preload (dev, k, *(insn->data)); +Preload (dev, k, data[0 ]); k->PulseIndex (dev, k);SetLatchSource (dev, k, valueSrclatch); k->SetEnable (dev, k, (uint16_t ) (enab !=0 ));
Greg Kroah-Hartman
maintainerPATCH 17/58 staging: comedi: jr3_pci: fix iomem dereference
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit e1878957b4676a17cf398f7f5723b365e9a2ca48 upstream.
Correct a direct dereference of I/O memory to use an appropriate I/O memory access function. Note that the pointer being dereferenced is not currently tagged with __iomem but I plan to correct that for 3.7.
--- drivers/staging/comedi/drivers/jr3_pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/comedi/drivers/jr3_pci.c +1 -1
@@ -883,7 +883,7 @@ static int jr3_pci_attach(struct comedi_ }/* Reset DSP card */ - devpriv->iobase->channel[0 ].reset =0 ; +writel (0 , &devpriv->iobase->channel[0 ].reset); result =comedi_load_firmware (dev,"jr3pci.idm" , jr3_download_firmware);dev_dbg (dev->hw_dev,"Firmare load %d\n" , result);
Greg Kroah-Hartman
maintainerPATCH 18/58 staging: comedi: dont dereference user memory for INSN_INTTRIG
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit 5d06e3df280bd230e2eadc16372e62818c63e894 upstream.
parse_insn() is dereferencing the user-space pointer insn->data directly when handling the INSN_INTTRIG comedi instruction. It shouldn't be using insn->data at all; it should be using the separate data pointer passed to the function. Fix it.
--- drivers/staging/comedi/comedi_fops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/comedi/comedi_fops.c +1 -1
@@ -1132,7 +1132,7 @@ static int parse_insn(struct comedi_devi ret = -EAGAIN ;break ; } - ret = s->async->inttrig (dev, s, insn->data[0 ]); + ret = s->async->inttrig (dev, s, data[0 ]);if (ret >=0 ) ret =1 ;break ;
Greg Kroah-Hartman
maintainerPATCH 19/58 staging: comedi: fix memory leak for saved channel list
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit c8cad4c89ee3b15935c532210ae6ebb5c0a2734d upstream.
When do_cmd_ioctl() allocates memory for the kernel copy of a channel list, it frees any previously allocated channel list in async->cmd.chanlist and replaces it with the new one. However, if the device is ever removed (or "detached") the cleanup code in cleanup_device() in "drivers.c" does not free this memory so it is lost.
A sensible place to free the kernel copy of the channel list is in do_become_nonbusy() as at that point the comedi asynchronous command associated with the channel list is no longer valid. Free the channel list in do_become_nonbusy() instead of do_cmd_ioctl() and clear the pointer to prevent it being freed more than once.
Note that cleanup_device() could be called at an inappropriate time while the comedi device is open, but that's a separate bug not related to this this patch.
--- drivers/staging/comedi/comedi_fops.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/staging/comedi/comedi_fops.c +2 -1
@@ -1377,7 +1377,6 @@ static int do_cmd_ioctl(struct comedi_de goto cleanup; } -kfree (async->cmd.chanlist); async->cmd = user_cmd; async->cmd.data =NULL ;/* load channel/gain list */
@@ -2122,6 +2121,8 @@ void do_become_nonbusy(struct comedi_devif (async) {comedi_reset_async_buf (async); async->inttrig =NULL ; +kfree (async->cmd.chanlist); + async->cmd.chanlist =NULL ; }else {printk (KERN_ERR "BUG: (?) do_become_nonbusy called with async=0\n" );
Greg Kroah-Hartman
maintainerPATCH 20/58 Remove BUG_ON from n_tty_read()
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Kozina <[email protected]>
commit e9490e93c1978b6669f3e993caa3189be13ce459 upstream.
Change the BUG_ON to WARN_ON and return in case of tty->read_buf==NULL. We want to track a couple of long standing reports of this but at the same time we can avoid killing the box.
--- drivers/tty/n_tty.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/tty/n_tty.c +2 -1
@@ -1728,7 +1728,8 @@ static ssize_t n_tty_read(struct tty_str do_it_again: -BUG_ON (!tty->read_buf); +if (WARN_ON (!tty->read_buf)) +return -EAGAIN ; c =job_control (tty, file);if (c <0 )
Greg Kroah-Hartman
maintainerPATCH 21/58 TTY: ttyprintk, dont touch behind tty->write_buf
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Slaby <[email protected]>
commit ee8b593affdf893012e57f4c54a21984d1b0d92e upstream.
If a user provides a buffer larger than a tty->write_buf chunk and passes '\r' at the end of the buffer, we touch an out-of-bound memory.
Add a check there to prevent this.
--- drivers/char/ttyprintk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/ttyprintk.c +1 -1
@@ -67,7 +67,7 @@ static int tpk_printk(const unsigned cha tmp[tpk_curr +1 ] ='\0' ;printk (KERN_INFO "%s%s" , tpk_tag, tmp); tpk_curr =0 ; -if (buf[i +1 ] =='\n' ) +if ((i +1 ) < count && buf[i +1 ] =='\n' ) i++;break ;case '\n' :
Greg Kroah-Hartman
maintainerPATCH 22/58 serial: omap: fix software flow control
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vikram Pandita <[email protected]>
commit 957ee7270d632245b43f6feb0e70d9a5e9ea6cf6 upstream.
Software flow control register bits were not defined correctly.
Also clarify the IXON and IXOFF logic to reflect what userspace wants.
--- arch/arm/plat-omap/include/plat/omap-serial.h | 4 ++-- drivers/tty/serial/omap-serial.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-)
arch/arm/plat-omap/include/plat/omap-serial.h +2 -2
@@ -42,10 +42,10 @@#define OMAP_UART_WER_MOD_WKUP 0X7F/* Enable XON/XOFF flow control on output */ -#define OMAP_UART_SW_TX 0x04 +#define OMAP_UART_SW_TX 0x8/* Enable XON/XOFF flow control on input */ -#define OMAP_UART_SW_RX 0x04 +#define OMAP_UART_SW_RX 0x2#define OMAP_UART_SYSC_RESET 0X07#define OMAP_UART_TCR_TRIG 0X0F
drivers/tty/serial/omap-serial.c +6 -6
@@ -667,19 +667,19 @@ serial_omap_configure_xonxoff/* * IXON Flag: -* Enable XON/XOFF flow control on output. -* Transmit XON1, XOFF1 +* Flow control for OMAP.TX +* OMAP.RX should listen for XON/XOFF */ if (termios->c_iflag &IXON ) - up->efr |=OMAP_UART_SW_TX ; + up->efr |=OMAP_UART_SW_RX ;/* * IXOFF Flag: -* Enable XON/XOFF flow control on input. -* Receiver compares XON1, XOFF1. +* Flow control for OMAP.RX +* OMAP.TX should send XON/XOFF */ if (termios->c_iflag &IXOFF ) - up->efr |=OMAP_UART_SW_RX ; + up->efr |=OMAP_UART_SW_TX ;serial_out (up,UART_EFR , up->efr |UART_EFR_ECB );serial_out (up,UART_LCR ,UART_LCR_CONF_MODE_A );
Greg Kroah-Hartman
maintainerPATCH 23/58 serial: pl011: handle corruption at high clock speeds
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit c5dd553b9fd069892c9e2de734f4f604e280fa7a upstream.
This works around a few glitches in the ST version of the PL011 serial driver when using very high baud rates, as we do in the
Ux500: 3, 3.25, 4 and 4.05 Mbps.
Problem Observed/rootcause:
When using high baud-rates, and the baudrate*8 is getting close to the provided clock frequency (so a division factor close to 1), when using bursts of characters (so they are abutted), then it seems as if there is not enough time to detect the beginning of the start-bit which is a timing reference for the entire character, and thus the sampling moment of character bits is moving towards the end of each bit, instead of the middle.
Fix:
Increase slightly the RX baud rate of the UART above the theoretical baudrate by 5%. This will definitely give more margin time to the UART_RX to correctly sample the data at the middle of the bit period.
Also fix the ages old copy-paste error in the very stressed comment, it's referencing the registers used in the PL010 driver rather than the PL011 ones.
--- drivers/tty/serial/amba-pl011.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/tty/serial/amba-pl011.c +14 -1
@@ -1603,13 +1603,26 @@ pl011_set_termios(struct uart_port *port old_cr &= ~ST_UART011_CR_OVSFACT ; } +/* +* Workaround for the ST Micro oversampling variants to +* increase the bitrate slightly, by lowering the divisor, +* to avoid delayed sampling of start bit at high speeds, +* else we see data corruption. +*/ +if (uap->vendor->oversampling) { +if ((baud >=3000000 ) && (baud <3250000 ) && (quot >1 )) + quot -=1 ; +else if ((baud >3250000 ) && (quot >2 )) + quot -=2 ; + }/* Set baud rate */ writew (quot &0x3f , port->membase +UART011_FBRD );writew (quot >>6 , port->membase +UART011_IBRD );/* * ----------v----------v----------v----------v----- -* NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L +* NOTE: lcrh_tx and lcrh_rx MUST BE WRITTEN AFTER +* UART011_FBRD & UART011_IBRD. * ----------^----------^----------^----------^----- */ writew (lcr_h, port->membase + uap->lcrh_rx);
Greg Kroah-Hartman
maintainerPATCH 24/58 serial: set correct baud_base for EXSYS EX-41092 Dual 16950
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Flavio Leitner <[email protected]>
commit 26e8220adb0aec43b7acafa0f1431760eee28522 upstream.
Apparently the same card model has two IDs, so this patch complements the commit 39aced68d664291db3324d0fcf0985ab5626aac2 adding the missing one.
--- drivers/tty/serial/8250/8250_pci.c | 9 +++++++-- include/linux/pci_ids.h | 1 - 2 files changed, 7 insertions(+), 3 deletions(-)
drivers/tty/serial/8250/8250_pci.c +7 -2
@@ -1164,6 +1164,8 @@ pci_xr17c154_setup(struct serial_private#define PCI_SUBDEVICE_ID_OCTPRO422 0x0208#define PCI_SUBDEVICE_ID_POCTAL232 0x0308#define PCI_SUBDEVICE_ID_POCTAL422 0x0408 +#define PCI_SUBDEVICE_ID_SIIG_DUAL_00 0x2500 +#define PCI_SUBDEVICE_ID_SIIG_DUAL_30 0x2530#define PCI_VENDOR_ID_ADVANTECH 0x13fe#define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66#define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620
@@ -3232,8 +3234,11 @@ static struct pci_device_id serial_pci_t* For now just used the hex ID 0x950a. */ {PCI_VENDOR_ID_OXSEMI ,0x950a , -PCI_SUBVENDOR_ID_SIIG ,PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL ,0 ,0 , - pbn_b0_2_115200 }, +PCI_SUBVENDOR_ID_SIIG ,PCI_SUBDEVICE_ID_SIIG_DUAL_00 , + 0, 0, pbn_b0_2_115200 }, + { PCI_VENDOR_ID_OXSEMI, 0x950a, +PCI_SUBVENDOR_ID_SIIG ,PCI_SUBDEVICE_ID_SIIG_DUAL_30 , + 0, 0, pbn_b0_2_115200 }, { PCI_VENDOR_ID_OXSEMI, 0x950a,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_b0_2_1130000 },
include/linux/pci_ids.h +0 -1
@@ -1846,7 +1846,6 @@#define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081#define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082#define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050 -#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530#define PCI_VENDOR_ID_RADISYS 0x1331
Greg Kroah-Hartman
maintainerPATCH 25/58 tools/hv: Fix file handle leak
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit d5ab482799e7c4c4b7c0aa67e8710dce28115d03 upstream.
Match up each fopen() with an fclose().
--- tools/hv/hv_kvp_daemon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/hv/hv_kvp_daemon.c +2 -1
@@ -144,7 +144,7 @@ static void kvp_update_file(int pool)sizeof (struct kvp_record ), kvp_file_info[pool].num_records, filep); -fflush (filep); +fclose (filep);kvp_release_lock (pool); }
@@ -191,6 +191,7 @@ static void kvp_update_mem_state(int poo kvp_file_info[pool].records = record; kvp_file_info[pool].num_records = records_read; +fclose (filep);kvp_release_lock (pool); }static int kvp_file_init (void )
Greg Kroah-Hartman
maintainerPATCH 26/58 tools/hv: Fix exit() error code
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 6bb22fea25624ab593eee376fa5fb82d1b13f45a upstream.
Linux native exit codes are 8-bit unsigned values. exit(-1) results in an exit code of 255, which is usually reserved for shells reporting 'command not found'. Use the portable value EXIT_FAILURE. (Not that this matters much for a daemon.)
--- tools/hv/hv_kvp_daemon.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
tools/hv/hv_kvp_daemon.c +11 -11
@@ -106,7 +106,7 @@ static void kvp_acquire_lock(int pool)if (fcntl (kvp_file_info[pool].fd,F_SETLKW , &fl) ==-1 ) {syslog (LOG_ERR ,"Failed to acquire the lock pool: %d" , pool); -exit (-1 ); +exit (EXIT_FAILURE ); } }
@@ -118,7 +118,7 @@ static void kvp_release_lock(int pool)if (fcntl (kvp_file_info[pool].fd,F_SETLK , &fl) ==-1 ) {perror ("fcntl" );syslog (LOG_ERR ,"Failed to release the lock pool: %d" , pool); -exit (-1 ); +exit (EXIT_FAILURE ); } }
@@ -137,7 +137,7 @@ static void kvp_update_file(int pool)if (!filep) {kvp_release_lock (pool);syslog (LOG_ERR ,"Failed to open file, pool: %d" , pool); -exit (-1 ); +exit (EXIT_FAILURE ); } bytes_written = fwrite(kvp_file_info[pool].records,
@@ -163,7 +163,7 @@ static void kvp_update_mem_state(int pooif (!filep) {kvp_release_lock (pool);syslog (LOG_ERR ,"Failed to open file, pool: %d" , pool); -exit (-1 ); +exit (EXIT_FAILURE ); }while (!feof (filep)) { readp = &record[records_read];
@@ -180,7 +180,7 @@ static void kvp_update_mem_state(int pooif (record ==NULL ) {syslog (LOG_ERR ,"malloc failed" ); -exit (-1 ); +exit (EXIT_FAILURE ); }continue ; }
@@ -209,7 +209,7 @@ static int kvp_file_init(void)if (access ("/var/opt/hyperv" ,F_OK )) {if (mkdir ("/var/opt/hyperv" ,S_IRUSR |S_IWUSR |S_IROTH )) {syslog (LOG_ERR ," Failed to create /var/opt/hyperv" ); -exit (-1 ); +exit (EXIT_FAILURE ); } }
@@ -658,13 +658,13 @@ int main(void)if (kvp_file_init ()) {syslog (LOG_ERR ,"Failed to initialize the pools" ); -exit (-1 ); +exit (EXIT_FAILURE ); } fd =socket (AF_NETLINK ,SOCK_DGRAM ,NETLINK_CONNECTOR );if (fd <0 ) {syslog (LOG_ERR ,"netlink socket creation failed; error:%d" , fd); -exit (-1 ); +exit (EXIT_FAILURE ); } addr.nl_family =AF_NETLINK ; addr.nl_pad =0 ;
@@ -676,7 +676,7 @@ int main(void)if (error <0 ) {syslog (LOG_ERR ,"bind failed; error:%d" , error);close (fd); -exit (-1 ); +exit (EXIT_FAILURE ); } sock_opt = addr.nl_groups;setsockopt (fd,270 ,1 , &sock_opt,sizeof (sock_opt));
@@ -696,7 +696,7 @@ int main(void)if (len <0 ) {syslog (LOG_ERR ,"netlink_send failed; error:%d" , len);close (fd); -exit (-1 ); +exit (EXIT_FAILURE ); } pfd.fd = fd;
@@ -864,7 +864,7 @@ kvp_done: len =netlink_send (fd, incoming_cn_msg);if (len <0 ) {syslog (LOG_ERR ,"net_link send failed; error:%d" , len); -exit (-1 ); +exit (EXIT_FAILURE ); } }
Greg Kroah-Hartman
maintainerPATCH 27/58 tools/hv: Check for read/write errors
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 436473bc2173499ae274d0f50111d1e355006caf upstream.
hv_kvp_daemon currently does not check whether fread() or fwrite() succeed. Add the necessary checks. Also, remove the incorrect use of feof() before fread().
--- tools/hv/hv_kvp_daemon.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
tools/hv/hv_kvp_daemon.c +19 -3
@@ -144,7 +144,12 @@ static void kvp_update_file(int pool)sizeof (struct kvp_record ), kvp_file_info[pool].num_records, filep); -fclose (filep); +if (ferror (filep) ||fclose (filep)) { +kvp_release_lock (pool); +syslog (LOG_ERR ,"Failed to write file, pool: %d" , pool); +exit (EXIT_FAILURE ); + } +kvp_release_lock (pool); }
@@ -165,12 +170,17 @@ static void kvp_update_mem_state(int poosyslog (LOG_ERR ,"Failed to open file, pool: %d" , pool);exit (EXIT_FAILURE ); } -while (!feof (filep)) { +for (;;) { readp = &record[records_read]; records_read +=fread (readp,sizeof (struct kvp_record ),ENTRIES_PER_BLOCK * num_blocks, filep); +if (ferror (filep)) { +syslog (LOG_ERR ,"Failed to read file, pool: %d" , pool); +exit (EXIT_FAILURE ); + } +if (!feof (filep)) {/* * We have more data to read.
@@ -233,12 +243,18 @@ static int kvp_file_init(void)fclose (filep);return 1 ; } -while (!feof (filep)) { +for (;;) { readp = &record[records_read]; records_read +=fread (readp,sizeof (struct kvp_record ),ENTRIES_PER_BLOCK , filep); +if (ferror (filep)) { +syslog (LOG_ERR ,"Failed to read file, pool: %d" , + i); +exit (EXIT_FAILURE ); + } +if (!feof (filep)) {/* * We have more data to read.
Greg Kroah-Hartman
maintainerPATCH 28/58 b43legacy: Fix crash on unload when firmware not available
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 2d838bb608e2d1f6cb4280e76748cb812dc822e7 upstream.
When b43legacy is loaded without the firmware being available, a following unload generates a kernel NULL pointer dereference BUG as follows:
[ 214.330789] BUG: unable to handle kernel NULL pointer dereference at 0000004c [ 214.330997] IP: [<c104c395>] drain_workqueue+0x15/0x170 [ 214.331179] *pde = 00000000 [ 214.331311] Oops: 0000 [#1] SMP [ 214.331471] Modules linked in: b43legacy(-) ssb pcmcia mac80211 cfg80211 af_packet mperf arc4 ppdev sr_mod cdrom sg shpchp yenta_socket pcmcia_rsrc pci_hotplug pcmcia_core battery parport_pc parport floppy container ac button edd autofs4 ohci_hcd ehci_hcd usbcore usb_common thermal processor scsi_dh_rdac scsi_dh_hp_sw scsi_dh_emc scsi_dh_alua scsi_dh fan thermal_sys hwmon ata_generic pata_ali libata [last unloaded: cfg80211] [ 214.333421] Pid: 3639, comm: modprobe Not tainted 3.6.0-rc6-wl+ #163 Source Technology VIC 9921/ALI Based Notebook [ 214.333580] EIP: 0060:[<c104c395>] EFLAGS: 00010246 CPU: 0 [ 214.333687] EIP is at drain_workqueue+0x15/0x170 [ 214.333788] EAX: c162ac40 EBX: cdfb8360 ECX: 0000002a EDX: 00002a2a [ 214.333890] ESI: 00000000 EDI: 00000000 EBP: cd767e7c ESP: cd767e5c [ 214.333957] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 [ 214.333957] CR0: 8005003b CR2: 0000004c CR3: 0c96a000 CR4: 00000090 [ 214.333957] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 214.333957] DR6: ffff0ff0 DR7: 00000400 [ 214.333957] Process modprobe (pid: 3639, ti=cd766000 task=cf802e90 task.ti=cd766000) [ 214.333957] Stack: [ 214.333957] 00000292 cd767e74 c12c5e09 00000296 00000296 cdfb8360 cdfb9220 00000000 [ 214.333957] cd767e90 c104c4fd cdfb8360 cdfb9220 cd682800 cd767ea4 d0c10184 cd682800 [ 214.333957] cd767ea4 cba31064 cd767eb8 d0867908 cba31064 d087e09c cd96f034 cd767ec4 [ 214.333957] Call Trace: [ 214.333957] [<c12c5e09>] ? skb_dequeue+0x49/0x60 [ 214.333957] [<c104c4fd>] destroy_workqueue+0xd/0x150 [ 214.333957] [<d0c10184>] ieee80211_unregister_hw+0xc4/0x100 [mac80211] [ 214.333957] [<d0867908>] b43legacy_remove+0x78/0x80 [b43legacy] [ 214.333957] [<d083654d>] ssb_device_remove+0x1d/0x30 [ssb] [ 214.333957] [<c126f15a>] __device_release_driver+0x5a/0xb0 [ 214.333957] [<c126fb07>] driver_detach+0x87/0x90 [ 214.333957] [<c126ef4c>] bus_remove_driver+0x6c/0xe0 [ 214.333957] [<c1270120>] driver_unregister+0x40/0x70 [ 214.333957] [<d083686b>] ssb_driver_unregister+0xb/0x10 [ssb] [ 214.333957] [<d087c488>] b43legacy_exit+0xd/0xf [b43legacy] [ 214.333957] [<c1089dde>] sys_delete_module+0x14e/0x2b0 [ 214.333957] [<c110a4a7>] ? vfs_write+0xf7/0x150 [ 214.333957] [<c1240050>] ? tty_write_lock+0x50/0x50 [ 214.333957] [<c110a6f8>] ? sys_write+0x38/0x70 [ 214.333957] [<c1397c55>] syscall_call+0x7/0xb [ 214.333957] Code: bc 27 00 00 00 00 a1 74 61 56 c1 55 89 e5 e8 a3 fc ff ff 5d c3 90 55 89 e5 57 56 89 c6 53 b8 40 ac 62 c1 83 ec 14 e8 bb b7 34 00 <8b> 46 4c 8d 50 01 85 c0 89 56 4c 75 03 83 0e 40 80 05 40 ac 62 [ 214.333957] EIP: [<c104c395>] drain_workqueue+0x15/0x170 SS:ESP 0068:cd767e5c [ 214.333957] CR2: 000000000000004c [ 214.341110] ---[ end trace c7e90ec026d875a6 ]---Index: wireless-testing/drivers/net/wireless/b43legacy/main.c
The problem is fixed by making certain that the ucode pointer is not NULL before deregistering the driver in mac80211.
--- drivers/net/wireless/b43legacy/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/b43legacy/main.c +2 -0
@@ -3894,6 +3894,8 @@ static void b43legacy_remove(struct ssb_cancel_work_sync (&wl->firmware_load);B43legacy_WARN_ON (!wl); +if (!wldev->fw.ucode) +return ;/* NULL if fw never loaded */ if (wl->current_dev == wldev)ieee80211_unregister_hw (wl->hw);
Greg Kroah-Hartman
maintainerPATCH 29/58 firmware: Add missing attributes to EFI variable attribute print out from sysfs
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Khalid Aziz <[email protected]>
commit 7083909023bbe29b3176e92d2d089def1aa7aa1e upstream.
Some of the EFI variable attributes are missing from print out from /sys/firmware/efi/vars/*/attributes. This patch adds those in. It also updates code to use pre-defined constants for masking current value of attributes.
--- drivers/firmware/efivars.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/firmware/efivars.c +14 -3
@@ -435,12 +435,23 @@ efivar_attr_read(struct efivar_entry *enif (status !=EFI_SUCCESS )return -EIO ; -if (var->Attributes &0x1 ) +if (var->Attributes &EFI_VARIABLE_NON_VOLATILE ) str +=sprintf (str,"EFI_VARIABLE_NON_VOLATILE\n" ); -if (var->Attributes &0x2 ) +if (var->Attributes &EFI_VARIABLE_BOOTSERVICE_ACCESS ) str +=sprintf (str,"EFI_VARIABLE_BOOTSERVICE_ACCESS\n" ); -if (var->Attributes &0x4 ) +if (var->Attributes &EFI_VARIABLE_RUNTIME_ACCESS ) str +=sprintf (str,"EFI_VARIABLE_RUNTIME_ACCESS\n" ); +if (var->Attributes &EFI_VARIABLE_HARDWARE_ERROR_RECORD ) + str +=sprintf (str,"EFI_VARIABLE_HARDWARE_ERROR_RECORD\n" ); +if (var->Attributes &EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS ) + str +=sprintf (str, +"EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS\n" ); +if (var->Attributes & +EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS ) + str +=sprintf (str, +"EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS\n" ); +if (var->Attributes &EFI_VARIABLE_APPEND_WRITE ) + str +=sprintf (str,"EFI_VARIABLE_APPEND_WRITE\n" );return str - buf; }
Greg Kroah-Hartman
maintainerPATCH 30/58 xhci: Intel Panther Point BEI quirk.
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarah Sharp <[email protected]>
commit 80fab3b244a22e0ca539d2439bdda50e81e5666f upstream.
When a device with an isochronous endpoint is behind a hub plugged into the Intel Panther Point xHCI host controller, and the driver submits multiple frames per URB, the xHCI driver will set the Block Event Interrupt (BEI) flag on all but the last TD for the URB. This causes the host controller to place an event on the event ring, but not send an interrupt. When the last TD for the URB completes, BEI is cleared, and we get an interrupt for the whole URB.
However, under a Panther Point xHCI host controller, if the parent hub is unplugged when one or more events from transfers with BEI set are on the event ring, a port status change event is placed on the event ring, but no interrupt is generated. This means URBs stop completing, and the USB device disconnect is not noticed. Something like a USB headset will cause mplayer to hang when the device is disconnected.
If another transfer is sent (such as running sudo lsusb -v), the next transfer event seems to "unstick" the event ring, the xHCI driver gets an interrupt, and the disconnect is reported to the USB core.
The fix is not to use the BEI flag under the Panther Point xHCI host. This will impact power consumption and system responsiveness, because the xHCI driver will receive an interrupt for every frame in all isochronous URBs instead of once per URB.
Intel chipset developers confirm that this bug will be hit if the BEI flag is used on any endpoint, not just ones that are behind a hub.
This patch should be backported to kernels as old as 3.0, that contain the commit 69e848c2090aebba5698a1620604c7dccb448684 "Intel xhci: Support EHCI/xHCI port switching."
--- drivers/usb/host/xhci-pci.c | 1 + drivers/usb/host/xhci-ring.c | 4 +++- drivers/usb/host/xhci.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-pci.c +1 -0
@@ -103,6 +103,7 @@ static void xhci_pci_quirks(struct devic* PPT chipsets. */ xhci->quirks |=XHCI_SPURIOUS_REBOOT ; + xhci->quirks |=XHCI_AVOID_BEI ; }if (pdev->vendor ==PCI_VENDOR_ID_ETRON && pdev->device ==PCI_DEVICE_ID_ASROCK_P67 ) {
drivers/usb/host/xhci-ring.c +3 -1
@@ -3400,7 +3400,9 @@ static int xhci_queue_isoc_tx(struct xhc }else { td->last_trb = ep_ring->enqueue; field |=TRB_IOC ; -if (xhci->hci_version ==0x100 ) { +if (xhci->hci_version ==0x100 && + !(xhci->quirks & +XHCI_AVOID_BEI )) {/* Set BEI bit except for the last td */ if (i < num_tds -1 ) field |=TRB_BEI ;
drivers/usb/host/xhci.h +1 -0
@@ -1496,6 +1496,7 @@ struct xhci_hcd {#define XHCI_INTEL_HOST (1 << 12)#define XHCI_SPURIOUS_REBOOT (1 << 13)#define XHCI_COMP_MODE_QUIRK (1 << 14) +#define XHCI_AVOID_BEI (1 << 15)unsigned int num_active_eps;unsigned int limit_active_eps;/* There are two roothubs to keep track of bus suspend info for */
Greg Kroah-Hartman
maintainerPATCH 31/58 xHCI: add cmd_ring_state
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elric Fu <[email protected]>
commit c181bc5b5d5c79b71203cd10cef97f802fb6f9c1 upstream.
Adding cmd_ring_state for command ring. It helps to verify the current command ring state for controlling the command ring operations.
This patch should be backported to kernels as old as 3.0. The commit 7ed603ecf8b68ab81f4c83097d3063d43ec73bb8 "xhci: Add an assertion to check for virt_dev=0 bug." papers over the NULL pointer dereference that I now believe is related to a timed out Set Address command. This (and the four patches that follow it) contain the real fix that also allows VIA USB 3.0 hubs to consistently re-enumerate during the plug/unplug stress tests.
--- drivers/usb/host/xhci-ring.c | 3 +++ drivers/usb/host/xhci.c | 6 ++++-- drivers/usb/host/xhci.h | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-ring.c +3 -0
@@ -280,6 +280,9 @@ static inline int room_on_ring(struct xh/* Ring the host controller doorbell after placing a command on the ring */ void xhci_ring_cmd_db (struct xhci_hcd *xhci) { +if (!(xhci->cmd_ring_state &CMD_RING_STATE_RUNNING )) +return ; +xhci_dbg (xhci,"// Ding dong!\n" );xhci_writel (xhci,DB_VALUE_HOST , &xhci->dba->doorbell[0 ]);/* Flush PCI posted writes */
drivers/usb/host/xhci.c +4 -2
@@ -105,9 +105,10 @@ int xhci_halt(struct xhci_hcd *xhci) ret =handshake (xhci, &xhci->op_regs->status,STS_HALT ,STS_HALT ,XHCI_MAX_HALT_USEC ); -if (!ret) +if (!ret) { xhci->xhc_state |=XHCI_STATE_HALTED ; -else + xhci->cmd_ring_state =CMD_RING_STATE_STOPPED ; + }else xhci_warn (xhci,"Host not halted after %u microseconds.\n" ,XHCI_MAX_HALT_USEC );return ret;
@@ -583,6 +584,7 @@ static int xhci_run_finished(struct xhcireturn -ENODEV ; } xhci->shared_hcd->state =HC_STATE_RUNNING ; + xhci->cmd_ring_state =CMD_RING_STATE_RUNNING ;if (xhci->quirks &XHCI_NEC_HOST )xhci_ring_cmd_db (xhci);
drivers/usb/host/xhci.h +4 -0
@@ -1421,6 +1421,10 @@ struct xhci_hcd {/* data structures */ struct xhci_device_context_array *dcbaa;struct xhci_ring *cmd_ring; +unsigned int cmd_ring_state; +#define CMD_RING_STATE_RUNNING (1 << 0) +#define CMD_RING_STATE_ABORTED (1 << 1) +#define CMD_RING_STATE_STOPPED (1 << 2)unsigned int cmd_ring_reserved_trbs;struct xhci_ring *event_ring;struct xhci_erst erst;
Greg Kroah-Hartman
maintainerPATCH 32/58 xHCI: add aborting command ring function
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elric Fu <[email protected]>
commit b92cc66c047ff7cf587b318fe377061a353c120f upstream.
Software have to abort command ring and cancel command when a command is failed or hang. Otherwise, the command ring will hang up and can't handle the others. An example of a command that may hang is the Address Device Command, because waiting for a SET_ADDRESS request to be acknowledged by a USB device is outside of the xHC's ability to control.
To cancel a command, software will initialize a command descriptor for the cancel command, and add it into a cancel_cmd_list of xhci.
Sarah: Fixed missing newline on "Have the command ring been stopped?" debugging statement.
This patch should be backported to kernels as old as 3.0, that contain the commit 7ed603ecf8b68ab81f4c83097d3063d43ec73bb8 "xhci: Add an assertion to check for virt_dev=0 bug." That commit papers over a NULL pointer dereference, and this patch fixes the underlying issue that caused the NULL pointer dereference.
--- drivers/usb/host/xhci-mem.c | 7 ++ drivers/usb/host/xhci-ring.c | 108 +++++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/xhci.c | 2 drivers/usb/host/xhci.h | 12 ++++ 4 files changed, 128 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-mem.c +7 -0
@@ -1772,6 +1772,7 @@ void xhci_mem_cleanup(struct xhci_hcd *x {struct pci_dev *pdev =to_pci_dev (xhci_to_hcd (xhci)->self.controller);struct dev_info *dev_info, *next; +struct xhci_cd *cur_cd, *next_cd;unsigned long flags;int size;int i, j, num_ports;
@@ -1795,6 +1796,11 @@ void xhci_mem_cleanup(struct xhci_hcd *xxhci_ring_free (xhci, xhci->cmd_ring); xhci->cmd_ring =NULL ;xhci_dbg (xhci,"Freed command ring\n" ); +list_for_each_entry_safe (cur_cd, next_cd, + &xhci->cancel_cmd_list, cancel_cmd_list) { +list_del (&cur_cd->cancel_cmd_list); +kfree (cur_cd); + }for (i =1 ; i <MAX_HC_SLOTS ; ++i)xhci_free_virt_device (xhci, i);
@@ -2340,6 +2346,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, xhci->cmd_ring =xhci_ring_alloc (xhci,1 ,1 ,TYPE_COMMAND , flags);if (!xhci->cmd_ring) goto fail; +INIT_LIST_HEAD (&xhci->cancel_cmd_list);xhci_dbg (xhci,"Allocated command ring at %p\n" , xhci->cmd_ring);xhci_dbg (xhci,"First segment DMA is 0x%llx\n" , (unsigned long long )xhci->cmd_ring->first_seg->dma);
drivers/usb/host/xhci-ring.c +108 -0
114 lines not on this page · raw message
drivers/usb/host/xhci.c +1 -1
@@ -52,7 +52,7 @@ MODULE_PARM_DESC(link_quirk, "Don't clea* handshake done). There are two failure modes: "usec" have passed (major * hardware flakeout), or the register reads as all-ones (hardware removed). */ -static int handshake (struct xhci_hcd *xhci,void __iomem *ptr, +int handshake (struct xhci_hcd *xhci,void __iomem *ptr,u32 mask,u32 done,int usec) {u32 result;
drivers/usb/host/xhci.h +12 -0
@@ -1256,6 +1256,13 @@ struct xhci_td {union xhci_trb *last_trb; }; +/* command descriptor */ +struct xhci_cd { +struct list_head cancel_cmd_list; +struct xhci_command *command; +union xhci_trb *cmd_trb; +}; +struct xhci_dequeue_state {struct xhci_segment *new_deq_seg;union xhci_trb *new_deq_ptr;
@@ -1425,6 +1432,7 @@ struct xhci_hcd {#define CMD_RING_STATE_RUNNING (1 << 0)#define CMD_RING_STATE_ABORTED (1 << 1)#define CMD_RING_STATE_STOPPED (1 << 2) +struct list_head cancel_cmd_list;unsigned int cmd_ring_reserved_trbs;struct xhci_ring *event_ring;struct xhci_erst erst;
@@ -1707,6 +1715,8 @@ static inline void xhci_unregister_plat(/* xHCI host controller glue */ typedef void (*xhci_get_quirks_t )(struct device *,struct xhci_hcd *); +int handshake (struct xhci_hcd *xhci,void __iomem *ptr, +u32 mask,u32 done,int usec);void xhci_quiesce (struct xhci_hcd *xhci);int xhci_halt (struct xhci_hcd *xhci);int xhci_reset (struct xhci_hcd *xhci);
@@ -1797,6 +1807,8 @@ void xhci_queue_config_ep_quirk(struct x unsigned int slot_id, unsigned int ep_index, struct xhci_dequeue_state *deq_state);void xhci_stop_endpoint_command_watchdog (unsigned long arg); +int xhci_cancel_cmd (struct xhci_hcd *xhci,struct xhci_command *command, +union xhci_trb *cmd_trb);void xhci_ring_ep_doorbell (struct xhci_hcd *xhci,unsigned int slot_id,unsigned int ep_index,unsigned int stream_id);
Greg Kroah-Hartman
maintainerPATCH 33/58 xHCI: cancel command after command timeout
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elric Fu <[email protected]>
commit 6e4468b9a0793dfb53eb80d9fe52c739b13b27fd upstream.
The patch is used to cancel command when the command isn't acknowledged and a timeout occurs.
This patch should be backported to kernels as old as 3.0, that contain the commit 7ed603ecf8b68ab81f4c83097d3063d43ec73bb8 "xhci: Add an assertion to check for virt_dev=0 bug." That commit papers over a NULL pointer dereference, and this patch fixes the underlying issue that caused the NULL pointer dereference.
--- drivers/usb/host/xhci.c | 26 +++++++++++++++++++------- drivers/usb/host/xhci.h | 3 +++ 2 files changed, 22 insertions(+), 7 deletions(-)
drivers/usb/host/xhci.c +19 -7
@@ -2525,6 +2525,7 @@ static int xhci_configure_endpoint(strucstruct completion *cmd_completion;u32 *cmd_status;struct xhci_virt_device *virt_dev; +union xhci_trb *cmd_trb;spin_lock_irqsave (&xhci->lock, flags); virt_dev = xhci->devs[udev->slot_id];
@@ -2570,6 +2571,7 @@ static int xhci_configure_endpoint(struc }init_completion (cmd_completion); + cmd_trb = xhci->cmd_ring->dequeue;if (!ctx_change) ret =xhci_queue_configure_endpoint (xhci, in_ctx->dma, udev->slot_id, must_succeed);
@@ -2591,14 +2593,17 @@ static int xhci_configure_endpoint(struc/* Wait for the configure endpoint command to complete */ timeleft =wait_for_completion_interruptible_timeout ( cmd_completion, -USB_CTRL_SET_TIMEOUT ); +XHCI_CMD_DEFAULT_TIMEOUT );if (timeleft <=0 ) {xhci_warn (xhci,"%s while waiting for %s command\n" , timeleft ==0 ?"Timeout" :"Signal" , ctx_change ==0 ?"configure endpoint" :"evaluate context" ); -/* FIXME cancel the configure endpoint command */ +/* cancel the configure endpoint command */ + ret =xhci_cancel_cmd (xhci, command, cmd_trb); +if (ret <0 ) +return ret;return -ETIME ; }
@@ -3547,8 +3552,10 @@ int xhci_alloc_dev(struct usb_hcd *hcd,unsigned long flags;int timeleft;int ret; +union xhci_trb *cmd_trb;spin_lock_irqsave (&xhci->lock, flags); + cmd_trb = xhci->cmd_ring->dequeue; ret =xhci_queue_slot_control (xhci,TRB_ENABLE_SLOT ,0 );if (ret) {spin_unlock_irqrestore (&xhci->lock, flags);
@@ -3560,12 +3567,12 @@ int xhci_alloc_dev(struct usb_hcd *hcd,/* XXX: how much time for xHC slot assignment? */ timeleft =wait_for_completion_interruptible_timeout (&xhci->addr_dev, -USB_CTRL_SET_TIMEOUT ); +XHCI_CMD_DEFAULT_TIMEOUT );if (timeleft <=0 ) {xhci_warn (xhci,"%s while waiting for a slot\n" , timeleft ==0 ?"Timeout" :"Signal" ); -/* FIXME cancel the enable slot request */ -return 0 ; +/* cancel the enable slot request */ +return xhci_cancel_cmd (xhci,NULL , cmd_trb); }if (!xhci->slot_id) {
@@ -3626,6 +3633,7 @@ int xhci_address_device(struct usb_hcd *struct xhci_slot_ctx *slot_ctx;struct xhci_input_control_ctx *ctrl_ctx;u64 temp_64; +union xhci_trb *cmd_trb;if (!udev->slot_id) {xhci_dbg (xhci,"Bad Slot ID %d\n" , udev->slot_id);
@@ -3664,6 +3672,7 @@ int xhci_address_device(struct usb_hcd *xhci_dbg_ctx (xhci, virt_dev->in_ctx,2 );spin_lock_irqsave (&xhci->lock, flags); + cmd_trb = xhci->cmd_ring->dequeue; ret =xhci_queue_address_device (xhci, virt_dev->in_ctx->dma, udev->slot_id);if (ret) {
@@ -3676,7 +3685,7 @@ int xhci_address_device(struct usb_hcd */* ctrl tx can take up to 5 sec; XXX: need more time for xHC? */ timeleft =wait_for_completion_interruptible_timeout (&xhci->addr_dev, -USB_CTRL_SET_TIMEOUT ); +XHCI_CMD_DEFAULT_TIMEOUT );/* FIXME: From section 4.3.4: "Software shall be responsible for timing * the SetAddress() "recovery interval" required by USB and aborting the * command on a timeout.
@@ -3684,7 +3693,10 @@ int xhci_address_device(struct usb_hcd *if (timeleft <=0 ) {xhci_warn (xhci,"%s while waiting for address device command\n" , timeleft ==0 ?"Timeout" :"Signal" ); -/* FIXME cancel the address device command */ +/* cancel the address device command */ + ret =xhci_cancel_cmd (xhci,NULL , cmd_trb); +if (ret <0 ) +return ret;return -ETIME ; }
drivers/usb/host/xhci.h +3 -0
@@ -1256,6 +1256,9 @@ struct xhci_td {union xhci_trb *last_trb; }; +/* xHCI command default timeout value */ +#define XHCI_CMD_DEFAULT_TIMEOUT (5 * HZ) +/* command descriptor */ struct xhci_cd {struct list_head cancel_cmd_list;
Greg Kroah-Hartman
maintainerPATCH 34/58 xHCI: handle command after aborting the command ring
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elric Fu <[email protected]>
commit b63f4053cc8aa22a98e3f9a97845afe6c15d0a0d upstream.
According to xHCI spec section 4.6.1.1 and section 4.6.1.2, after aborting a command on the command ring, xHC will generate a command completion event with its completion code set to Command Ring Stopped at least. If a command is currently executing at the time of aborting a command, xHC also generate a command completion event with its completion code set to Command Abort. When the command ring is stopped, software may remove, add, or rearrage Command Descriptors.
To cancel a command, software will initialize a command descriptor for the cancel command, and add it into a cancel_cmd_list of xhci. When the command ring is stopped, software will find the command trbs described by command descriptors in cancel_cmd_list and modify it to No Op command. If software can't find the matched trbs, we can think it had been finished.
This patch should be backported to kernels as old as 3.0, that contain the commit 7ed603ecf8b68ab81f4c83097d3063d43ec73bb8 "xhci: Add an assertion to check for virt_dev=0 bug." That commit papers over a NULL pointer dereference, and this patch fixes the underlying issue that caused the NULL pointer dereference.
--- drivers/usb/host/xhci-ring.c | 171 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 165 insertions(+), 6 deletions(-)
drivers/usb/host/xhci-ring.c +165 -6
@@ -1170,6 +1170,20 @@ static void handle_reset_ep_completion(s } } +/* Complete the command and detele it from the devcie's command queue. +*/ +static void xhci_complete_cmd_in_cmd_wait_list (struct xhci_hcd *xhci, +struct xhci_command *command,u32 status) +{ + command->status = status; +list_del (&command->cmd_list); +if (command->completion) +complete (command->completion); +else +xhci_free_command (xhci, command); +} + +/* Check to see if a command in the device's command queue matches this one. * Signal the completion or free the command, and return 1. Return 0 if the * completed command isn't at the head of the command list.
@@ -1188,15 +1202,144 @@ static int handle_cmd_in_cmd_wait_list(sif (xhci->cmd_ring->dequeue != command->command_trb)return 0 ; - command->status =GET_COMP_CODE (le32_to_cpu (event->status)); -list_del (&command->cmd_list); -if (command->completion) -complete (command->completion); -else -xhci_free_command (xhci, command); +xhci_complete_cmd_in_cmd_wait_list (xhci, command, +GET_COMP_CODE (le32_to_cpu (event->status)));return 1 ; } +/* +* Finding the command trb need to be cancelled and modifying it to +* NO OP command. And if the command is in device's command wait +* list, finishing and freeing it. +* +* If we can't find the command trb, we think it had already been +* executed. +*/ +static void xhci_cmd_to_noop (struct xhci_hcd *xhci,struct xhci_cd *cur_cd) +{ +struct xhci_segment *cur_seg; +union xhci_trb *cmd_trb; +u32 cycle_state; + +if (xhci->cmd_ring->dequeue == xhci->cmd_ring->enqueue) +return ; + +/* find the current segment of command ring */ + cur_seg =find_trb_seg (xhci->cmd_ring->first_seg, + xhci->cmd_ring->dequeue, &cycle_state); + +/* find the command trb matched by cd from command ring */ +for (cmd_trb = xhci->cmd_ring->dequeue; + cmd_trb != xhci->cmd_ring->enqueue; +next_trb (xhci, xhci->cmd_ring, &cur_seg, &cmd_trb)) { +/* If the trb is link trb, continue */ +if (TRB_TYPE_LINK_LE32 (cmd_trb->generic.field[3 ])) +continue ; + +if (cur_cd->cmd_trb == cmd_trb) { + +/* If the command in device's command list, we should +* finish it and free the command structure. +*/ +if (cur_cd->command) +xhci_complete_cmd_in_cmd_wait_list (xhci, + cur_cd->command,COMP_CMD_STOP ); + +/* get cycle state from the origin command trb */ + cycle_state =le32_to_cpu (cmd_trb->generic.field[3 ]) + &TRB_CYCLE ; + +/* modify the command trb to NO OP command */ + cmd_trb->generic.field[0 ] =0 ; + cmd_trb->generic.field[1 ] =0 ; + cmd_trb->generic.field[2 ] =0 ; + cmd_trb->generic.field[3 ] =cpu_to_le32 ( +TRB_TYPE (TRB_CMD_NOOP ) | cycle_state); +break ; + } + } +} + +static void xhci_cancel_cmd_in_cd_list (struct xhci_hcd *xhci) +{ +struct xhci_cd *cur_cd, *next_cd; + +if (list_empty (&xhci->cancel_cmd_list)) +return ; + +list_for_each_entry_safe (cur_cd, next_cd, + &xhci->cancel_cmd_list, cancel_cmd_list) { +xhci_cmd_to_noop (xhci, cur_cd); +list_del (&cur_cd->cancel_cmd_list); +kfree (cur_cd); + } +} + +/* +* traversing the cancel_cmd_list. If the command descriptor according +* to cmd_trb is found, the function free it and return 1, otherwise +* return 0. +*/ +static int xhci_search_cmd_trb_in_cd_list (struct xhci_hcd *xhci, +union xhci_trb *cmd_trb) +{ +struct xhci_cd *cur_cd, *next_cd; + +if (list_empty (&xhci->cancel_cmd_list)) +return 0 ; + +list_for_each_entry_safe (cur_cd, next_cd, + &xhci->cancel_cmd_list, cancel_cmd_list) { +if (cur_cd->cmd_trb == cmd_trb) { +if (cur_cd->command) +xhci_complete_cmd_in_cmd_wait_list (xhci, + cur_cd->command,COMP_CMD_STOP ); +list_del (&cur_cd->cancel_cmd_list); +kfree (cur_cd); +return 1 ; + } + } + +return 0 ; +} + +/* +* If the cmd_trb_comp_code is COMP_CMD_ABORT, we just check whether the +* trb pointed by the command ring dequeue pointer is the trb we want to +* cancel or not. And if the cmd_trb_comp_code is COMP_CMD_STOP, we will +* traverse the cancel_cmd_list to trun the all of the commands according +* to command descriptor to NO-OP trb. +*/ +static int handle_stopped_cmd_ring (struct xhci_hcd *xhci, +int cmd_trb_comp_code) +{ +int cur_trb_is_good =0 ; + +/* Searching the cmd trb pointed by the command ring dequeue +* pointer in command descriptor list. If it is found, free it. +*/ + cur_trb_is_good =xhci_search_cmd_trb_in_cd_list (xhci, + xhci->cmd_ring->dequeue); + +if (cmd_trb_comp_code ==COMP_CMD_ABORT ) + xhci->cmd_ring_state =CMD_RING_STATE_STOPPED ; +else if (cmd_trb_comp_code ==COMP_CMD_STOP ) { +/* traversing the cancel_cmd_list and canceling +* the command according to command descriptor +*/ +xhci_cancel_cmd_in_cd_list (xhci); + + xhci->cmd_ring_state =CMD_RING_STATE_RUNNING ; +/* +* ring command ring doorbell again to restart the +* command ring +*/ +if (xhci->cmd_ring->dequeue != xhci->cmd_ring->enqueue) +xhci_ring_cmd_db (xhci); + } +return cur_trb_is_good; +} +static void handle_cmd_completion (struct xhci_hcd *xhci,struct xhci_event_cmd *event) {
@@ -1222,6 +1365,22 @@ static void handle_cmd_completion(struct xhci->error_bitmask |=1 <<5 ;return ; } + +if ((GET_COMP_CODE (le32_to_cpu (event->status)) ==COMP_CMD_ABORT ) || + (GET_COMP_CODE (le32_to_cpu (event->status)) ==COMP_CMD_STOP )) { +/* If the return value is 0, we think the trb pointed by +* command ring dequeue pointer is a good trb. The good +* trb means we don't want to cancel the trb, but it have +* been stopped by host. So we should handle it normally. +* Otherwise, driver should invoke inc_deq() and return. +*/ +if (handle_stopped_cmd_ring (xhci, +GET_COMP_CODE (le32_to_cpu (event->status)))) { +inc_deq (xhci, xhci->cmd_ring); +return ; + } + } +switch (le32_to_cpu (xhci->cmd_ring->dequeue->generic.field[3 ]) &TRB_TYPE_BITMASK ) {case TRB_TYPE (TRB_ENABLE_SLOT ):
Greg Kroah-Hartman
maintainerPATCH 35/58 Increase XHCI suspend timeout to 16ms
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Spang <[email protected]>
commit a6e097dfdfd189b6929af6efa1d289af61858386 upstream.
The Intel XHCI specification says that after clearing the run/stop bit the controller may take up to 16ms to halt. We've seen a device take 14ms, which with the current timeout of 10ms causes the kernel to abort the suspend. Increasing the timeout to the recommended value fixes the problem.
This patch should be backported to kernels as old as 2.6.37, that contain the commit 5535b1d5f8885695c6ded783c692e3c0d0eda8ca "USB: xHCI:
PCI power management implementation".
--- drivers/usb/host/xhci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci.c +1 -1
@@ -890,7 +890,7 @@ int xhci_suspend(struct xhci_hcd *xhci) command &= ~CMD_RUN ;xhci_writel (xhci, command, &xhci->op_regs->command);if (handshake (xhci, &xhci->op_regs->status, -STS_HALT ,STS_HALT ,100 *100 )) { +STS_HALT ,STS_HALT ,XHCI_MAX_HALT_USEC )) {xhci_warn (xhci,"WARN: xHC CMD_RUN timeout\n" );spin_unlock_irq (&xhci->lock);return -ETIMEDOUT ;
Greg Kroah-Hartman
maintainerPATCH 36/58 HID: keep dev_rdesc unmodified and use it for comparisons
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kevin Daughtridge <[email protected]>
commit 86e6b77eb7cf9ca2e9c7092b4dfd588f0a3307b6 upstream.
The dev_rdesc member of the hid_device structure is meant to store the original report descriptor received from the device, but it is currently passed to any report_fixup method before it is copied to the rdesc member. This patch uses a temporary buffer to shield dev_rdesc from the side effects of many HID drivers' report_fixup implementations.
usbhid's hid_post_reset checks the report descriptor currently returned by the device against a descriptor that may have been modified by a driver's report_fixup method. That leaves some devices nonfunctional after a resume, with a "reset_resume error 1" reported. This patch checks the new descriptor against the unmodified dev_rdesc instead and uses the original, instead of modified, report size.
--- drivers/hid/hid-core.c | 16 +++++++++++++--- drivers/hid/usbhid/hid-core.c | 6 +++--- 2 files changed, 16 insertions(+), 6 deletions(-)
drivers/hid/hid-core.c +13 -3
@@ -757,6 +757,7 @@ int hid_open_report(struct hid_device *dstruct hid_item item;unsigned int size;__u8 *start; +__u8 *buf;__u8 *end;int ret; static int (*dispatch_type[])(struct hid_parser *parser,
@@ -775,12 +776,21 @@ int hid_open_report(struct hid_device *dreturn -ENODEV ; size = device->dev_rsize; + buf =kmemdup (start, size,GFP_KERNEL ); +if (buf ==NULL ) +return -ENOMEM ; +if (device->driver->report_fixup) - start = device->driver->report_fixup (device, start, &size); + start = device->driver->report_fixup (device, buf, &size); +else + start = buf; - device->rdesc =kmemdup (start, size,GFP_KERNEL ); -if (device->rdesc ==NULL ) + start =kmemdup (start, size,GFP_KERNEL ); +kfree (buf); +if (start ==NULL )return -ENOMEM ; + + device->rdesc = start; device->rsize = size; parser =vzalloc (sizeof (struct hid_parser ));
drivers/hid/usbhid/hid-core.c +3 -3
@@ -1423,20 +1423,20 @@ static int hid_post_reset(struct usb_int* configuration descriptors passed, we already know that * the size of the HID report descriptor has not changed. */ - rdesc =kmalloc (hid->rsize,GFP_KERNEL ); + rdesc =kmalloc (hid->dev_rsize,GFP_KERNEL );if (!rdesc) {dbg_hid ("couldn't allocate rdesc memory (post_reset)\n" );return 1 ; } status =hid_get_class_descriptor (dev, interface->desc.bInterfaceNumber, -HID_DT_REPORT , rdesc, hid->rsize); +HID_DT_REPORT , rdesc, hid->dev_rsize);if (status <0 ) {dbg_hid ("reading report descriptor failed (post_reset)\n" );kfree (rdesc);return 1 ; } - status =memcmp (rdesc, hid->rdesc, hid->rsize); + status =memcmp (rdesc, hid->dev_rdesc, hid->dev_rsize);kfree (rdesc);if (status !=0 ) {dbg_hid ("report descriptor changed\n" );
Greg Kroah-Hartman
maintainerPATCH 37/58 ath9k: Disable ASPM only for AR9285
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sujith Manoharan <[email protected]>
commit 046b6802c8d3c8a57448485513bf7291633e0fa3 upstream.
Currently, ASPM is disabled for all WLAN+BT combo chipsets when BTCOEX is enabled. This is incorrect since the workaround is required only for WB195, which is a AR9285+AR3011 combo solution. Fix this by checking for the HW version when enabling the workaround.
--- drivers/net/wireless/ath/ath9k/pci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath9k/pci.c +3 -2
@@ -124,8 +124,9 @@ static void ath_pci_aspm_init(struct athif (!parent)return ; -if (ath9k_hw_get_btcoex_scheme (ah) !=ATH_BTCOEX_CFG_NONE ) { -/* Bluetooth coexistance requires disabling ASPM. */ +if ((ath9k_hw_get_btcoex_scheme (ah) !=ATH_BTCOEX_CFG_NONE ) && + (AR_SREV_9285 (ah))) { +/* Bluetooth coexistance requires disabling ASPM for AR9285. */ pci_read_config_byte (pdev, pos +PCI_EXP_LNKCTL , &aspm); aspm &= ~(PCIE_LINK_STATE_L0S |PCIE_LINK_STATE_L1 );pci_write_config_byte (pdev, pos +PCI_EXP_LNKCTL , aspm);
Greg Kroah-Hartman
maintainerPATCH 38/58 xen/pciback: Restore the PCI config space after an FLR.
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Rzeszutek Wilk <[email protected]>
commit c341ca45ce56143804ef5a8f4db753e554e640b4 upstream.
When we do an FLR, or D0->D3_hot we may lose the BARs as the device has turned itself off (and on). This means the device cannot function unless the pci_restore_state is called - which it is when the PCI device is unbound from the Xen PCI backend driver. For PV guests it ends up calling pci_enable_device / pci_enable_msi[x] which does the proper steps
That however is not happening if a HVM guest is run as QEMU deals with PCI configuration space. QEMU also requires that the device be "parked" under the ownership of a pci-stub driver to guarantee that the PCI device is not being used. Hence we follow the same incantation as pci_reset_function does - by doing an FLR, then restoring the PCI configuration space.
The result of this patch is that when you run lspci, you get now this:
- Region 0: [virtual] Memory at fe8c0000 (32-bit, non-prefetchable) [size=128K]
- Region 1: [virtual] Memory at fe800000 (32-bit, non-prefetchable) [size=512K]
+ Region 0: Memory at fe8c0000 (32-bit, non-prefetchable) [size=128K]
+ Region 1: Memory at fe800000 (32-bit, non-prefetchable) [size=512K]
Region 2: I/O ports at c000 [size=32]- Region 3: [virtual] Memory at fe8e0000 (32-bit, non-prefetchable) [size=16K]
+ Region 3: Memory at fe8e0000 (32-bit, non-prefetchable) [size=16K]
The [virtual] means that lspci read those entries from SysFS but when it read them from the device it got a different value (0xfffffff).
--- drivers/xen/xen-pciback/pci_stub.c | 1 + 1 file changed, 1 insertion(+)
drivers/xen/xen-pciback/pci_stub.c +1 -0
@@ -362,6 +362,7 @@ static int __devinit pcistub_init_deviceelse {dev_dbg (&dev->dev,"reseting (FLR, D3, etc) the device\n" );__pci_reset_function_locked (dev); +pci_restore_state (dev); }/* Now disable the device (this also ensures some private device * data is setup before we export)
Greg Kroah-Hartman
maintainerPATCH 39/58 coredump: prevent double-free on an error path in core dumper
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denys Vlasenko <[email protected]>
commit f34f9d186df35e5c39163444c43b4fc6255e39c5 upstream.
In !CORE_DUMP_USE_REGSET case, if elf_note_info_init fails to allocate memory for info->fields, it frees already allocated stuff and returns error to its caller, fill_note_info. Which in turn returns error to its caller, elf_core_dump. Which jumps to cleanup label and calls free_note_info, which will happily try to free all info->fields again. BOOM.
This is the fix.
--- fs/binfmt_elf.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-)
fs/binfmt_elf.c +4 -15
@@ -1696,30 +1696,19 @@ static int elf_note_info_init(struct elfreturn 0 ; info->psinfo =kmalloc (sizeof (*info->psinfo),GFP_KERNEL );if (!info->psinfo) - goto notes_free; +return 0 ; info->prstatus =kmalloc (sizeof (*info->prstatus),GFP_KERNEL );if (!info->prstatus) - goto psinfo_free; +return 0 ; info->fpu =kmalloc (sizeof (*info->fpu),GFP_KERNEL );if (!info->fpu) - goto prstatus_free; +return 0 ;#ifdef ELF_CORE_COPY_XFPREGS info->xfpu =kmalloc (sizeof (*info->xfpu),GFP_KERNEL );if (!info->xfpu) - goto fpu_free; +return 0 ;#endif return 1 ; -#ifdef ELF_CORE_COPY_XFPREGS - fpu_free: -kfree (info->fpu); -#endif - prstatus_free: -kfree (info->prstatus); - psinfo_free: -kfree (info->psinfo); - notes_free: -kfree (info->notes); -return 0 ; } static int fill_note_info(struct elfhdr *elf, int phdrs,
Greg Kroah-Hartman
maintainerPATCH 40/58 n_gsm.c: Implement 3GPP27.010 DLC start-up procedure in MUX
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: xiaojin <[email protected]>
commit 7e8ac7b23b67416700dfb8b4136a4e81ce675b48 upstream.
In 3GPP27.010 5.8.1, it defined:
The TE multiplexer initiates the establishment of the multiplexer control channel by sending a SABM frame on DLCI 0 using the procedures of clause 5.4.1. Once the multiplexer channel is established other DLCs may be established using the procedures of clause 5.4.1.
This patch implement 5.8.1 in MUX level, it make sure DLC0 is the first channel to be setup.
[or for those not familiar with the specification: it was possible to try
and open a data connection while the control channel was not yet fully open, which is a spec violation and confuses some modems]
--- drivers/tty/n_gsm.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/n_gsm.c +4 -0
@@ -2889,6 +2889,10 @@ static int gsmtty_open(struct tty_struct gsm = gsm_mux[mux];if (gsm->dead)return -EL2HLT ; +/* If DLCI 0 is not yet fully open return an error. This is ok from a locking +perspective as we don't have to worry about this if DLCI0 is lost */ +if (gsm->dlci[0 ] && gsm->dlci[0 ]->state !=DLCI_OPEN ) +return -EL2NSYNC ; dlci = gsm->dlci[line];if (dlci ==NULL ) dlci =gsm_dlci_alloc (gsm, line);
Greg Kroah-Hartman
maintainerPATCH 41/58 n_gsm: uplink SKBs accumulate on list
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russ Gorby <[email protected]>
commit 192b6041e75bb4a2aae73834037038cea139a92d upstream.
gsm_dlci_data_kick will not call any output function if tx_bytes > THRESH_LO furthermore it will call the output function only once if tx_bytes == 0 If the size of the IP writes are on the order of THRESH_LO
we can get into a situation where skbs accumulate on the outbound list being starved for events to call the output function.
gsm_dlci_data_kick now calls the sweep function when tx_bytes==0
--- drivers/tty/n_gsm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/tty/n_gsm.c +5 -2
@@ -971,16 +971,19 @@ static void gsm_dlci_data_sweep(struct gstatic void gsm_dlci_data_kick (struct gsm_dlci *dlci) {unsigned long flags; +int sweep;spin_lock_irqsave (&dlci->gsm->tx_lock, flags);/* If we have nothing running then we need to fire up */ + sweep = (dlci->gsm->tx_bytes <TX_THRESH_LO );if (dlci->gsm->tx_bytes ==0 ) {if (dlci->net)gsm_dlci_data_output_framed (dlci->gsm, dlci);else gsm_dlci_data_output (dlci->gsm, dlci); - }else if (dlci->gsm->tx_bytes <TX_THRESH_LO ) -gsm_dlci_data_sweep (dlci->gsm); + } +if (sweep) +gsm_dlci_data_sweep (dlci->gsm);spin_unlock_irqrestore (&dlci->gsm->tx_lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 42/58 n_gsm: added interlocking for gsm_data_lock for certain code paths
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russ Gorby <[email protected]>
commit 5e44708f75b0f8712da715d6babb0c21089b2317 upstream.
There were some locking holes in the management of the MUX's message queue for 2 code paths:
1) gsmld_write_wakeup
2) receipt of CMD_FCON flow-control message
In both cases gsm_data_kick is called w/o locking so it can collide with other other instances of gsm_data_kick (pulling messages tx_tail) or potentially other instances of __gsm_data_queu (adding messages to tx_head)
Changed to take the tx_lock in these 2 cases
--- drivers/tty/n_gsm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/tty/n_gsm.c +6 -2
@@ -1193,6 +1193,8 @@ static void gsm_control_message(struct g u8 *data, int clen) {u8 buf[1 ]; +unsigned long flags; +switch (command) {case CMD_CLD : {struct gsm_dlci *dlci = gsm->dlci[0 ];
@@ -1218,7 +1220,9 @@ static void gsm_control_message(struct g gsm->constipated =0 ;gsm_control_reply (gsm,CMD_FCOFF ,NULL ,0 );/* Kick the link in case it is idling */ +spin_lock_irqsave (&gsm->tx_lock, flags);gsm_data_kick (gsm); +spin_unlock_irqrestore (&gsm->tx_lock, flags);break ;case CMD_MSC :/* Out of band modem line change indicator for a DLCI */
@@ -2380,12 +2384,12 @@ static void gsmld_write_wakeup(struct tt/* Queue poll */ clear_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); +spin_lock_irqsave (&gsm->tx_lock, flags);gsm_data_kick (gsm);if (gsm->tx_bytes <TX_THRESH_LO ) { -spin_lock_irqsave (&gsm->tx_lock, flags);gsm_dlci_data_sweep (gsm); -spin_unlock_irqrestore (&gsm->tx_lock, flags); } +spin_unlock_irqrestore (&gsm->tx_lock, flags); }/**
Greg Kroah-Hartman
maintainerPATCH 43/58 n_gsm: memory leak in uplink error path
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russ Gorby <[email protected]>
commit 88ed2a60610974443335c924d7cb8e5dcf9dbdc1 upstream.
Uplink (TX) network data will go through gsm_dlci_data_output_framed there is a bug where if memory allocation fails, the skb which has already been pulled off the list will be lost.
In addition TX skbs were being processed in LIFO order
Fixed the memory leak, and changed to FIFO order processing
--- drivers/tty/n_gsm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/tty/n_gsm.c +5 -2
@@ -875,7 +875,7 @@ static int gsm_dlci_data_output_framed(s/* dlci->skb is locked by tx_lock */ if (dlci->skb ==NULL ) { - dlci->skb =skb_dequeue (&dlci->skb_list); + dlci->skb =skb_dequeue_tail (&dlci->skb_list);if (dlci->skb ==NULL )return 0 ; first =1 ;
@@ -899,8 +899,11 @@ static int gsm_dlci_data_output_framed(s/* FIXME: need a timer or something to kick this so it can't get stuck with no work outstanding and no buffer free */ -if (msg ==NULL ) +if (msg ==NULL ) { +skb_queue_tail (&dlci->skb_list, dlci->skb); + dlci->skb =NULL ;return -ENOMEM ; + } dp = msg->data;if (dlci->adaption ==4 ) {/* Interruptible framed (Packetised Data) */
Greg Kroah-Hartman
maintainerPATCH 44/58 UBI: fix autoresize handling in R/O mode
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Artem Bityutskiy <[email protected]>
commit abb3e01103eb4e2ea5c15e6fedbc74e08bd4cc2b upstream.
Currently UBI fails in autoresize when it is in R/O mode (e.g., because the underlying MTD device is R/O). This patch fixes the issue - we just skip autoresize and print a warning.
--- drivers/mtd/ubi/build.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/mtd/ubi/build.c +5 -0
@@ -759,6 +759,11 @@ static int autoresize(struct ubi_devicestruct ubi_volume *vol = ubi->volumes[vol_id];int err, old_reserved_pebs = vol->reserved_pebs; +if (ubi->ro_mode) { +ubi_warn ("skip auto-resize because of R/O mode" ); +return 0 ; + } +/* * Clear the auto-resize flag in the volume in-memory copy of the * volume table, and 'ubi_resize_volume()' will propagate this change
Greg Kroah-Hartman
maintainerPATCH 45/58 UBI: erase free PEB with bitflip in EC header
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu CASTET <[email protected]>
commit 193819cf2e6e395b1e1be2d36785dc5563a6edca upstream.
Without this patch, these PEB are not scrubbed until we put data in them. Bitflip can accumulate latter and we can loose the EC header (but VID header should be intact and allow to recover data).
--- drivers/mtd/ubi/attach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/attach.c +1 -1
@@ -975,7 +975,7 @@ static int scan_peb(struct ubi_device *ureturn err; goto adjust_mean_ec;case UBI_IO_FF : -if (ec_err) +if (ec_err || bitflips) err =add_to_list (ai, pnum,UBI_UNKNOWN ,UBI_UNKNOWN , ec,1 , &ai->erase);else
Greg Kroah-Hartman
maintainerPATCH 46/58 Yama: handle 32-bit userspace prctl
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit 2e4930eb7c8fb20a39dfb5f8a8f80402710dcea8 upstream.
When running a 64-bit kernel and receiving prctls from a 32-bit userspace, the "-1" used as an unsigned long will end up being misdetected. The kernel is looking for 0xffffffffffffffff instead of 0xffffffff. Since prctl lacks a distinct compat interface, Yama needs to handle this translation itself. As such, support either value as meaning PR_SET_PTRACER_ANY, to avoid breaking the ABI for 64-bit.
--- security/yama/yama_lsm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/yama/yama_lsm.c +1 -1
@@ -143,7 +143,7 @@ static int yama_task_prctl(int option, uif (arg2 ==0 ) {yama_ptracer_del (NULL , myself); rc =0 ; - }else if (arg2 ==PR_SET_PTRACER_ANY ) { + }else if (arg2 ==PR_SET_PTRACER_ANY || (int )arg2 ==-1 ) { rc =yama_ptracer_add (NULL , myself); }else {struct task_struct *tracer;
Greg Kroah-Hartman
maintainerPATCH 47/58 SCSI: ibmvscsi: Fix host config length field overflow
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Herrenschmidt <[email protected]>
commit 225c56960fcafeccc2b6304f96cd3f0dbf42a16a upstream.
The length field in the host config packet is only 16-bit long, so passing it 0x10000 (64K which is our standard PAGE_SIZE) doesn't work and result in an empty config from the server.
--- drivers/scsi/ibmvscsi/ibmvscsi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/ibmvscsi/ibmvscsi.c +3 -0
@@ -1541,6 +1541,9 @@ static int ibmvscsi_do_host_config(struc host_config = &evt_struct->iu.mad.host_config; +/* The transport length field is only 16-bit */ + length =min (0xffff , length); +/* Set up a lun reset SRP command */ memset (host_config,0x00 ,sizeof (*host_config)); host_config->common.type =VIOSRP_HOST_CONFIG_TYPE ;
Greg Kroah-Hartman
maintainerPATCH 48/58 SCSI: hpsa: Use LUN reset instead of target reset
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Stephen M. Cameron" <[email protected]>
commit 21e89afd325849eb38adccf382df16cc895911f9 upstream.
It turns out Smart Array logical drives do not support target reset and when the target reset fails, the logical drive will be taken off line. Symptoms look like this:
hpsa 0000:03:00.0: Abort request on C1:B0:T0:L0
hpsa 0000:03:00.0: resetting device 1:0:0:0
hpsa 0000:03:00.0: cp ffff880037c56000 is reported invalid (probably means target device no longer present) hpsa 0000:03:00.0: resetting device failed.
sd 1:0:0:0: Device offlined - not ready after error recovery
sd 1:0:0:0: rejecting I/O to offline device
EXT3-fs error (device sdb1): read_block_bitmap:
LUN reset is supported though, and is what we should be using. Target reset is also disruptive in shared SAS situations, for example, an external MSA1210m which does support target reset attached to Smart Arrays in multiple hosts -- a target reset from one host is disruptive to other hosts as all LUNs on the target will be reset and will abort all outstanding i/os back to all the attached hosts. So we should use LUN reset, not target reset.
Tested this with Smart Array logical drives and with tape drives. Not sure how this bug survived since 2009, except it must be very rare for a Smart Array to require more than 30s to complete a request.
--- drivers/scsi/hpsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/hpsa.c +1 -1
@@ -3266,7 +3266,7 @@ static void fill_cmd(struct CommandList c->Request.Timeout =0 ;/* Don't time out */ memset (&c->Request.CDB[0 ],0 ,sizeof (c->Request.CDB)); c->Request.CDB[0 ] = cmd; - c->Request.CDB[1 ] =0x03 ;/* Reset target above */ + c->Request.CDB[1 ] =HPSA_RESET_TYPE_LUN ;/* If bytes 4-7 are zero, it means reset the */ /* LunID device */ c->Request.CDB[4 ] =0x00 ;
Greg Kroah-Hartman
maintainerPATCH 49/58 can: mscan-mpc5xxx: fix return value check in mpc512x_can_get_clock()
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit f61bd0585dfc7d99db4936d7467de4ca8e2f7ea0 upstream.
In case of error, the function clk_get() returns ERR_PTR() and never returns NULL pointer. The NULL test in the error handling should be replaced with IS_ERR().
dpatch engine is used to auto generated this patch.
(https://github.com/weiyj/dpatch)
--- drivers/net/can/mscan/mpc5xxx_can.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/can/mscan/mpc5xxx_can.c +2 -2
@@ -181,7 +181,7 @@ static u32 __devinit mpc512x_can_get_cloif (!clock_name || !strcmp (clock_name,"sys" )) { sys_clk =clk_get (&ofdev->dev,"sys_clk" ); -if (!sys_clk) { +if (IS_ERR (sys_clk)) {dev_err (&ofdev->dev,"couldn't get sys_clk\n" ); goto exit_unmap; }
@@ -204,7 +204,7 @@ static u32 __devinit mpc512x_can_get_cloif (clocksrc <0 ) { ref_clk =clk_get (&ofdev->dev,"ref_clk" ); -if (!ref_clk) { +if (IS_ERR (ref_clk)) {dev_err (&ofdev->dev,"couldn't get ref_clk\n" ); goto exit_unmap; }
Greg Kroah-Hartman
maintainerPATCH 50/58 remoteproc: select VIRTIO to avoid build breakage
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ohad Ben-Cohen <[email protected]>
commit 2ed6d29c725c4aead510b5c23f563795b265acf5 upstream.
drivers/built-in.o: In function `rproc_virtio_finalize_features':
remoteproc_virtio.c:(.text+0x2f9a02): undefined reference to vring_transport_features' drivers/built-in.o: In function rproc_virtio_del_vqs':
remoteproc_virtio.c:(.text+0x2f9a74): undefined reference to vring_del_virtqueue' drivers/built-in.o: In function rproc_virtio_find_vqs':
remoteproc_virtio.c:(.text+0x2f9c44): undefined reference to vring_new_virtqueue' drivers/built-in.o: In function rproc_add_virtio_dev':
(.text+0x2f9e2c): undefined reference to register_virtio_device' drivers/built-in.o: In function rproc_vq_interrupt':
(.text+0x2f9db7): undefined reference to vring_interrupt' drivers/built-in.o: In function rproc_remove_virtio_dev':
(.text+0x2f9e9f): undefined reference to `unregister_virtio_device'
--- drivers/remoteproc/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/remoteproc/Kconfig +1 -0
@@ -5,6 +5,7 @@ config REMOTEPROC tristate depends on EXPERIMENTAL select FW_CONFIG + select VIRTIO config OMAP_REMOTEPROC tristate "OMAP remoteproc support"
Greg Kroah-Hartman
maintainerPATCH 51/58 remoteproc: fix a potential NULL-dereference on cleanup
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 7168d914a782086e217214c57ddfc7cc4b738c0c upstream.
We only need to allocate mapping if there is an IOMMU domain.
Otherwise, when the mappings are released, the assumption that an IOMMU domain is there will crash and burn.
--- drivers/remoteproc/remoteproc_core.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/remoteproc/remoteproc_core.c +11 -11
@@ -643,17 +643,10 @@ static int rproc_handle_carveout(structdev_dbg (dev,"carveout rsc: da %x, pa %x, len %x, flags %x\n" , rsc->da, rsc->pa, rsc->len, rsc->flags); - mapping =kzalloc (sizeof (*mapping),GFP_KERNEL ); -if (!mapping) { -dev_err (dev,"kzalloc mapping failed\n" ); -return -ENOMEM ; - } - carveout =kzalloc (sizeof (*carveout),GFP_KERNEL );if (!carveout) {dev_err (dev,"kzalloc carveout failed\n" ); - ret = -ENOMEM ; - goto free_mapping; +return -ENOMEM ; } va =dma_alloc_coherent (dev, rsc->len, &dma,GFP_KERNEL );
@@ -683,11 +676,18 @@ static int rproc_handle_carveout(struct* physical address in this case. */ if (rproc->domain) { + mapping =kzalloc (sizeof (*mapping),GFP_KERNEL ); +if (!mapping) { +dev_err (dev,"kzalloc mapping failed\n" ); + ret = -ENOMEM ; + goto dma_free; + } + ret =iommu_map (rproc->domain, rsc->da, dma, rsc->len, rsc->flags);if (ret) {dev_err (dev,"iommu_map failed: %d\n" , ret); - goto dma_free; + goto free_mapping; }/*
@@ -728,12 +728,12 @@ static int rproc_handle_carveout(structreturn 0 ; +free_mapping: +kfree (mapping); dma_free:dma_free_coherent (dev, rsc->len, va, dma); free_carv:kfree (carveout); -free_mapping: -kfree (mapping);return ret; }
Greg Kroah-Hartman
maintainerPATCH 52/58 IPoIB: Fix use-after-free of multicast object
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrick McHardy <[email protected]>
commit bea1e22df494a729978e7f2c54f7bda328f74bc3 upstream.
Fix a crash in ipoib_mcast_join_task(). (with help from Or Gerlitz)
Commit c8c2afe360b7 ("IPoIB: Use rtnl lock/unlock when changing device flags") added a call to rtnl_lock() in ipoib_mcast_join_task(), which is run from the ipoib_workqueue, and hence the workqueue can't be flushed from the context of ipoib_stop().
In the current code, ipoib_stop() (which doesn't flush the workqueue) calls ipoib_mcast_dev_flush(), which goes and deletes all the multicast entries. This takes place without any synchronization with a possible running instance of ipoib_mcast_join_task() for the same ipoib device, leading to a crash due to NULL pointer dereference.
Fix this by making sure that the workqueue is flushed before ipoib_mcast_dev_flush() is called. To make that possible, we move the RTNL-lock wrapped code to ipoib_mcast_join_finish().
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 +- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-)
drivers/infiniband/ulp/ipoib/ipoib_main.c +1 -1
@@ -148,7 +148,7 @@ static int ipoib_stop(struct net_devicenetif_stop_queue (dev); -ipoib_ib_dev_down (dev,0 ); +ipoib_ib_dev_down (dev,1 );ipoib_ib_dev_stop (dev,0 );if (!test_bit (IPOIB_FLAG_SUBINTERFACE , &priv->flags)) {
drivers/infiniband/ulp/ipoib/ipoib_multicast.c +10 -9
@@ -190,7 +190,9 @@ static int ipoib_mcast_join_finish(struc mcast->mcmember = *mcmember; -/* Set the cached Q_Key before we attach if it's the broadcast group */ +/* Set the multicast MTU and cached Q_Key before we attach if it's +* the broadcast group. +*/ if (!memcmp (mcast->mcmember.mgid.raw, priv->dev->broadcast +4 ,sizeof (union ib_gid ))) {spin_lock_irq (&priv->lock);
@@ -198,10 +200,17 @@ static int ipoib_mcast_join_finish(strucspin_unlock_irq (&priv->lock);return -EAGAIN ; } + priv->mcast_mtu =IPOIB_UD_MTU (ib_mtu_enum_to_int (priv->broadcast->mcmember.mtu)); priv->qkey =be32_to_cpu (priv->broadcast->mcmember.qkey);spin_unlock_irq (&priv->lock); priv->tx_wr.wr.ud.remote_qkey = priv->qkey; set_qkey =1 ; + +if (!ipoib_cm_admin_enabled (dev)) { +rtnl_lock (); +dev_set_mtu (dev,min (priv->mcast_mtu, priv->admin_mtu)); +rtnl_unlock (); + } }if (!test_bit (IPOIB_MCAST_FLAG_SENDONLY , &mcast->flags)) {
@@ -589,14 +598,6 @@ void ipoib_mcast_join_task(struct work_sreturn ; } - priv->mcast_mtu =IPOIB_UD_MTU (ib_mtu_enum_to_int (priv->broadcast->mcmember.mtu)); - -if (!ipoib_cm_admin_enabled (dev)) { -rtnl_lock (); -dev_set_mtu (dev,min (priv->mcast_mtu, priv->admin_mtu)); -rtnl_unlock (); - } -ipoib_dbg_mcast (priv,"successfully joined all multicast groups\n" );clear_bit (IPOIB_MCAST_RUN , &priv->flags);
Greg Kroah-Hartman
maintainerPATCH 53/58 IB/srp: Fix use-after-free in srp_reset_req()
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit 9b796d06d5d1b1e85ae2316a283ea11dd739ef96 upstream.
srp_free_req() uses the scsi_cmnd structure contents to unmap buffers, so we must invoke srp_free_req() before we release ownership of that structure.
--- drivers/infiniband/ulp/srp/ib_srp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/ulp/srp/ib_srp.c +1 -1
@@ -638,9 +638,9 @@ static void srp_reset_req(struct srp_tarstruct scsi_cmnd *scmnd =srp_claim_req (target, req,NULL );if (scmnd) { +srp_free_req (target, req, scmnd,0 ); scmnd->result =DID_RESET <<16 ; scmnd->scsi_done (scmnd); -srp_free_req (target, req, scmnd,0 ); } }
Greg Kroah-Hartman
maintainerPATCH 54/58 IB/srp: Avoid having aborted requests hang
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit d8536670916a685df116b5c2cb256573fd25e4e3 upstream.
We need to call scsi_done() for commands after we abort them.
--- drivers/infiniband/ulp/srp/ib_srp.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/ulp/srp/ib_srp.c +1 -0
@@ -1687,6 +1687,7 @@ static int srp_abort(struct scsi_cmnd *s SRP_TSK_ABORT_TASK);srp_free_req (target, req, scmnd,0 ); scmnd->result =DID_ABORT <<16 ; + scmnd->scsi_done (scmnd);return SUCCESS ; }
Greg Kroah-Hartman
maintainerPATCH 55/58 isci: fix isci_pci_probe() generates warning on efi failure path
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 6d70a74ffd616073a68ae0974d98819bfa8e6da6 upstream.
The oem parameter image embedded in the efi variable is at an offset from the start of the variable. However, in the failure path we try to free the 'orom' pointer which is only valid when the paramaters are being read from the legacy option-rom space.
Since failure to load the oem parameters is unlikely and we keep the memory around in the success case just defer all de-allocation to devm.
--- drivers/scsi/isci/init.c | 1 - drivers/scsi/isci/probe_roms.c | 1 - 2 files changed, 2 deletions(-)
drivers/scsi/isci/init.c +0 -1
@@ -641,7 +641,6 @@ static int __devinit isci_pci_probe(stru orom->hdr.version)) {dev_warn (&pdev->dev,"[%d]: invalid oem parameters detected, falling back to firmware\n" , i); -devm_kfree (&pdev->dev, orom); orom =NULL ;break ; }
drivers/scsi/isci/probe_roms.c +0 -1
@@ -104,7 +104,6 @@ struct isci_orom *isci_request_oprom(strif (i >= len) {dev_err (&pdev->dev,"oprom parse error\n" ); -devm_kfree (&pdev->dev, rom); rom =NULL ; }pci_unmap_biosrom (oprom);
Greg Kroah-Hartman
maintainerPATCH 56/58 x86/alternatives: Fix p6 nops on non-modular kernels
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avi Kivity <[email protected]>
commit cb09cad44f07044d9810f18f6f9a6a6f3771f979 upstream.
Probably a leftover from the early days of self-patching, p6nops are marked __initconst_or_module, which causes them to be discarded in a non-modular kernel. If something later triggers patching, it will overwrite kernel code with garbage.
--- arch/x86/kernel/alternative.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/alternative.c +1 -1
@@ -160,7 +160,7 @@ static const unsigned char * const k7_no#endif #ifdef P6_NOP1 -static const unsigned char __initconst_or_module p6nops[] = +static const unsigned char p6nops[] = {P6_NOP1 , P6_NOP2,
Greg Kroah-Hartman
maintainerPATCH 57/58 SCSI: scsi_remove_target: fix softlockup regression on hot remove
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit bc3f02a795d3b4faa99d37390174be2a75d091bd upstream.
John reports:
BUG: soft lockup - CPU#2 stuck for 23s! [kworker/u:8:2202] [..] Call Trace: [<ffffffff8141782a>] scsi_remove_target+0xda/0x1f0 [<ffffffff81421de5>] sas_rphy_remove+0x55/0x60 [<ffffffff81421e01>] sas_rphy_delete+0x11/0x20 [<ffffffff81421e35>] sas_port_delete+0x25/0x160 [<ffffffff814549a3>] mptsas_del_end_device+0x183/0x270
...introduced by commit 3b661a9 "[SCSI] fix hot unplug vs async scan race".
Don't restart lookup of more stargets in the multi-target case, just arrange to traverse the list once, on the assumption that new targets are always added at the end. There is no guarantee that the target will change state in scsi_target_reap() so we can end up spinning if we restart.
LKML-Reference: <CAEhu1-6wq1YsNiscGMwP4ud0Q+MrViRzv=kcWCQSBNc8c68N5Q@mail.gmail.com>
--- drivers/scsi/scsi_sysfs.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-)
drivers/scsi/scsi_sysfs.c +14 -16
@@ -1023,33 +1023,31 @@ static void __scsi_remove_target(structvoid scsi_remove_target (struct device *dev) {struct Scsi_Host *shost =dev_to_shost (dev->parent); -struct scsi_target *starget, *found; +struct scsi_target *starget, *last =NULL ;unsigned long flags; - restart: - found =NULL ; +/* remove targets being careful to lookup next entry before +* deleting the last +*/ spin_lock_irqsave (shost->host_lock, flags);list_for_each_entry (starget, &shost->__targets, siblings) {if (starget->state ==STARGET_DEL )continue ;if (starget->dev.parent == dev || &starget->dev == dev) { - found = starget; - found->reap_ref++; -break ; +/* assuming new targets arrive at the end */ + starget->reap_ref++; +spin_unlock_irqrestore (shost->host_lock, flags); +if (last) +scsi_target_reap (last); + last = starget; +__scsi_remove_target (starget); +spin_lock_irqsave (shost->host_lock, flags); } }spin_unlock_irqrestore (shost->host_lock, flags); -if (found) { -__scsi_remove_target (found); -scsi_target_reap (found); -/* in the case where @dev has multiple starget children, -* continue removing. -* -* FIXME: does such a case exist? -*/ - goto restart; - } +if (last) +scsi_target_reap (last); }EXPORT_SYMBOL (scsi_remove_target);
Greg Kroah-Hartman
maintainerPATCH 58/58 SCSI: scsi_dh_alua: Enable STPG for unavailable ports
In reply to Greg Kroah-Hartman3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit e47f8976d8e573928824a06748f7bc82c58d747f upstream.
A quote from SPC-4: "While in the unavailable primary target port asymmetric access state, the device server shall support those of the following commands that it supports while in the active/optimized
state: [ ... ] d) SET TARGET PORT GROUPS; [ ... ]". Hence enable sending STPG to a target port group that is in the unavailable state.
--- drivers/scsi/device_handler/scsi_dh_alua.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/device_handler/scsi_dh_alua.c +1 -2
@@ -590,8 +590,7 @@ static int alua_rtpg(struct scsi_device h->state =TPGS_STATE_STANDBY ;break ;case TPGS_STATE_OFFLINE : -case TPGS_STATE_UNAVAILABLE : -/* Path unusable for unavailable/offline */ +/* Path unusable */ err =SCSI_DH_DEV_OFFLINED ;break ;default :