mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'v4.9.261' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-4.9.y
This is the 4.9.261 stable release Change-Id: I159a5fb0fbbd0c2995166da9a7fb4a1e23511176
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 260
|
||||
SUBLEVEL = 261
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -180,15 +180,17 @@ static ssize_t rsxx_cram_read(struct file *fp, char __user *ubuf,
|
||||
{
|
||||
struct rsxx_cardinfo *card = file_inode(fp)->i_private;
|
||||
char *buf;
|
||||
ssize_t st;
|
||||
int st;
|
||||
|
||||
buf = kzalloc(cnt, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
st = rsxx_creg_read(card, CREG_ADD_CRAM + (u32)*ppos, cnt, buf, 1);
|
||||
if (!st)
|
||||
st = copy_to_user(ubuf, buf, cnt);
|
||||
if (!st) {
|
||||
if (copy_to_user(ubuf, buf, cnt))
|
||||
st = -EFAULT;
|
||||
}
|
||||
kfree(buf);
|
||||
if (st)
|
||||
return st;
|
||||
|
||||
@@ -1331,24 +1331,26 @@ static void increase_address_space(struct protection_domain *domain,
|
||||
unsigned long flags;
|
||||
u64 *pte;
|
||||
|
||||
pte = (void *)get_zeroed_page(gfp);
|
||||
if (!pte)
|
||||
goto out;
|
||||
|
||||
spin_lock_irqsave(&domain->lock, flags);
|
||||
|
||||
if (WARN_ON_ONCE(domain->mode == PAGE_MODE_6_LEVEL))
|
||||
/* address space already 64 bit large */
|
||||
goto out;
|
||||
|
||||
pte = (void *)get_zeroed_page(gfp);
|
||||
if (!pte)
|
||||
goto out;
|
||||
|
||||
*pte = PM_LEVEL_PDE(domain->mode,
|
||||
virt_to_phys(domain->pt_root));
|
||||
domain->pt_root = pte;
|
||||
domain->mode += 1;
|
||||
domain->updated = true;
|
||||
pte = NULL;
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&domain->lock, flags);
|
||||
free_page((unsigned long)pte);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -849,12 +849,12 @@ void dm_table_set_type(struct dm_table *t, unsigned type)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_table_set_type);
|
||||
|
||||
static int device_supports_dax(struct dm_target *ti, struct dm_dev *dev,
|
||||
sector_t start, sector_t len, void *data)
|
||||
static int device_not_dax_capable(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_dax(q);
|
||||
return q && !blk_queue_dax(q);
|
||||
}
|
||||
|
||||
static bool dm_table_supports_dax(struct dm_table *t)
|
||||
@@ -870,7 +870,7 @@ static bool dm_table_supports_dax(struct dm_table *t)
|
||||
return false;
|
||||
|
||||
if (!ti->type->iterate_devices ||
|
||||
!ti->type->iterate_devices(ti, device_supports_dax, NULL))
|
||||
ti->type->iterate_devices(ti, device_not_dax_capable, NULL))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1307,6 +1307,46 @@ struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector)
|
||||
return &t->targets[(KEYS_PER_NODE * n) + k];
|
||||
}
|
||||
|
||||
/*
|
||||
* type->iterate_devices() should be called when the sanity check needs to
|
||||
* iterate and check all underlying data devices. iterate_devices() will
|
||||
* iterate all underlying data devices until it encounters a non-zero return
|
||||
* code, returned by whether the input iterate_devices_callout_fn, or
|
||||
* iterate_devices() itself internally.
|
||||
*
|
||||
* For some target type (e.g. dm-stripe), one call of iterate_devices() may
|
||||
* iterate multiple underlying devices internally, in which case a non-zero
|
||||
* return code returned by iterate_devices_callout_fn will stop the iteration
|
||||
* in advance.
|
||||
*
|
||||
* Cases requiring _any_ underlying device supporting some kind of attribute,
|
||||
* should use the iteration structure like dm_table_any_dev_attr(), or call
|
||||
* it directly. @func should handle semantics of positive examples, e.g.
|
||||
* capable of something.
|
||||
*
|
||||
* Cases requiring _all_ underlying devices supporting some kind of attribute,
|
||||
* should use the iteration structure like dm_table_supports_nowait() or
|
||||
* dm_table_supports_discards(). Or introduce dm_table_all_devs_attr() that
|
||||
* uses an @anti_func that handle semantics of counter examples, e.g. not
|
||||
* capable of something. So: return !dm_table_any_dev_attr(t, anti_func);
|
||||
*/
|
||||
static bool dm_table_any_dev_attr(struct dm_table *t,
|
||||
iterate_devices_callout_fn func)
|
||||
{
|
||||
struct dm_target *ti;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < dm_table_get_num_targets(t); i++) {
|
||||
ti = dm_table_get_target(t, i);
|
||||
|
||||
if (ti->type->iterate_devices &&
|
||||
ti->type->iterate_devices(ti, func, NULL))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int count_device(struct dm_target *ti, struct dm_dev *dev,
|
||||
sector_t start, sector_t len, void *data)
|
||||
{
|
||||
@@ -1477,12 +1517,12 @@ static bool dm_table_discard_zeroes_data(struct dm_table *t)
|
||||
return true;
|
||||
}
|
||||
|
||||
static int device_is_nonrot(struct dm_target *ti, struct dm_dev *dev,
|
||||
sector_t start, sector_t len, void *data)
|
||||
static int device_is_rotational(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_nonrot(q);
|
||||
return q && !blk_queue_nonrot(q);
|
||||
}
|
||||
|
||||
static int device_is_not_random(struct dm_target *ti, struct dm_dev *dev,
|
||||
@@ -1493,29 +1533,12 @@ static int device_is_not_random(struct dm_target *ti, struct dm_dev *dev,
|
||||
return q && !blk_queue_add_random(q);
|
||||
}
|
||||
|
||||
static int queue_supports_sg_merge(struct dm_target *ti, struct dm_dev *dev,
|
||||
sector_t start, sector_t len, void *data)
|
||||
static int queue_no_sg_merge(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 && !test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags);
|
||||
}
|
||||
|
||||
static bool dm_table_all_devices_attribute(struct dm_table *t,
|
||||
iterate_devices_callout_fn func)
|
||||
{
|
||||
struct dm_target *ti;
|
||||
unsigned i = 0;
|
||||
|
||||
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, func, NULL))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return q && test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags);
|
||||
}
|
||||
|
||||
static int device_not_write_same_capable(struct dm_target *ti, struct dm_dev *dev,
|
||||
@@ -1608,18 +1631,18 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
|
||||
q->limits.discard_zeroes_data = 0;
|
||||
|
||||
/* 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
|
||||
if (dm_table_any_dev_attr(t, device_is_rotational))
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_NONROT, q);
|
||||
else
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
|
||||
|
||||
if (!dm_table_supports_write_same(t))
|
||||
q->limits.max_write_same_sectors = 0;
|
||||
|
||||
if (dm_table_all_devices_attribute(t, queue_supports_sg_merge))
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_NO_SG_MERGE, q);
|
||||
else
|
||||
if (dm_table_any_dev_attr(t, queue_no_sg_merge))
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_NO_SG_MERGE, q);
|
||||
else
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_NO_SG_MERGE, q);
|
||||
|
||||
dm_table_verify_integrity(t);
|
||||
|
||||
@@ -1629,7 +1652,7 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
|
||||
* 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))
|
||||
if (blk_queue_add_random(q) && dm_table_any_dev_attr(t, device_is_not_random))
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, q);
|
||||
|
||||
/*
|
||||
|
||||
@@ -38,6 +38,10 @@ static const struct eeprom_93xx46_devtype_data atmel_at93c46d_data = {
|
||||
EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH,
|
||||
};
|
||||
|
||||
static const struct eeprom_93xx46_devtype_data microchip_93lc46b_data = {
|
||||
.quirks = EEPROM_93XX46_QUIRK_EXTRA_READ_CYCLE,
|
||||
};
|
||||
|
||||
struct eeprom_93xx46_dev {
|
||||
struct spi_device *spi;
|
||||
struct eeprom_93xx46_platform_data *pdata;
|
||||
@@ -58,6 +62,11 @@ static inline bool has_quirk_instruction_length(struct eeprom_93xx46_dev *edev)
|
||||
return edev->pdata->quirks & EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH;
|
||||
}
|
||||
|
||||
static inline bool has_quirk_extra_read_cycle(struct eeprom_93xx46_dev *edev)
|
||||
{
|
||||
return edev->pdata->quirks & EEPROM_93XX46_QUIRK_EXTRA_READ_CYCLE;
|
||||
}
|
||||
|
||||
static int eeprom_93xx46_read(void *priv, unsigned int off,
|
||||
void *val, size_t count)
|
||||
{
|
||||
@@ -99,6 +108,11 @@ static int eeprom_93xx46_read(void *priv, unsigned int off,
|
||||
dev_dbg(&edev->spi->dev, "read cmd 0x%x, %d Hz\n",
|
||||
cmd_addr, edev->spi->max_speed_hz);
|
||||
|
||||
if (has_quirk_extra_read_cycle(edev)) {
|
||||
cmd_addr <<= 1;
|
||||
bits += 1;
|
||||
}
|
||||
|
||||
spi_message_init(&m);
|
||||
|
||||
t[0].tx_buf = (char *)&cmd_addr;
|
||||
@@ -366,6 +380,7 @@ static void select_deassert(void *context)
|
||||
static const struct of_device_id eeprom_93xx46_of_table[] = {
|
||||
{ .compatible = "eeprom-93xx46", },
|
||||
{ .compatible = "atmel,at93c46d", .data = &atmel_at93c46d_data, },
|
||||
{ .compatible = "microchip,93lc46b", .data = µchip_93lc46b_data, },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table);
|
||||
|
||||
@@ -3928,6 +3928,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9182,
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c46 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0,
|
||||
quirk_dma_func1_alias);
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c135 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9215,
|
||||
quirk_dma_func1_alias);
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c127 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9220,
|
||||
quirk_dma_func1_alias);
|
||||
|
||||
@@ -229,6 +229,7 @@ static int mailled = -1;
|
||||
static int brightness = -1;
|
||||
static int threeg = -1;
|
||||
static int force_series;
|
||||
static int force_caps = -1;
|
||||
static bool ec_raw_mode;
|
||||
static bool has_type_aa;
|
||||
static u16 commun_func_bitmap;
|
||||
@@ -238,11 +239,13 @@ module_param(mailled, int, 0444);
|
||||
module_param(brightness, int, 0444);
|
||||
module_param(threeg, int, 0444);
|
||||
module_param(force_series, int, 0444);
|
||||
module_param(force_caps, int, 0444);
|
||||
module_param(ec_raw_mode, bool, 0444);
|
||||
MODULE_PARM_DESC(mailled, "Set initial state of Mail LED");
|
||||
MODULE_PARM_DESC(brightness, "Set initial LCD backlight brightness");
|
||||
MODULE_PARM_DESC(threeg, "Set initial state of 3G hardware");
|
||||
MODULE_PARM_DESC(force_series, "Force a different laptop series");
|
||||
MODULE_PARM_DESC(force_caps, "Force the capability bitmask to this value");
|
||||
MODULE_PARM_DESC(ec_raw_mode, "Enable EC raw mode");
|
||||
|
||||
struct acer_data {
|
||||
@@ -2198,7 +2201,7 @@ static int __init acer_wmi_init(void)
|
||||
}
|
||||
/* WMID always provides brightness methods */
|
||||
interface->capability |= ACER_CAP_BRIGHTNESS;
|
||||
} else if (!wmi_has_guid(WMID_GUID2) && interface && !has_type_aa) {
|
||||
} else if (!wmi_has_guid(WMID_GUID2) && interface && !has_type_aa && force_caps == -1) {
|
||||
pr_err("No WMID device detection method found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -2228,6 +2231,9 @@ static int __init acer_wmi_init(void)
|
||||
if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
|
||||
interface->capability &= ~ACER_CAP_BRIGHTNESS;
|
||||
|
||||
if (force_caps != -1)
|
||||
interface->capability = force_caps;
|
||||
|
||||
if (wmi_has_guid(WMID_GUID3)) {
|
||||
if (ec_raw_mode) {
|
||||
if (ACPI_FAILURE(acer_wmi_enable_ec_raw())) {
|
||||
|
||||
@@ -1179,22 +1179,19 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio)
|
||||
int nr_data = rbio->nr_data;
|
||||
int stripe;
|
||||
int pagenr;
|
||||
int p_stripe = -1;
|
||||
int q_stripe = -1;
|
||||
bool has_qstripe;
|
||||
struct bio_list bio_list;
|
||||
struct bio *bio;
|
||||
int ret;
|
||||
|
||||
bio_list_init(&bio_list);
|
||||
|
||||
if (rbio->real_stripes - rbio->nr_data == 1) {
|
||||
p_stripe = rbio->real_stripes - 1;
|
||||
} else if (rbio->real_stripes - rbio->nr_data == 2) {
|
||||
p_stripe = rbio->real_stripes - 2;
|
||||
q_stripe = rbio->real_stripes - 1;
|
||||
} else {
|
||||
if (rbio->real_stripes - rbio->nr_data == 1)
|
||||
has_qstripe = false;
|
||||
else if (rbio->real_stripes - rbio->nr_data == 2)
|
||||
has_qstripe = true;
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* at this point we either have a full stripe,
|
||||
* or we've read the full stripe from the drive.
|
||||
@@ -1238,7 +1235,7 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio)
|
||||
SetPageUptodate(p);
|
||||
pointers[stripe++] = kmap(p);
|
||||
|
||||
if (q_stripe != -1) {
|
||||
if (has_qstripe) {
|
||||
|
||||
/*
|
||||
* raid6, add the qstripe and call the
|
||||
@@ -2306,8 +2303,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
int nr_data = rbio->nr_data;
|
||||
int stripe;
|
||||
int pagenr;
|
||||
int p_stripe = -1;
|
||||
int q_stripe = -1;
|
||||
bool has_qstripe;
|
||||
struct page *p_page = NULL;
|
||||
struct page *q_page = NULL;
|
||||
struct bio_list bio_list;
|
||||
@@ -2317,14 +2313,12 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
|
||||
bio_list_init(&bio_list);
|
||||
|
||||
if (rbio->real_stripes - rbio->nr_data == 1) {
|
||||
p_stripe = rbio->real_stripes - 1;
|
||||
} else if (rbio->real_stripes - rbio->nr_data == 2) {
|
||||
p_stripe = rbio->real_stripes - 2;
|
||||
q_stripe = rbio->real_stripes - 1;
|
||||
} else {
|
||||
if (rbio->real_stripes - rbio->nr_data == 1)
|
||||
has_qstripe = false;
|
||||
else if (rbio->real_stripes - rbio->nr_data == 2)
|
||||
has_qstripe = true;
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (bbio->num_tgtdevs && bbio->tgtdev_map[rbio->scrubp]) {
|
||||
is_replace = 1;
|
||||
@@ -2346,17 +2340,22 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
goto cleanup;
|
||||
SetPageUptodate(p_page);
|
||||
|
||||
if (q_stripe != -1) {
|
||||
if (has_qstripe) {
|
||||
/* RAID6, allocate and map temp space for the Q stripe */
|
||||
q_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
|
||||
if (!q_page) {
|
||||
__free_page(p_page);
|
||||
goto cleanup;
|
||||
}
|
||||
SetPageUptodate(q_page);
|
||||
pointers[rbio->real_stripes - 1] = kmap(q_page);
|
||||
}
|
||||
|
||||
atomic_set(&rbio->error, 0);
|
||||
|
||||
/* Map the parity stripe just once */
|
||||
pointers[nr_data] = kmap(p_page);
|
||||
|
||||
for_each_set_bit(pagenr, rbio->dbitmap, rbio->stripe_npages) {
|
||||
struct page *p;
|
||||
void *parity;
|
||||
@@ -2366,17 +2365,8 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
pointers[stripe] = kmap(p);
|
||||
}
|
||||
|
||||
/* then add the parity stripe */
|
||||
pointers[stripe++] = kmap(p_page);
|
||||
|
||||
if (q_stripe != -1) {
|
||||
|
||||
/*
|
||||
* raid6, add the qstripe and call the
|
||||
* library function to fill in our p/q
|
||||
*/
|
||||
pointers[stripe++] = kmap(q_page);
|
||||
|
||||
if (has_qstripe) {
|
||||
/* RAID6, call the library function to fill in our P/Q */
|
||||
raid6_call.gen_syndrome(rbio->real_stripes, PAGE_SIZE,
|
||||
pointers);
|
||||
} else {
|
||||
@@ -2397,12 +2387,14 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
|
||||
|
||||
for (stripe = 0; stripe < nr_data; stripe++)
|
||||
kunmap(page_in_rbio(rbio, stripe, pagenr, 0));
|
||||
kunmap(p_page);
|
||||
}
|
||||
|
||||
kunmap(p_page);
|
||||
__free_page(p_page);
|
||||
if (q_page)
|
||||
if (q_page) {
|
||||
kunmap(q_page);
|
||||
__free_page(q_page);
|
||||
}
|
||||
|
||||
writeback:
|
||||
/*
|
||||
|
||||
@@ -16,6 +16,8 @@ struct eeprom_93xx46_platform_data {
|
||||
#define EEPROM_93XX46_QUIRK_SINGLE_WORD_READ (1 << 0)
|
||||
/* Instructions such as EWEN are (addrlen + 2) in length. */
|
||||
#define EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH (1 << 1)
|
||||
/* Add extra cycle after address during a read */
|
||||
#define EEPROM_93XX46_QUIRK_EXTRA_READ_CYCLE BIT(2)
|
||||
|
||||
/*
|
||||
* optional hooks to control additional logic
|
||||
|
||||
@@ -995,7 +995,7 @@ static int daio_mgr_dao_init(void *blk, unsigned int idx, unsigned int conf)
|
||||
|
||||
if (idx < 4) {
|
||||
/* S/PDIF output */
|
||||
switch ((conf & 0x7)) {
|
||||
switch ((conf & 0xf)) {
|
||||
case 1:
|
||||
set_field(&ctl->txctl[idx], ATXCTL_NUC, 0);
|
||||
break;
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "list.h"
|
||||
#include "sysfs_utils.h"
|
||||
|
||||
struct udev *udev_context;
|
||||
extern struct udev *udev_context;
|
||||
|
||||
static int32_t read_attr_usbip_status(struct usbip_usb_device *udev)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user