mirror of
https://github.com/Fishwaldo/build.git
synced 2025-06-06 06:11:31 +00:00
Upgrade Pine64 kernel to 3.10.82
This commit is contained in:
parent
1269de0af5
commit
b4bd423c96
9 changed files with 7852 additions and 0 deletions
2030
patch/kernel/pine64-default/01-patch-3.10.75-76.patch
Normal file
2030
patch/kernel/pine64-default/01-patch-3.10.75-76.patch
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,66 @@
|
|||
diff -Npur linux-3.10-orig/fs/aufs/dcsub.c linux-3.10/fs/aufs/dcsub.c
|
||||
--- linux-3.10-orig/fs/aufs/dcsub.c 2015-04-29 22:40:06.283275000 +0200
|
||||
+++ linux-3.10/fs/aufs/dcsub.c 2015-04-29 22:46:47.401454025 +0200
|
||||
@@ -133,7 +133,7 @@ resume:
|
||||
while (next != &this_parent->d_subdirs) {
|
||||
struct list_head *tmp = next;
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry,
|
||||
- d_u.d_child);
|
||||
+ d_child);
|
||||
|
||||
next = tmp->next;
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
@@ -169,7 +169,7 @@ resume:
|
||||
this_parent = tmp;
|
||||
spin_lock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
- next = child->d_u.d_child.next;
|
||||
+ next = child->d_child.next;
|
||||
goto resume;
|
||||
}
|
||||
|
||||
diff -Npur linux-3.10-orig/fs/aufs/debug.c linux-3.10/fs/aufs/debug.c
|
||||
--- linux-3.10-orig/fs/aufs/debug.c 2015-04-29 22:40:06.283275000 +0200
|
||||
+++ linux-3.10/fs/aufs/debug.c 2015-04-29 22:46:47.404789024 +0200
|
||||
@@ -169,7 +169,7 @@ void au_dpri_dalias(struct inode *inode)
|
||||
struct dentry *d;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
- hlist_for_each_entry(d, &inode->i_dentry, d_alias)
|
||||
+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias)
|
||||
au_dpri_dentry(d);
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
diff -Npur linux-3.10-orig/fs/aufs/export.c linux-3.10/fs/aufs/export.c
|
||||
--- linux-3.10-orig/fs/aufs/export.c 2015-04-29 22:40:06.286612000 +0200
|
||||
+++ linux-3.10/fs/aufs/export.c 2015-04-29 22:46:47.418129024 +0200
|
||||
@@ -243,7 +243,7 @@ static struct dentry *decode_by_ino(stru
|
||||
dentry = d_find_alias(inode);
|
||||
else {
|
||||
spin_lock(&inode->i_lock);
|
||||
- hlist_for_each_entry(d, &inode->i_dentry, d_alias) {
|
||||
+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) {
|
||||
spin_lock(&d->d_lock);
|
||||
if (!au_test_anon(d)
|
||||
&& d->d_parent->d_inode->i_ino == dir_ino) {
|
||||
diff -Npur linux-3.10-orig/fs/aufs/hnotify.c linux-3.10/fs/aufs/hnotify.c
|
||||
--- linux-3.10-orig/fs/aufs/hnotify.c 2015-04-29 22:40:06.293285000 +0200
|
||||
+++ linux-3.10/fs/aufs/hnotify.c 2015-04-29 22:46:47.431469023 +0200
|
||||
@@ -211,7 +211,7 @@ static int hn_gen_by_inode(char *name, u
|
||||
AuDebugOn(!name);
|
||||
au_iigen_dec(inode);
|
||||
spin_lock(&inode->i_lock);
|
||||
- hlist_for_each_entry(d, &inode->i_dentry, d_alias) {
|
||||
+ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) {
|
||||
spin_lock(&d->d_lock);
|
||||
dname = &d->d_name;
|
||||
if (dname->len != nlen
|
||||
@@ -378,7 +378,7 @@ static struct dentry *lookup_wlock_by_na
|
||||
|
||||
dentry = NULL;
|
||||
spin_lock(&parent->d_lock);
|
||||
- list_for_each_entry(d, &parent->d_subdirs, d_u.d_child) {
|
||||
+ list_for_each_entry(d, &parent->d_subdirs, d_child) {
|
||||
/* AuDbg("%.*s\n", AuDLNPair(d)); */
|
||||
spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
dname = &d->d_name;
|
1809
patch/kernel/pine64-default/01-patch-3.10.76-77-e.patch
Normal file
1809
patch/kernel/pine64-default/01-patch-3.10.76-77-e.patch
Normal file
File diff suppressed because it is too large
Load diff
1032
patch/kernel/pine64-default/01-patch-3.10.77-78.patch
Normal file
1032
patch/kernel/pine64-default/01-patch-3.10.77-78.patch
Normal file
File diff suppressed because it is too large
Load diff
728
patch/kernel/pine64-default/01-patch-3.10.78-79.patch
Normal file
728
patch/kernel/pine64-default/01-patch-3.10.78-79.patch
Normal file
|
@ -0,0 +1,728 @@
|
|||
diff --git a/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt b/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
||||
index a4873e5e3e36..e30e184f50c7 100644
|
||||
--- a/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
||||
+++ b/Documentation/devicetree/bindings/dma/fsl-mxs-dma.txt
|
||||
@@ -38,7 +38,7 @@ dma_apbx: dma-apbx@80024000 {
|
||||
80 81 68 69
|
||||
70 71 72 73
|
||||
74 75 76 77>;
|
||||
- interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
||||
+ interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
||||
"saif0", "saif1", "i2c0", "i2c1",
|
||||
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
||||
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
||||
diff --git a/Makefile b/Makefile
|
||||
index cf99a9b53c6f..e26cb1e56266 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 78
|
||||
+SUBLEVEL = 79
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
index 9746d0e7fcb4..5dfb3d354470 100644
|
||||
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
|
||||
@@ -32,6 +32,10 @@
|
||||
0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>;
|
||||
|
||||
internal-regs {
|
||||
+ rtc@10300 {
|
||||
+ /* No crystal connected to the internal RTC */
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
serial@12000 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts
|
||||
index d107c4af321f..6fef54416cbf 100644
|
||||
--- a/arch/arm/boot/dts/imx23-olinuxino.dts
|
||||
+++ b/arch/arm/boot/dts/imx23-olinuxino.dts
|
||||
@@ -89,6 +89,7 @@
|
||||
|
||||
ahb@80080000 {
|
||||
usb0: usb@80080000 {
|
||||
+ dr_mode = "host";
|
||||
vbus-supply = <®_usb0_vbus>;
|
||||
status = "okay";
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi
|
||||
index 97d1a550eb98..2a571bcacaf4 100644
|
||||
--- a/arch/arm/boot/dts/imx25.dtsi
|
||||
+++ b/arch/arm/boot/dts/imx25.dtsi
|
||||
@@ -393,6 +393,7 @@
|
||||
|
||||
pwm4: pwm@53fc8000 {
|
||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||
+ #pwm-cells = <2>;
|
||||
reg = <0x53fc8000 0x4000>;
|
||||
clocks = <&clks 108>, <&clks 52>;
|
||||
clock-names = "ipg", "per";
|
||||
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi
|
||||
index 4c10a1968c0e..2e76b84c6bad 100644
|
||||
--- a/arch/arm/boot/dts/imx28.dtsi
|
||||
+++ b/arch/arm/boot/dts/imx28.dtsi
|
||||
@@ -691,7 +691,7 @@
|
||||
80 81 68 69
|
||||
70 71 72 73
|
||||
74 75 76 77>;
|
||||
- interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
||||
+ interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
||||
"saif0", "saif1", "i2c0", "i2c1",
|
||||
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
||||
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
||||
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c
|
||||
index ee6367b8eaf7..e9b13b92ba1e 100644
|
||||
--- a/drivers/acpi/acpica/dsopcode.c
|
||||
+++ b/drivers/acpi/acpica/dsopcode.c
|
||||
@@ -539,8 +539,7 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
- obj_desc->region.address =
|
||||
- (acpi_physical_address) ACPI_TO_INTEGER(table);
|
||||
+ obj_desc->region.address = ACPI_PTR_TO_PHYSADDR(table);
|
||||
obj_desc->region.length = table->length;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
|
||||
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c
|
||||
index e57cd38004e3..0d2351596a3c 100644
|
||||
--- a/drivers/acpi/acpica/tbinstal.c
|
||||
+++ b/drivers/acpi/acpica/tbinstal.c
|
||||
@@ -301,8 +301,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
||||
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
|
||||
"%4.4s %p Attempted physical table override failed",
|
||||
table_header->signature,
|
||||
- ACPI_CAST_PTR(void,
|
||||
- table_desc->address)));
|
||||
+ ACPI_PHYSADDR_TO_PTR(table_desc->address)));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -318,7 +317,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %p %s table override, new table: %p",
|
||||
table_header->signature,
|
||||
- ACPI_CAST_PTR(void, table_desc->address),
|
||||
+ ACPI_PHYSADDR_TO_PTR(table_desc->address),
|
||||
override_type, new_table));
|
||||
|
||||
/* We can now unmap/delete the original table (if fully mapped) */
|
||||
diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c
|
||||
index 7c2ecfb7c2c3..e12486031d97 100644
|
||||
--- a/drivers/acpi/acpica/tbxfroot.c
|
||||
+++ b/drivers/acpi/acpica/tbxfroot.c
|
||||
@@ -118,7 +118,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
-acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
||||
+acpi_status acpi_find_root_pointer(acpi_physical_address * table_address)
|
||||
{
|
||||
u8 *table_ptr;
|
||||
u8 *mem_rover;
|
||||
@@ -176,7 +176,8 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
||||
physical_address +=
|
||||
(u32) ACPI_PTR_DIFF(mem_rover, table_ptr);
|
||||
|
||||
- *table_address = physical_address;
|
||||
+ *table_address =
|
||||
+ (acpi_physical_address) physical_address;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
}
|
||||
@@ -209,7 +210,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
||||
(ACPI_HI_RSDP_WINDOW_BASE +
|
||||
ACPI_PTR_DIFF(mem_rover, table_ptr));
|
||||
|
||||
- *table_address = physical_address;
|
||||
+ *table_address = (acpi_physical_address) physical_address;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
|
||||
index ca1cb2d756c2..c3768fafff45 100644
|
||||
--- a/drivers/gpio/gpiolib.c
|
||||
+++ b/drivers/gpio/gpiolib.c
|
||||
@@ -752,6 +752,7 @@ static struct class gpio_class = {
|
||||
*/
|
||||
static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
{
|
||||
+ struct gpio_chip *chip;
|
||||
unsigned long flags;
|
||||
int status;
|
||||
const char *ioname = NULL;
|
||||
@@ -769,8 +770,16 @@ static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ chip = desc->chip;
|
||||
+
|
||||
mutex_lock(&sysfs_lock);
|
||||
|
||||
+ /* check if chip is being removed */
|
||||
+ if (!chip || !chip->exported) {
|
||||
+ status = -ENODEV;
|
||||
+ goto fail_unlock;
|
||||
+ }
|
||||
+
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
|
||||
test_bit(FLAG_EXPORT, &desc->flags)) {
|
||||
@@ -1040,6 +1049,8 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
||||
{
|
||||
int status;
|
||||
struct device *dev;
|
||||
+ struct gpio_desc *desc;
|
||||
+ unsigned int i;
|
||||
|
||||
mutex_lock(&sysfs_lock);
|
||||
dev = class_find_device(&gpio_class, NULL, chip, match_export);
|
||||
@@ -1047,6 +1058,7 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
||||
sysfs_remove_group(&dev->kobj, &gpiochip_attr_group);
|
||||
put_device(dev);
|
||||
device_unregister(dev);
|
||||
+ /* prevent further gpiod exports */
|
||||
chip->exported = 0;
|
||||
status = 0;
|
||||
} else
|
||||
@@ -1056,6 +1068,13 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
||||
if (status)
|
||||
pr_debug("%s: chip %s status %d\n", __func__,
|
||||
chip->label, status);
|
||||
+
|
||||
+ /* unregister gpiod class devices owned by sysfs */
|
||||
+ for (i = 0; i < chip->ngpio; i++) {
|
||||
+ desc = &chip->desc[i];
|
||||
+ if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))
|
||||
+ gpiod_free(desc);
|
||||
+ }
|
||||
}
|
||||
|
||||
static int __init gpiolib_sysfs_init(void)
|
||||
@@ -1265,6 +1284,8 @@ int gpiochip_remove(struct gpio_chip *chip)
|
||||
int status = 0;
|
||||
unsigned id;
|
||||
|
||||
+ gpiochip_unexport(chip);
|
||||
+
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
|
||||
gpiochip_remove_pin_ranges(chip);
|
||||
@@ -1285,9 +1306,6 @@ int gpiochip_remove(struct gpio_chip *chip)
|
||||
|
||||
spin_unlock_irqrestore(&gpio_lock, flags);
|
||||
|
||||
- if (status == 0)
|
||||
- gpiochip_unexport(chip);
|
||||
-
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_remove);
|
||||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
||||
index f5d1dc5b5563..54ebfbe370c6 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
||||
@@ -1007,12 +1007,28 @@ static int intel_dual_link_lvds_callback(const struct dmi_system_id *id)
|
||||
static const struct dmi_system_id intel_dual_link_lvds[] = {
|
||||
{
|
||||
.callback = intel_dual_link_lvds_callback,
|
||||
- .ident = "Apple MacBook Pro (Core i5/i7 Series)",
|
||||
+ .ident = "Apple MacBook Pro 15\" (2010)",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6,2"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
+ .callback = intel_dual_link_lvds_callback,
|
||||
+ .ident = "Apple MacBook Pro 15\" (2011)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"),
|
||||
},
|
||||
},
|
||||
+ {
|
||||
+ .callback = intel_dual_link_lvds_callback,
|
||||
+ .ident = "Apple MacBook Pro 15\" (2012)",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro9,1"),
|
||||
+ },
|
||||
+ },
|
||||
{ } /* terminating entry */
|
||||
};
|
||||
|
||||
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
|
||||
index 7ad66823d022..56998eca1a8d 100644
|
||||
--- a/drivers/mmc/card/block.c
|
||||
+++ b/drivers/mmc/card/block.c
|
||||
@@ -908,6 +908,18 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
|
||||
md->reset_done &= ~type;
|
||||
}
|
||||
|
||||
+int mmc_access_rpmb(struct mmc_queue *mq)
|
||||
+{
|
||||
+ struct mmc_blk_data *md = mq->data;
|
||||
+ /*
|
||||
+ * If this is a RPMB partition access, return ture
|
||||
+ */
|
||||
+ if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
|
||||
{
|
||||
struct mmc_blk_data *md = mq->data;
|
||||
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
|
||||
index 9447a0e970d1..645519fe3acd 100644
|
||||
--- a/drivers/mmc/card/queue.c
|
||||
+++ b/drivers/mmc/card/queue.c
|
||||
@@ -37,7 +37,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)
|
||||
return BLKPREP_KILL;
|
||||
}
|
||||
|
||||
- if (mq && mmc_card_removed(mq->card))
|
||||
+ if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
|
||||
return BLKPREP_KILL;
|
||||
|
||||
req->cmd_flags |= REQ_DONTPREP;
|
||||
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
|
||||
index 5752d50049a3..99e6521e6169 100644
|
||||
--- a/drivers/mmc/card/queue.h
|
||||
+++ b/drivers/mmc/card/queue.h
|
||||
@@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *);
|
||||
extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
|
||||
extern void mmc_packed_clean(struct mmc_queue *);
|
||||
|
||||
+extern int mmc_access_rpmb(struct mmc_queue *);
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
|
||||
index 9c9fc69a01b3..ea40c5139766 100644
|
||||
--- a/drivers/pinctrl/core.c
|
||||
+++ b/drivers/pinctrl/core.c
|
||||
@@ -1077,7 +1077,7 @@ void devm_pinctrl_put(struct pinctrl *p)
|
||||
EXPORT_SYMBOL_GPL(devm_pinctrl_put);
|
||||
|
||||
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
- bool dup, bool locked)
|
||||
+ bool dup)
|
||||
{
|
||||
int i, ret;
|
||||
struct pinctrl_maps *maps_node;
|
||||
@@ -1145,11 +1145,9 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
maps_node->maps = maps;
|
||||
}
|
||||
|
||||
- if (!locked)
|
||||
- mutex_lock(&pinctrl_maps_mutex);
|
||||
+ mutex_lock(&pinctrl_maps_mutex);
|
||||
list_add_tail(&maps_node->node, &pinctrl_maps);
|
||||
- if (!locked)
|
||||
- mutex_unlock(&pinctrl_maps_mutex);
|
||||
+ mutex_unlock(&pinctrl_maps_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1164,7 +1162,7 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
int pinctrl_register_mappings(struct pinctrl_map const *maps,
|
||||
unsigned num_maps)
|
||||
{
|
||||
- return pinctrl_register_map(maps, num_maps, true, false);
|
||||
+ return pinctrl_register_map(maps, num_maps, true);
|
||||
}
|
||||
|
||||
void pinctrl_unregister_map(struct pinctrl_map const *map)
|
||||
diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
|
||||
index 75476b3d87da..b24ea846c867 100644
|
||||
--- a/drivers/pinctrl/core.h
|
||||
+++ b/drivers/pinctrl/core.h
|
||||
@@ -183,7 +183,7 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev,
|
||||
}
|
||||
|
||||
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
- bool dup, bool locked);
|
||||
+ bool dup);
|
||||
void pinctrl_unregister_map(struct pinctrl_map const *map);
|
||||
|
||||
extern int pinctrl_force_sleep(struct pinctrl_dev *pctldev);
|
||||
diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c
|
||||
index 340fb4e6c600..fd91c4c31f6b 100644
|
||||
--- a/drivers/pinctrl/devicetree.c
|
||||
+++ b/drivers/pinctrl/devicetree.c
|
||||
@@ -92,7 +92,7 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename,
|
||||
dt_map->num_maps = num_maps;
|
||||
list_add_tail(&dt_map->node, &p->dt_maps);
|
||||
|
||||
- return pinctrl_register_map(map, num_maps, false, true);
|
||||
+ return pinctrl_register_map(map, num_maps, false);
|
||||
}
|
||||
|
||||
struct pinctrl_dev *of_pinctrl_get(struct device_node *np)
|
||||
diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
|
||||
index 4fc32c8091e9..ff92155dbc88 100644
|
||||
--- a/drivers/tty/hvc/hvc_xen.c
|
||||
+++ b/drivers/tty/hvc/hvc_xen.c
|
||||
@@ -299,11 +299,27 @@ static int xen_initial_domain_console_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void xen_console_update_evtchn(struct xencons_info *info)
|
||||
+{
|
||||
+ if (xen_hvm_domain()) {
|
||||
+ uint64_t v;
|
||||
+ int err;
|
||||
+
|
||||
+ err = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v);
|
||||
+ if (!err && v)
|
||||
+ info->evtchn = v;
|
||||
+ } else
|
||||
+ info->evtchn = xen_start_info->console.domU.evtchn;
|
||||
+}
|
||||
+
|
||||
void xen_console_resume(void)
|
||||
{
|
||||
struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
|
||||
- if (info != NULL && info->irq)
|
||||
+ if (info != NULL && info->irq) {
|
||||
+ if (!xen_initial_domain())
|
||||
+ xen_console_update_evtchn(info);
|
||||
rebind_evtchn_irq(info->evtchn, info->irq);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void xencons_disconnect_backend(struct xencons_info *info)
|
||||
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c
|
||||
index ecdbae19a766..090d8ce25bd1 100644
|
||||
--- a/fs/nilfs2/btree.c
|
||||
+++ b/fs/nilfs2/btree.c
|
||||
@@ -388,7 +388,7 @@ static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
|
||||
nchildren = nilfs_btree_node_get_nchildren(node);
|
||||
|
||||
if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
|
||||
- level > NILFS_BTREE_LEVEL_MAX ||
|
||||
+ level >= NILFS_BTREE_LEVEL_MAX ||
|
||||
nchildren < 0 ||
|
||||
nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
|
||||
pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
|
||||
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
|
||||
index 2b941113e423..2c119d5d04c9 100644
|
||||
--- a/fs/ocfs2/dlm/dlmmaster.c
|
||||
+++ b/fs/ocfs2/dlm/dlmmaster.c
|
||||
@@ -729,6 +729,19 @@ lookup:
|
||||
if (tmpres) {
|
||||
spin_unlock(&dlm->spinlock);
|
||||
spin_lock(&tmpres->spinlock);
|
||||
+
|
||||
+ /*
|
||||
+ * Right after dlm spinlock was released, dlm_thread could have
|
||||
+ * purged the lockres. Check if lockres got unhashed. If so
|
||||
+ * start over.
|
||||
+ */
|
||||
+ if (hlist_unhashed(&tmpres->hash_node)) {
|
||||
+ spin_unlock(&tmpres->spinlock);
|
||||
+ dlm_lockres_put(tmpres);
|
||||
+ tmpres = NULL;
|
||||
+ goto lookup;
|
||||
+ }
|
||||
+
|
||||
/* Wait on the thread that is mastering the resource */
|
||||
if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
|
||||
__dlm_wait_on_lockres(tmpres);
|
||||
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
|
||||
index 454881e6450a..fcabb1597d5b 100644
|
||||
--- a/include/acpi/acpixf.h
|
||||
+++ b/include/acpi/acpixf.h
|
||||
@@ -177,7 +177,7 @@ acpi_status acpi_load_tables(void);
|
||||
*/
|
||||
acpi_status acpi_reallocate_root_table(void);
|
||||
|
||||
-acpi_status acpi_find_root_pointer(acpi_size *rsdp_address);
|
||||
+acpi_status acpi_find_root_pointer(acpi_physical_address *rsdp_address);
|
||||
|
||||
acpi_status acpi_unload_table_id(acpi_owner_id id);
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index 6de0f2c14ec0..f05efb1160fb 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -11,8 +11,6 @@
|
||||
#include <linux/irqnr.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/irqflags.h>
|
||||
-#include <linux/smp.h>
|
||||
-#include <linux/percpu.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/workqueue.h>
|
||||
@@ -488,15 +486,6 @@ extern void __raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
|
||||
-/* This is the worklist that queues up per-cpu softirq work.
|
||||
- *
|
||||
- * send_remote_sendirq() adds work to these lists, and
|
||||
- * the softirq handler itself dequeues from them. The queues
|
||||
- * are protected by disabling local cpu interrupts and they must
|
||||
- * only be accessed by the local cpu that they are for.
|
||||
- */
|
||||
-DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
||||
-
|
||||
DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
|
||||
|
||||
static inline struct task_struct *this_cpu_ksoftirqd(void)
|
||||
@@ -504,17 +493,6 @@ static inline struct task_struct *this_cpu_ksoftirqd(void)
|
||||
return this_cpu_read(ksoftirqd);
|
||||
}
|
||||
|
||||
-/* Try to send a softirq to a remote cpu. If this cannot be done, the
|
||||
- * work will be queued to the local cpu.
|
||||
- */
|
||||
-extern void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq);
|
||||
-
|
||||
-/* Like send_remote_softirq(), but the caller must disable local cpu interrupts
|
||||
- * and compute the current cpu, passed in as 'this_cpu'.
|
||||
- */
|
||||
-extern void __send_remote_softirq(struct call_single_data *cp, int cpu,
|
||||
- int this_cpu, int softirq);
|
||||
-
|
||||
/* Tasklets --- multithreaded analogue of BHs.
|
||||
|
||||
Main feature differing them of generic softirqs: tasklet
|
||||
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
|
||||
index 98755767c7b0..1108acaacfc6 100644
|
||||
--- a/include/linux/nilfs2_fs.h
|
||||
+++ b/include/linux/nilfs2_fs.h
|
||||
@@ -458,7 +458,7 @@ struct nilfs_btree_node {
|
||||
/* level */
|
||||
#define NILFS_BTREE_LEVEL_DATA 0
|
||||
#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
|
||||
-#define NILFS_BTREE_LEVEL_MAX 14
|
||||
+#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */
|
||||
|
||||
/**
|
||||
* struct nilfs_palloc_group_desc - block group descriptor
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index 21956f00cb51..b538df367de3 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -6,8 +6,6 @@
|
||||
* Distribute under GPLv2.
|
||||
*
|
||||
* Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
|
||||
- *
|
||||
- * Remote softirq infrastructure is by Jens Axboe.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
@@ -620,146 +618,17 @@ void tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tasklet_hrtimer_init);
|
||||
|
||||
-/*
|
||||
- * Remote softirq bits
|
||||
- */
|
||||
-
|
||||
-DEFINE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
||||
-EXPORT_PER_CPU_SYMBOL(softirq_work_list);
|
||||
-
|
||||
-static void __local_trigger(struct call_single_data *cp, int softirq)
|
||||
-{
|
||||
- struct list_head *head = &__get_cpu_var(softirq_work_list[softirq]);
|
||||
-
|
||||
- list_add_tail(&cp->list, head);
|
||||
-
|
||||
- /* Trigger the softirq only if the list was previously empty. */
|
||||
- if (head->next == &cp->list)
|
||||
- raise_softirq_irqoff(softirq);
|
||||
-}
|
||||
-
|
||||
-#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
||||
-static void remote_softirq_receive(void *data)
|
||||
-{
|
||||
- struct call_single_data *cp = data;
|
||||
- unsigned long flags;
|
||||
- int softirq;
|
||||
-
|
||||
- softirq = *(int *)cp->info;
|
||||
- local_irq_save(flags);
|
||||
- __local_trigger(cp, softirq);
|
||||
- local_irq_restore(flags);
|
||||
-}
|
||||
-
|
||||
-static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
-{
|
||||
- if (cpu_online(cpu)) {
|
||||
- cp->func = remote_softirq_receive;
|
||||
- cp->info = &softirq;
|
||||
- cp->flags = 0;
|
||||
-
|
||||
- __smp_call_function_single(cpu, cp, 0);
|
||||
- return 0;
|
||||
- }
|
||||
- return 1;
|
||||
-}
|
||||
-#else /* CONFIG_USE_GENERIC_SMP_HELPERS */
|
||||
-static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
-{
|
||||
- return 1;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
-/**
|
||||
- * __send_remote_softirq - try to schedule softirq work on a remote cpu
|
||||
- * @cp: private SMP call function data area
|
||||
- * @cpu: the remote cpu
|
||||
- * @this_cpu: the currently executing cpu
|
||||
- * @softirq: the softirq for the work
|
||||
- *
|
||||
- * Attempt to schedule softirq work on a remote cpu. If this cannot be
|
||||
- * done, the work is instead queued up on the local cpu.
|
||||
- *
|
||||
- * Interrupts must be disabled.
|
||||
- */
|
||||
-void __send_remote_softirq(struct call_single_data *cp, int cpu, int this_cpu, int softirq)
|
||||
-{
|
||||
- if (cpu == this_cpu || __try_remote_softirq(cp, cpu, softirq))
|
||||
- __local_trigger(cp, softirq);
|
||||
-}
|
||||
-EXPORT_SYMBOL(__send_remote_softirq);
|
||||
-
|
||||
-/**
|
||||
- * send_remote_softirq - try to schedule softirq work on a remote cpu
|
||||
- * @cp: private SMP call function data area
|
||||
- * @cpu: the remote cpu
|
||||
- * @softirq: the softirq for the work
|
||||
- *
|
||||
- * Like __send_remote_softirq except that disabling interrupts and
|
||||
- * computing the current cpu is done for the caller.
|
||||
- */
|
||||
-void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
-{
|
||||
- unsigned long flags;
|
||||
- int this_cpu;
|
||||
-
|
||||
- local_irq_save(flags);
|
||||
- this_cpu = smp_processor_id();
|
||||
- __send_remote_softirq(cp, cpu, this_cpu, softirq);
|
||||
- local_irq_restore(flags);
|
||||
-}
|
||||
-EXPORT_SYMBOL(send_remote_softirq);
|
||||
-
|
||||
-static int __cpuinit remote_softirq_cpu_notify(struct notifier_block *self,
|
||||
- unsigned long action, void *hcpu)
|
||||
-{
|
||||
- /*
|
||||
- * If a CPU goes away, splice its entries to the current CPU
|
||||
- * and trigger a run of the softirq
|
||||
- */
|
||||
- if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
|
||||
- int cpu = (unsigned long) hcpu;
|
||||
- int i;
|
||||
-
|
||||
- local_irq_disable();
|
||||
- for (i = 0; i < NR_SOFTIRQS; i++) {
|
||||
- struct list_head *head = &per_cpu(softirq_work_list[i], cpu);
|
||||
- struct list_head *local_head;
|
||||
-
|
||||
- if (list_empty(head))
|
||||
- continue;
|
||||
-
|
||||
- local_head = &__get_cpu_var(softirq_work_list[i]);
|
||||
- list_splice_init(head, local_head);
|
||||
- raise_softirq_irqoff(i);
|
||||
- }
|
||||
- local_irq_enable();
|
||||
- }
|
||||
-
|
||||
- return NOTIFY_OK;
|
||||
-}
|
||||
-
|
||||
-static struct notifier_block __cpuinitdata remote_softirq_cpu_notifier = {
|
||||
- .notifier_call = remote_softirq_cpu_notify,
|
||||
-};
|
||||
-
|
||||
void __init softirq_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
- int i;
|
||||
-
|
||||
per_cpu(tasklet_vec, cpu).tail =
|
||||
&per_cpu(tasklet_vec, cpu).head;
|
||||
per_cpu(tasklet_hi_vec, cpu).tail =
|
||||
&per_cpu(tasklet_hi_vec, cpu).head;
|
||||
- for (i = 0; i < NR_SOFTIRQS; i++)
|
||||
- INIT_LIST_HEAD(&per_cpu(softirq_work_list[i], cpu));
|
||||
}
|
||||
|
||||
- register_hotcpu_notifier(&remote_softirq_cpu_notifier);
|
||||
-
|
||||
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
|
||||
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
|
||||
}
|
||||
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
|
||||
index 603f1fa1b7a3..ca96f411b034 100644
|
||||
--- a/mm/memory-failure.c
|
||||
+++ b/mm/memory-failure.c
|
||||
@@ -1117,10 +1117,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
||||
* The check (unnecessarily) ignores LRU pages being isolated and
|
||||
* walked by the page reclaim code, however that's not a big loss.
|
||||
*/
|
||||
- if (!PageHuge(p) && !PageTransTail(p)) {
|
||||
- if (!PageLRU(p))
|
||||
- shake_page(p, 0);
|
||||
- if (!PageLRU(p)) {
|
||||
+ if (!PageHuge(p)) {
|
||||
+ if (!PageLRU(hpage))
|
||||
+ shake_page(hpage, 0);
|
||||
+ if (!PageLRU(hpage)) {
|
||||
/*
|
||||
* shake_page could have turned it free.
|
||||
*/
|
||||
diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c
|
||||
index 4ff60a6427d9..2e67dd590be5 100644
|
||||
--- a/sound/oss/sequencer.c
|
||||
+++ b/sound/oss/sequencer.c
|
||||
@@ -683,13 +683,8 @@ static int seq_timing_event(unsigned char *event_rec)
|
||||
break;
|
||||
|
||||
case TMR_ECHO:
|
||||
- if (seq_mode == SEQ_2)
|
||||
- seq_copy_to_input(event_rec, 8);
|
||||
- else
|
||||
- {
|
||||
- parm = (parm << 8 | SEQ_ECHO);
|
||||
- seq_copy_to_input((unsigned char *) &parm, 4);
|
||||
- }
|
||||
+ parm = (parm << 8 | SEQ_ECHO);
|
||||
+ seq_copy_to_input((unsigned char *) &parm, 4);
|
||||
break;
|
||||
|
||||
default:;
|
||||
@@ -1332,7 +1327,6 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
||||
int mode = translate_mode(file);
|
||||
struct synth_info inf;
|
||||
struct seq_event_rec event_rec;
|
||||
- unsigned long flags;
|
||||
int __user *p = arg;
|
||||
|
||||
orig_dev = dev = dev >> 4;
|
||||
@@ -1487,9 +1481,7 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
||||
case SNDCTL_SEQ_OUTOFBAND:
|
||||
if (copy_from_user(&event_rec, arg, sizeof(event_rec)))
|
||||
return -EFAULT;
|
||||
- spin_lock_irqsave(&lock,flags);
|
||||
play_event(event_rec.arr);
|
||||
- spin_unlock_irqrestore(&lock,flags);
|
||||
return 0;
|
||||
|
||||
case SNDCTL_MIDI_INFO:
|
1148
patch/kernel/pine64-default/01-patch-3.10.79-80.patch
Normal file
1148
patch/kernel/pine64-default/01-patch-3.10.79-80.patch
Normal file
File diff suppressed because it is too large
Load diff
698
patch/kernel/pine64-default/01-patch-3.10.80-81.patch
Normal file
698
patch/kernel/pine64-default/01-patch-3.10.80-81.patch
Normal file
|
@ -0,0 +1,698 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 067433219984..6d19e37d36d5 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 80
|
||||
+SUBLEVEL = 81
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
|
||||
index d1fea7a054be..7479d8d847a6 100644
|
||||
--- a/arch/mips/kernel/irq.c
|
||||
+++ b/arch/mips/kernel/irq.c
|
||||
@@ -110,7 +110,7 @@ void __init init_IRQ(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
-#ifdef DEBUG_STACKOVERFLOW
|
||||
+#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
static inline void check_stack_overflow(void)
|
||||
{
|
||||
unsigned long sp;
|
||||
diff --git a/block/genhd.c b/block/genhd.c
|
||||
index 7694dffe9f0e..b09f5fc94dee 100644
|
||||
--- a/block/genhd.c
|
||||
+++ b/block/genhd.c
|
||||
@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
||||
/* allocate ext devt */
|
||||
idr_preload(GFP_KERNEL);
|
||||
|
||||
- spin_lock(&ext_devt_lock);
|
||||
+ spin_lock_bh(&ext_devt_lock);
|
||||
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
||||
- spin_unlock(&ext_devt_lock);
|
||||
+ spin_unlock_bh(&ext_devt_lock);
|
||||
|
||||
idr_preload_end();
|
||||
if (idx < 0)
|
||||
@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)
|
||||
return;
|
||||
|
||||
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
||||
- spin_lock(&ext_devt_lock);
|
||||
+ spin_lock_bh(&ext_devt_lock);
|
||||
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
- spin_unlock(&ext_devt_lock);
|
||||
+ spin_unlock_bh(&ext_devt_lock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
||||
} else {
|
||||
struct hd_struct *part;
|
||||
|
||||
- spin_lock(&ext_devt_lock);
|
||||
+ spin_lock_bh(&ext_devt_lock);
|
||||
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
if (part && get_disk(part_to_disk(part))) {
|
||||
*partno = part->partno;
|
||||
disk = part_to_disk(part);
|
||||
}
|
||||
- spin_unlock(&ext_devt_lock);
|
||||
+ spin_unlock_bh(&ext_devt_lock);
|
||||
}
|
||||
|
||||
return disk;
|
||||
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
|
||||
index e73bef3093d2..5507f36a06b4 100644
|
||||
--- a/drivers/ata/pata_octeon_cf.c
|
||||
+++ b/drivers/ata/pata_octeon_cf.c
|
||||
@@ -1068,7 +1068,7 @@ static struct of_device_id octeon_cf_match[] = {
|
||||
},
|
||||
{},
|
||||
};
|
||||
-MODULE_DEVICE_TABLE(of, octeon_i2c_match);
|
||||
+MODULE_DEVICE_TABLE(of, octeon_cf_match);
|
||||
|
||||
static struct platform_driver octeon_cf_driver = {
|
||||
.probe = octeon_cf_probe,
|
||||
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
|
||||
index 4a21e13cc58c..d5e666fb459c 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_i2c.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_i2c.c
|
||||
@@ -441,7 +441,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||
struct intel_gmbus,
|
||||
adapter);
|
||||
struct drm_i915_private *dev_priv = bus->dev_priv;
|
||||
- int i, reg_offset;
|
||||
+ int i = 0, inc, try = 0, reg_offset;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&dev_priv->gmbus_mutex);
|
||||
@@ -453,12 +453,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
||||
|
||||
reg_offset = dev_priv->gpio_mmio_base;
|
||||
|
||||
+retry:
|
||||
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
||||
|
||||
- for (i = 0; i < num; i++) {
|
||||
+ for (; i < num; i += inc) {
|
||||
+ inc = 1;
|
||||
if (gmbus_is_index_read(msgs, i, num)) {
|
||||
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
||||
- i += 1; /* set i to the index of the read xfer */
|
||||
+ inc = 2; /* an index read is two msgs */
|
||||
} else if (msgs[i].flags & I2C_M_RD) {
|
||||
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
||||
} else {
|
||||
@@ -530,6 +532,18 @@ clear_err:
|
||||
adapter->name, msgs[i].addr,
|
||||
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
||||
|
||||
+ /*
|
||||
+ * Passive adapters sometimes NAK the first probe. Retry the first
|
||||
+ * message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
||||
+ * has retries internally. See also the retry loop in
|
||||
+ * drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
||||
+ */
|
||||
+ if (ret == -ENXIO && i == 0 && try++ == 0) {
|
||||
+ DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
||||
+ adapter->name);
|
||||
+ goto retry;
|
||||
+ }
|
||||
+
|
||||
goto out;
|
||||
|
||||
timeout:
|
||||
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h
|
||||
index 0916bf6b6c31..1e8fd2e81d45 100644
|
||||
--- a/drivers/iio/imu/adis16400.h
|
||||
+++ b/drivers/iio/imu/adis16400.h
|
||||
@@ -165,6 +165,7 @@ struct adis16400_state {
|
||||
int filt_int;
|
||||
|
||||
struct adis adis;
|
||||
+ unsigned long avail_scan_mask[2];
|
||||
};
|
||||
|
||||
/* At the moment triggers are only used for ring buffer
|
||||
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c
|
||||
index 7d60c85cc16d..9721c58ed847 100644
|
||||
--- a/drivers/iio/imu/adis16400_core.c
|
||||
+++ b/drivers/iio/imu/adis16400_core.c
|
||||
@@ -438,6 +438,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||||
*val = st->variant->temp_scale_nano / 1000000;
|
||||
*val2 = (st->variant->temp_scale_nano % 1000000);
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
+ case IIO_PRESSURE:
|
||||
+ /* 20 uBar = 0.002kPascal */
|
||||
+ *val = 0;
|
||||
+ *val2 = 2000;
|
||||
+ return IIO_VAL_INT_PLUS_MICRO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -480,10 +485,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||||
}
|
||||
}
|
||||
|
||||
-#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
|
||||
+#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
|
||||
.type = IIO_VOLTAGE, \
|
||||
.indexed = 1, \
|
||||
- .channel = 0, \
|
||||
+ .channel = chn, \
|
||||
.extend_name = name, \
|
||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||||
BIT(IIO_CHAN_INFO_SCALE), \
|
||||
@@ -499,10 +504,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
||||
}
|
||||
|
||||
#define ADIS16400_SUPPLY_CHAN(addr, bits) \
|
||||
- ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)
|
||||
+ ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
|
||||
|
||||
#define ADIS16400_AUX_ADC_CHAN(addr, bits) \
|
||||
- ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)
|
||||
+ ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
|
||||
|
||||
#define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
|
||||
.type = IIO_ANGL_VEL, \
|
||||
@@ -819,11 +824,6 @@ static const struct iio_info adis16400_info = {
|
||||
.debugfs_reg_access = adis_debugfs_reg_access,
|
||||
};
|
||||
|
||||
-static const unsigned long adis16400_burst_scan_mask[] = {
|
||||
- ~0UL,
|
||||
- 0,
|
||||
-};
|
||||
-
|
||||
static const char * const adis16400_status_error_msgs[] = {
|
||||
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
|
||||
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
|
||||
@@ -871,6 +871,20 @@ static const struct adis_data adis16400_data = {
|
||||
BIT(ADIS16400_DIAG_STAT_POWER_LOW),
|
||||
};
|
||||
|
||||
+static void adis16400_setup_chan_mask(struct adis16400_state *st)
|
||||
+{
|
||||
+ const struct adis16400_chip_info *chip_info = st->variant;
|
||||
+ unsigned i;
|
||||
+
|
||||
+ for (i = 0; i < chip_info->num_channels; i++) {
|
||||
+ const struct iio_chan_spec *ch = &chip_info->channels[i];
|
||||
+
|
||||
+ if (ch->scan_index >= 0 &&
|
||||
+ ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
|
||||
+ st->avail_scan_mask[0] |= BIT(ch->scan_index);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int adis16400_probe(struct spi_device *spi)
|
||||
{
|
||||
struct adis16400_state *st;
|
||||
@@ -894,8 +908,10 @@ static int adis16400_probe(struct spi_device *spi)
|
||||
indio_dev->info = &adis16400_info;
|
||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
|
||||
- if (!(st->variant->flags & ADIS16400_NO_BURST))
|
||||
- indio_dev->available_scan_masks = adis16400_burst_scan_mask;
|
||||
+ if (!(st->variant->flags & ADIS16400_NO_BURST)) {
|
||||
+ adis16400_setup_chan_mask(st);
|
||||
+ indio_dev->available_scan_masks = st->avail_scan_mask;
|
||||
+ }
|
||||
|
||||
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
|
||||
if (ret)
|
||||
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
|
||||
index dbd4f5ad3343..02099afb6c79 100644
|
||||
--- a/drivers/input/mouse/elantech.c
|
||||
+++ b/drivers/input/mouse/elantech.c
|
||||
@@ -1241,10 +1241,11 @@ static bool elantech_is_signature_valid(const unsigned char *param)
|
||||
return true;
|
||||
|
||||
/*
|
||||
- * Some models have a revision higher then 20. Meaning param[2] may
|
||||
- * be 10 or 20, skip the rates check for these.
|
||||
+ * Some hw_version >= 4 models have a revision higher then 20. Meaning
|
||||
+ * that param[2] may be 10 or 20, skip the rates check for these.
|
||||
*/
|
||||
- if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
|
||||
+ if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f &&
|
||||
+ param[2] < 40)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rates); i++)
|
||||
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
|
||||
index 7490b6c866e6..d2907a6e3dab 100644
|
||||
--- a/drivers/net/phy/dp83640.c
|
||||
+++ b/drivers/net/phy/dp83640.c
|
||||
@@ -45,7 +45,7 @@
|
||||
#define PSF_TX 0x1000
|
||||
#define EXT_EVENT 1
|
||||
#define CAL_EVENT 7
|
||||
-#define CAL_TRIGGER 7
|
||||
+#define CAL_TRIGGER 1
|
||||
#define PER_TRIGGER 6
|
||||
|
||||
#define MII_DP83640_MICR 0x11
|
||||
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
|
||||
index 427e48a80efa..299d35552a3e 100644
|
||||
--- a/drivers/net/phy/phy.c
|
||||
+++ b/drivers/net/phy/phy.c
|
||||
@@ -1022,12 +1022,14 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
||||
|
||||
/* According to 802.3az,the EEE is supported only in full duplex-mode.
|
||||
* Also EEE feature is active when core is operating with MII, GMII
|
||||
- * or RGMII.
|
||||
+ * or RGMII (all kinds). Internal PHYs are also allowed to proceed and
|
||||
+ * should return an error if they do not support EEE.
|
||||
*/
|
||||
if ((phydev->duplex == DUPLEX_FULL) &&
|
||||
((phydev->interface == PHY_INTERFACE_MODE_MII) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_GMII) ||
|
||||
- (phydev->interface == PHY_INTERFACE_MODE_RGMII))) {
|
||||
+ (phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
|
||||
+ phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID))) {
|
||||
int eee_lp, eee_cap, eee_adv;
|
||||
u32 lp, cap, adv;
|
||||
int status;
|
||||
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
|
||||
index 8a9e8750703f..e0cf18c6cf11 100644
|
||||
--- a/drivers/net/xen-netback/xenbus.c
|
||||
+++ b/drivers/net/xen-netback/xenbus.c
|
||||
@@ -33,6 +33,8 @@ struct backend_info {
|
||||
enum xenbus_state frontend_state;
|
||||
struct xenbus_watch hotplug_status_watch;
|
||||
u8 have_hotplug_status_watch:1;
|
||||
+
|
||||
+ const char *hotplug_script;
|
||||
};
|
||||
|
||||
static int connect_rings(struct backend_info *);
|
||||
@@ -55,6 +57,7 @@ static int netback_remove(struct xenbus_device *dev)
|
||||
xenvif_free(be->vif);
|
||||
be->vif = NULL;
|
||||
}
|
||||
+ kfree(be->hotplug_script);
|
||||
kfree(be);
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
return 0;
|
||||
@@ -72,6 +75,7 @@ static int netback_probe(struct xenbus_device *dev,
|
||||
struct xenbus_transaction xbt;
|
||||
int err;
|
||||
int sg;
|
||||
+ const char *script;
|
||||
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
||||
GFP_KERNEL);
|
||||
if (!be) {
|
||||
@@ -132,6 +136,15 @@ static int netback_probe(struct xenbus_device *dev,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
||||
+ if (IS_ERR(script)) {
|
||||
+ err = PTR_ERR(script);
|
||||
+ xenbus_dev_fatal(dev, err, "reading script");
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ be->hotplug_script = script;
|
||||
+
|
||||
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
||||
if (err)
|
||||
goto fail;
|
||||
@@ -162,22 +175,14 @@ static int netback_uevent(struct xenbus_device *xdev,
|
||||
struct kobj_uevent_env *env)
|
||||
{
|
||||
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
||||
- char *val;
|
||||
|
||||
- val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
|
||||
- if (IS_ERR(val)) {
|
||||
- int err = PTR_ERR(val);
|
||||
- xenbus_dev_fatal(xdev, err, "reading script");
|
||||
- return err;
|
||||
- } else {
|
||||
- if (add_uevent_var(env, "script=%s", val)) {
|
||||
- kfree(val);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
- kfree(val);
|
||||
- }
|
||||
+ if (!be)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (add_uevent_var(env, "script=%s", be->hotplug_script))
|
||||
+ return -ENOMEM;
|
||||
|
||||
- if (!be || !be->vif)
|
||||
+ if (!be->vif)
|
||||
return 0;
|
||||
|
||||
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|
||||
diff --git a/drivers/staging/ozwpan/ozusbsvc1.c b/drivers/staging/ozwpan/ozusbsvc1.c
|
||||
index 4e4b650fee3f..d4f55b08ef78 100644
|
||||
--- a/drivers/staging/ozwpan/ozusbsvc1.c
|
||||
+++ b/drivers/staging/ozwpan/ozusbsvc1.c
|
||||
@@ -314,7 +314,11 @@ static void oz_usb_handle_ep_data(struct oz_usb_ctx *usb_ctx,
|
||||
struct oz_multiple_fixed *body =
|
||||
(struct oz_multiple_fixed *)data_hdr;
|
||||
u8 *data = body->data;
|
||||
- int n = (len - sizeof(struct oz_multiple_fixed)+1)
|
||||
+ unsigned int n;
|
||||
+ if (!body->unit_size ||
|
||||
+ len < sizeof(struct oz_multiple_fixed) - 1)
|
||||
+ break;
|
||||
+ n = (len - (sizeof(struct oz_multiple_fixed) - 1))
|
||||
/ body->unit_size;
|
||||
while (n--) {
|
||||
oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
|
||||
@@ -376,10 +380,15 @@ void oz_usb_rx(struct oz_pd *pd, struct oz_elt *elt)
|
||||
case OZ_GET_DESC_RSP: {
|
||||
struct oz_get_desc_rsp *body =
|
||||
(struct oz_get_desc_rsp *)usb_hdr;
|
||||
- int data_len = elt->length -
|
||||
- sizeof(struct oz_get_desc_rsp) + 1;
|
||||
- u16 offs = le16_to_cpu(get_unaligned(&body->offset));
|
||||
- u16 total_size =
|
||||
+ u16 offs, total_size;
|
||||
+ u8 data_len;
|
||||
+
|
||||
+ if (elt->length < sizeof(struct oz_get_desc_rsp) - 1)
|
||||
+ break;
|
||||
+ data_len = elt->length -
|
||||
+ (sizeof(struct oz_get_desc_rsp) - 1);
|
||||
+ offs = le16_to_cpu(get_unaligned(&body->offset));
|
||||
+ total_size =
|
||||
le16_to_cpu(get_unaligned(&body->total_size));
|
||||
oz_trace("USB_REQ_GET_DESCRIPTOR - cnf\n");
|
||||
oz_hcd_get_desc_cnf(usb_ctx->hport, body->req_id,
|
||||
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
||||
index 691a82105180..ab1c5e8ac27f 100644
|
||||
--- a/drivers/usb/serial/cp210x.c
|
||||
+++ b/drivers/usb/serial/cp210x.c
|
||||
@@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
||||
{ USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
|
||||
{ USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
|
||||
+ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
|
||||
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
||||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
||||
index 4d918d5f945a..b55e5f3a311d 100644
|
||||
--- a/drivers/usb/serial/ftdi_sio.c
|
||||
+++ b/drivers/usb/serial/ftdi_sio.c
|
||||
@@ -715,6 +715,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
||||
+ { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
||||
index e906b6aa2424..99316d7cfc03 100644
|
||||
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
||||
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
||||
@@ -155,6 +155,7 @@
|
||||
#define XSENS_AWINDA_STATION_PID 0x0101
|
||||
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
||||
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
||||
+#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
||||
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
||||
|
||||
/* Xsens devices using FTDI VID */
|
||||
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
|
||||
index 84ceff6abbc1..be7e31a933e5 100644
|
||||
--- a/fs/btrfs/extent_io.c
|
||||
+++ b/fs/btrfs/extent_io.c
|
||||
@@ -4080,8 +4080,11 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
}
|
||||
ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
|
||||
em_len, flags);
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ if (ret == 1)
|
||||
+ ret = 0;
|
||||
goto out_free;
|
||||
+ }
|
||||
}
|
||||
out_free:
|
||||
free_extent_map(em);
|
||||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
|
||||
index f0857e092a3c..68891ff7e5d4 100644
|
||||
--- a/fs/btrfs/super.c
|
||||
+++ b/fs/btrfs/super.c
|
||||
@@ -779,6 +779,15 @@ find_root:
|
||||
if (btrfs_root_refs(&new_root->root_item) == 0)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
+ if (!(sb->s_flags & MS_RDONLY)) {
|
||||
+ int ret;
|
||||
+ down_read(&fs_info->cleanup_work_sem);
|
||||
+ ret = btrfs_orphan_cleanup(new_root);
|
||||
+ up_read(&fs_info->cleanup_work_sem);
|
||||
+ if (ret)
|
||||
+ return ERR_PTR(ret);
|
||||
+ }
|
||||
+
|
||||
dir_id = btrfs_root_dirid(&new_root->root_item);
|
||||
setup_root:
|
||||
location.objectid = dir_id;
|
||||
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c
|
||||
index a5457d577b98..6ad2e2d320fe 100644
|
||||
--- a/kernel/trace/ring_buffer_benchmark.c
|
||||
+++ b/kernel/trace/ring_buffer_benchmark.c
|
||||
@@ -455,7 +455,7 @@ static int __init ring_buffer_benchmark_init(void)
|
||||
|
||||
if (producer_fifo >= 0) {
|
||||
struct sched_param param = {
|
||||
- .sched_priority = consumer_fifo
|
||||
+ .sched_priority = producer_fifo
|
||||
};
|
||||
sched_setscheduler(producer, SCHED_FIFO, ¶m);
|
||||
} else
|
||||
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
|
||||
index 2298237db142..d85d3a0e06ce 100644
|
||||
--- a/mm/memory_hotplug.c
|
||||
+++ b/mm/memory_hotplug.c
|
||||
@@ -1803,8 +1803,10 @@ void try_offline_node(int nid)
|
||||
* wait_table may be allocated from boot memory,
|
||||
* here only free if it's allocated by vmalloc.
|
||||
*/
|
||||
- if (is_vmalloc_addr(zone->wait_table))
|
||||
+ if (is_vmalloc_addr(zone->wait_table)) {
|
||||
vfree(zone->wait_table);
|
||||
+ zone->wait_table = NULL;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(try_offline_node);
|
||||
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||
index 81de0106528b..49b4a82d3f86 100644
|
||||
--- a/net/bridge/br_multicast.c
|
||||
+++ b/net/bridge/br_multicast.c
|
||||
@@ -1007,7 +1007,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
|
||||
|
||||
err = br_ip6_multicast_add_group(br, port, &grec->grec_mca,
|
||||
vid);
|
||||
- if (!err)
|
||||
+ if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
|
||||
index 526bf56f4d31..afeb8e07ee41 100644
|
||||
--- a/net/caif/caif_socket.c
|
||||
+++ b/net/caif/caif_socket.c
|
||||
@@ -332,6 +332,10 @@ static long caif_stream_data_wait(struct sock *sk, long timeo)
|
||||
release_sock(sk);
|
||||
timeo = schedule_timeout(timeo);
|
||||
lock_sock(sk);
|
||||
+
|
||||
+ if (sock_flag(sk, SOCK_DEAD))
|
||||
+ break;
|
||||
+
|
||||
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
||||
}
|
||||
|
||||
@@ -376,6 +380,10 @@ static int caif_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct sk_buff *skb;
|
||||
|
||||
lock_sock(sk);
|
||||
+ if (sock_flag(sk, SOCK_DEAD)) {
|
||||
+ err = -ECONNRESET;
|
||||
+ goto unlock;
|
||||
+ }
|
||||
skb = skb_dequeue(&sk->sk_receive_queue);
|
||||
caif_check_flow_release(sk);
|
||||
|
||||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
||||
index e23c5f64286b..222e1b6141d3 100644
|
||||
--- a/net/ipv4/route.c
|
||||
+++ b/net/ipv4/route.c
|
||||
@@ -871,6 +871,10 @@ static int ip_error(struct sk_buff *skb)
|
||||
bool send;
|
||||
int code;
|
||||
|
||||
+ /* IP on this device is disabled. */
|
||||
+ if (!in_dev)
|
||||
+ goto out;
|
||||
+
|
||||
net = dev_net(rt->dst.dev);
|
||||
if (!IN_DEV_FORWARD(in_dev)) {
|
||||
switch (rt->dst.error) {
|
||||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
||||
index c3075b552248..63b536bbf0b0 100644
|
||||
--- a/net/ipv4/udp.c
|
||||
+++ b/net/ipv4/udp.c
|
||||
@@ -1293,10 +1293,8 @@ csum_copy_err:
|
||||
}
|
||||
unlock_sock_fast(sk, slow);
|
||||
|
||||
- if (noblock)
|
||||
- return -EAGAIN;
|
||||
-
|
||||
- /* starting over for a new packet */
|
||||
+ /* starting over for a new packet, but check if we need to yield */
|
||||
+ cond_resched();
|
||||
msg->msg_flags &= ~MSG_TRUNC;
|
||||
goto try_again;
|
||||
}
|
||||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
||||
index 6b298dc614e3..7e3901893413 100644
|
||||
--- a/net/ipv6/udp.c
|
||||
+++ b/net/ipv6/udp.c
|
||||
@@ -494,10 +494,8 @@ csum_copy_err:
|
||||
}
|
||||
unlock_sock_fast(sk, slow);
|
||||
|
||||
- if (noblock)
|
||||
- return -EAGAIN;
|
||||
-
|
||||
- /* starting over for a new packet */
|
||||
+ /* starting over for a new packet, but check if we need to yield */
|
||||
+ cond_resched();
|
||||
msg->msg_flags &= ~MSG_TRUNC;
|
||||
goto try_again;
|
||||
}
|
||||
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
|
||||
index 2d2f07945c85..e87b27c7bffd 100644
|
||||
--- a/net/sched/sch_api.c
|
||||
+++ b/net/sched/sch_api.c
|
||||
@@ -752,10 +752,8 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
||||
if (dev->flags & IFF_UP)
|
||||
dev_deactivate(dev);
|
||||
|
||||
- if (new && new->ops->attach) {
|
||||
- new->ops->attach(new);
|
||||
- num_q = 0;
|
||||
- }
|
||||
+ if (new && new->ops->attach)
|
||||
+ goto skip;
|
||||
|
||||
for (i = 0; i < num_q; i++) {
|
||||
struct netdev_queue *dev_queue = dev_ingress_queue(dev);
|
||||
@@ -771,12 +769,16 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
|
||||
qdisc_destroy(old);
|
||||
}
|
||||
|
||||
+skip:
|
||||
if (!ingress) {
|
||||
notify_and_destroy(net, skb, n, classid,
|
||||
dev->qdisc, new);
|
||||
if (new && !new->ops->attach)
|
||||
atomic_inc(&new->refcnt);
|
||||
dev->qdisc = new ? : &noop_qdisc;
|
||||
+
|
||||
+ if (new && new->ops->attach)
|
||||
+ new->ops->attach(new);
|
||||
} else {
|
||||
notify_and_destroy(net, skb, n, classid, old, new);
|
||||
}
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 75e198d029d2..123c16419cbe 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -1898,6 +1898,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
|
||||
unix_state_unlock(sk);
|
||||
timeo = schedule_timeout(timeo);
|
||||
unix_state_lock(sk);
|
||||
+
|
||||
+ if (sock_flag(sk, SOCK_DEAD))
|
||||
+ break;
|
||||
+
|
||||
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
|
||||
}
|
||||
|
||||
@@ -1957,6 +1961,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct sk_buff *skb, *last;
|
||||
|
||||
unix_state_lock(sk);
|
||||
+ if (sock_flag(sk, SOCK_DEAD)) {
|
||||
+ err = -ECONNRESET;
|
||||
+ goto unlock;
|
||||
+ }
|
||||
last = skb = skb_peek(&sk->sk_receive_queue);
|
||||
again:
|
||||
if (skb == NULL) {
|
||||
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
|
||||
index d997d0f0c54a..18a7a7b112ef 100644
|
||||
--- a/net/wireless/wext-compat.c
|
||||
+++ b/net/wireless/wext-compat.c
|
||||
@@ -1345,6 +1345,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
||||
memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
|
||||
wdev_unlock(wdev);
|
||||
|
||||
+ memset(&sinfo, 0, sizeof(sinfo));
|
||||
+
|
||||
if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
||||
return NULL;
|
||||
|
||||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
||||
index 444019696f85..ca2094c914a1 100644
|
||||
--- a/sound/pci/hda/patch_realtek.c
|
||||
+++ b/sound/pci/hda/patch_realtek.c
|
||||
@@ -2148,6 +2148,7 @@ static const struct hda_fixup alc882_fixups[] = {
|
||||
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
|
||||
SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||||
+ SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||||
SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
|
||||
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
|
||||
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
|
||||
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
||||
index 061be0e5fa5a..5ea5a18f3f58 100644
|
||||
--- a/sound/usb/mixer.c
|
||||
+++ b/sound/usb/mixer.c
|
||||
@@ -891,6 +891,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
||||
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
||||
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
||||
case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
|
||||
+ case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */
|
||||
case USB_ID(0x046d, 0x0991):
|
||||
/* Most audio usb devices lie about volume resolution.
|
||||
* Most Logitech webcams have res = 384.
|
||||
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
||||
index 4df31b0f94a3..d06fbd9f7cbe 100644
|
||||
--- a/sound/usb/mixer_maps.c
|
||||
+++ b/sound/usb/mixer_maps.c
|
||||
@@ -418,6 +418,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||
.map = ebox44_map,
|
||||
},
|
||||
{
|
||||
+ /* MAYA44 USB+ */
|
||||
+ .id = USB_ID(0x2573, 0x0008),
|
||||
+ .map = maya44_map,
|
||||
+ },
|
||||
+ {
|
||||
/* KEF X300A */
|
||||
.id = USB_ID(0x27ac, 0x1000),
|
||||
.map = scms_usb3318_map,
|
263
patch/kernel/pine64-default/01-patch-3.10.81-82.patch
Normal file
263
patch/kernel/pine64-default/01-patch-3.10.81-82.patch
Normal file
|
@ -0,0 +1,263 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 6d19e37d36d5..5e3e665a10b7 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 81
|
||||
+SUBLEVEL = 82
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c
|
||||
index d1939a9539c0..04aefffb4dd9 100644
|
||||
--- a/drivers/crypto/caam/caamrng.c
|
||||
+++ b/drivers/crypto/caam/caamrng.c
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
/* Buffer, its dma address and lock */
|
||||
struct buf_data {
|
||||
- u8 buf[RN_BUF_SIZE];
|
||||
+ u8 buf[RN_BUF_SIZE] ____cacheline_aligned;
|
||||
dma_addr_t addr;
|
||||
struct completion filled;
|
||||
u32 hw_desc[DESC_JOB_O_LEN];
|
||||
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
|
||||
index f6341e8622ee..7bd2acce9f81 100644
|
||||
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
|
||||
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
|
||||
@@ -1487,6 +1487,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector,
|
||||
return MODE_BANDWIDTH;
|
||||
}
|
||||
|
||||
+ if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 ||
|
||||
+ (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) {
|
||||
+ return MODE_H_ILLEGAL;
|
||||
+ }
|
||||
+
|
||||
if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 ||
|
||||
mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 ||
|
||||
mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
|
||||
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
|
||||
index 572579f87de4..90861416b9e9 100644
|
||||
--- a/drivers/scsi/lpfc/lpfc_sli.c
|
||||
+++ b/drivers/scsi/lpfc/lpfc_sli.c
|
||||
@@ -263,6 +263,16 @@ lpfc_sli4_eq_get(struct lpfc_queue *q)
|
||||
return NULL;
|
||||
|
||||
q->hba_index = idx;
|
||||
+
|
||||
+ /*
|
||||
+ * insert barrier for instruction interlock : data from the hardware
|
||||
+ * must have the valid bit checked before it can be copied and acted
|
||||
+ * upon. Given what was seen in lpfc_sli4_cq_get() of speculative
|
||||
+ * instructions allowing action on content before valid bit checked,
|
||||
+ * add barrier here as well. May not be needed as "content" is a
|
||||
+ * single 32-bit entity here (vs multi word structure for cq's).
|
||||
+ */
|
||||
+ mb();
|
||||
return eqe;
|
||||
}
|
||||
|
||||
@@ -368,6 +378,17 @@ lpfc_sli4_cq_get(struct lpfc_queue *q)
|
||||
|
||||
cqe = q->qe[q->hba_index].cqe;
|
||||
q->hba_index = idx;
|
||||
+
|
||||
+ /*
|
||||
+ * insert barrier for instruction interlock : data from the hardware
|
||||
+ * must have the valid bit checked before it can be copied and acted
|
||||
+ * upon. Speculative instructions were allowing a bcopy at the start
|
||||
+ * of lpfc_sli4_fp_handle_wcqe(), which is called immediately
|
||||
+ * after our return, to copy data before the valid bit check above
|
||||
+ * was done. As such, some of the copied data was stale. The barrier
|
||||
+ * ensures the check is before any data is copied.
|
||||
+ */
|
||||
+ mb();
|
||||
return cqe;
|
||||
}
|
||||
|
||||
diff --git a/fs/pipe.c b/fs/pipe.c
|
||||
index 0e0752ef2715..3e7ab278bb0c 100644
|
||||
--- a/fs/pipe.c
|
||||
+++ b/fs/pipe.c
|
||||
@@ -117,25 +117,27 @@ void pipe_wait(struct pipe_inode_info *pipe)
|
||||
}
|
||||
|
||||
static int
|
||||
-pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len,
|
||||
- int atomic)
|
||||
+pipe_iov_copy_from_user(void *addr, int *offset, struct iovec *iov,
|
||||
+ size_t *remaining, int atomic)
|
||||
{
|
||||
unsigned long copy;
|
||||
|
||||
- while (len > 0) {
|
||||
+ while (*remaining > 0) {
|
||||
while (!iov->iov_len)
|
||||
iov++;
|
||||
- copy = min_t(unsigned long, len, iov->iov_len);
|
||||
+ copy = min_t(unsigned long, *remaining, iov->iov_len);
|
||||
|
||||
if (atomic) {
|
||||
- if (__copy_from_user_inatomic(to, iov->iov_base, copy))
|
||||
+ if (__copy_from_user_inatomic(addr + *offset,
|
||||
+ iov->iov_base, copy))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
- if (copy_from_user(to, iov->iov_base, copy))
|
||||
+ if (copy_from_user(addr + *offset,
|
||||
+ iov->iov_base, copy))
|
||||
return -EFAULT;
|
||||
}
|
||||
- to += copy;
|
||||
- len -= copy;
|
||||
+ *offset += copy;
|
||||
+ *remaining -= copy;
|
||||
iov->iov_base += copy;
|
||||
iov->iov_len -= copy;
|
||||
}
|
||||
@@ -143,25 +145,27 @@ pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len,
|
||||
}
|
||||
|
||||
static int
|
||||
-pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len,
|
||||
- int atomic)
|
||||
+pipe_iov_copy_to_user(struct iovec *iov, void *addr, int *offset,
|
||||
+ size_t *remaining, int atomic)
|
||||
{
|
||||
unsigned long copy;
|
||||
|
||||
- while (len > 0) {
|
||||
+ while (*remaining > 0) {
|
||||
while (!iov->iov_len)
|
||||
iov++;
|
||||
- copy = min_t(unsigned long, len, iov->iov_len);
|
||||
+ copy = min_t(unsigned long, *remaining, iov->iov_len);
|
||||
|
||||
if (atomic) {
|
||||
- if (__copy_to_user_inatomic(iov->iov_base, from, copy))
|
||||
+ if (__copy_to_user_inatomic(iov->iov_base,
|
||||
+ addr + *offset, copy))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
- if (copy_to_user(iov->iov_base, from, copy))
|
||||
+ if (copy_to_user(iov->iov_base,
|
||||
+ addr + *offset, copy))
|
||||
return -EFAULT;
|
||||
}
|
||||
- from += copy;
|
||||
- len -= copy;
|
||||
+ *offset += copy;
|
||||
+ *remaining -= copy;
|
||||
iov->iov_base += copy;
|
||||
iov->iov_len -= copy;
|
||||
}
|
||||
@@ -395,7 +399,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
|
||||
struct pipe_buffer *buf = pipe->bufs + curbuf;
|
||||
const struct pipe_buf_operations *ops = buf->ops;
|
||||
void *addr;
|
||||
- size_t chars = buf->len;
|
||||
+ size_t chars = buf->len, remaining;
|
||||
int error, atomic;
|
||||
|
||||
if (chars > total_len)
|
||||
@@ -409,9 +413,11 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
|
||||
}
|
||||
|
||||
atomic = !iov_fault_in_pages_write(iov, chars);
|
||||
+ remaining = chars;
|
||||
redo:
|
||||
addr = ops->map(pipe, buf, atomic);
|
||||
- error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic);
|
||||
+ error = pipe_iov_copy_to_user(iov, addr, &buf->offset,
|
||||
+ &remaining, atomic);
|
||||
ops->unmap(pipe, buf, addr);
|
||||
if (unlikely(error)) {
|
||||
/*
|
||||
@@ -426,7 +432,6 @@ redo:
|
||||
break;
|
||||
}
|
||||
ret += chars;
|
||||
- buf->offset += chars;
|
||||
buf->len -= chars;
|
||||
|
||||
/* Was it a packet buffer? Clean up and exit */
|
||||
@@ -531,6 +536,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
|
||||
if (ops->can_merge && offset + chars <= PAGE_SIZE) {
|
||||
int error, atomic = 1;
|
||||
void *addr;
|
||||
+ size_t remaining = chars;
|
||||
|
||||
error = ops->confirm(pipe, buf);
|
||||
if (error)
|
||||
@@ -539,8 +545,8 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
|
||||
iov_fault_in_pages_read(iov, chars);
|
||||
redo1:
|
||||
addr = ops->map(pipe, buf, atomic);
|
||||
- error = pipe_iov_copy_from_user(offset + addr, iov,
|
||||
- chars, atomic);
|
||||
+ error = pipe_iov_copy_from_user(addr, &offset, iov,
|
||||
+ &remaining, atomic);
|
||||
ops->unmap(pipe, buf, addr);
|
||||
ret = error;
|
||||
do_wakeup = 1;
|
||||
@@ -575,6 +581,8 @@ redo1:
|
||||
struct page *page = pipe->tmp_page;
|
||||
char *src;
|
||||
int error, atomic = 1;
|
||||
+ int offset = 0;
|
||||
+ size_t remaining;
|
||||
|
||||
if (!page) {
|
||||
page = alloc_page(GFP_HIGHUSER);
|
||||
@@ -595,14 +603,15 @@ redo1:
|
||||
chars = total_len;
|
||||
|
||||
iov_fault_in_pages_read(iov, chars);
|
||||
+ remaining = chars;
|
||||
redo2:
|
||||
if (atomic)
|
||||
src = kmap_atomic(page);
|
||||
else
|
||||
src = kmap(page);
|
||||
|
||||
- error = pipe_iov_copy_from_user(src, iov, chars,
|
||||
- atomic);
|
||||
+ error = pipe_iov_copy_from_user(src, &offset, iov,
|
||||
+ &remaining, atomic);
|
||||
if (atomic)
|
||||
kunmap_atomic(src);
|
||||
else
|
||||
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
|
||||
index 0a1edc694d67..fe3e086d38e9 100644
|
||||
--- a/kernel/trace/trace_events_filter.c
|
||||
+++ b/kernel/trace/trace_events_filter.c
|
||||
@@ -1328,19 +1328,24 @@ static int check_preds(struct filter_parse_state *ps)
|
||||
{
|
||||
int n_normal_preds = 0, n_logical_preds = 0;
|
||||
struct postfix_elt *elt;
|
||||
+ int cnt = 0;
|
||||
|
||||
list_for_each_entry(elt, &ps->postfix, list) {
|
||||
- if (elt->op == OP_NONE)
|
||||
+ if (elt->op == OP_NONE) {
|
||||
+ cnt++;
|
||||
continue;
|
||||
+ }
|
||||
|
||||
+ cnt--;
|
||||
if (elt->op == OP_AND || elt->op == OP_OR) {
|
||||
n_logical_preds++;
|
||||
continue;
|
||||
}
|
||||
n_normal_preds++;
|
||||
+ WARN_ON_ONCE(cnt < 0);
|
||||
}
|
||||
|
||||
- if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
|
||||
+ if (cnt != 1 || !n_normal_preds || n_logical_preds >= n_normal_preds) {
|
||||
parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
|
||||
return -EINVAL;
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
diff --git a/drivers/net/wireless/rtl8723bs/include/ieee80211.h b/drivers/net/wireless/rtl8723bs/include/ieee80211.h
|
||||
index 6fd33af..56e0f5a 100755
|
||||
--- a/drivers/net/wireless/rtl8723bs/include/ieee80211.h
|
||||
+++ b/drivers/net/wireless/rtl8723bs/include/ieee80211.h
|
||||
@@ -1318,18 +1318,18 @@ enum ieee80211_state {
|
||||
(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \
|
||||
(((Addr[5]) & 0xff) == 0xff))
|
||||
#else
|
||||
-__inline int is_multicast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_multicast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] != 0xff) && (0x01 & addr[0]));
|
||||
}
|
||||
|
||||
-__inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
|
||||
(addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
|
||||
}
|
||||
|
||||
-__inline int is_zero_mac_addr(const u8 *addr)
|
||||
+static __inline int is_zero_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \
|
||||
(addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));
|
||||
diff --git a/drivers/net/wireless/rtl8189fs/include/ieee80211.h b/drivers/net/wireless/rtl8189fs/include/ieee80211.h
|
||||
index f941815..211a97b 100644
|
||||
--- a/drivers/net/wireless/rtl8189fs/include/ieee80211.h
|
||||
+++ b/drivers/net/wireless/rtl8189fs/include/ieee80211.h
|
||||
@@ -1321,18 +1321,18 @@ enum ieee80211_state {
|
||||
(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \
|
||||
(((Addr[5]) & 0xff) == 0xff))
|
||||
#else
|
||||
-__inline int is_multicast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_multicast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] != 0xff) && (0x01 & addr[0]));
|
||||
}
|
||||
|
||||
-__inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
|
||||
(addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
|
||||
}
|
||||
|
||||
-__inline int is_zero_mac_addr(const u8 *addr)
|
||||
+static __inline int is_zero_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \
|
||||
(addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));
|
||||
diff --git a/drivers/net/wireless/rtl8723bs_vq0/include/ieee80211.h b/drivers/net/wireless/rtl8723bs_vq0/include/ieee80211.h
|
||||
index 6fd33af..56e0f5a 100644
|
||||
--- a/drivers/net/wireless/rtl8723bs_vq0/include/ieee80211.h
|
||||
+++ b/drivers/net/wireless/rtl8723bs_vq0/include/ieee80211.h
|
||||
@@ -1318,18 +1318,18 @@ enum ieee80211_state {
|
||||
(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \
|
||||
(((Addr[5]) & 0xff) == 0xff))
|
||||
#else
|
||||
-__inline int is_multicast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_multicast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] != 0xff) && (0x01 & addr[0]));
|
||||
}
|
||||
|
||||
-__inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
+static __inline int is_broadcast_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
|
||||
(addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
|
||||
}
|
||||
|
||||
-__inline int is_zero_mac_addr(const u8 *addr)
|
||||
+static __inline int is_zero_mac_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \
|
||||
(addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));
|
Loading…
Add table
Reference in a new issue