mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
444 lines
14 KiB
Diff
444 lines
14 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 0027fbe..bc4dd5b 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 60
|
|
+SUBLEVEL = 61
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
|
|
index feab3ba..b17dd69 100644
|
|
--- a/arch/powerpc/Kconfig
|
|
+++ b/arch/powerpc/Kconfig
|
|
@@ -979,6 +979,7 @@ config RELOCATABLE
|
|
must live at a different physical address than the primary
|
|
kernel.
|
|
|
|
+# This value must have zeroes in the bottom 60 bits otherwise lots will break
|
|
config PAGE_OFFSET
|
|
hex
|
|
default "0xc000000000000000"
|
|
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
|
|
index f072e97..2e6c4e5a 100644
|
|
--- a/arch/powerpc/include/asm/page.h
|
|
+++ b/arch/powerpc/include/asm/page.h
|
|
@@ -211,9 +211,19 @@ extern long long virt_phys_offset;
|
|
#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
|
|
#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)
|
|
#else
|
|
+#ifdef CONFIG_PPC64
|
|
+/*
|
|
+ * gcc miscompiles (unsigned long)(&static_var) - PAGE_OFFSET
|
|
+ * with -mcmodel=medium, so we use & and | instead of - and + on 64-bit.
|
|
+ */
|
|
+#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET))
|
|
+#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL)
|
|
+
|
|
+#else /* 32-bit, non book E */
|
|
#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
|
|
#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
|
|
#endif
|
|
+#endif
|
|
|
|
/*
|
|
* Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
|
|
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
|
|
index 3251d4b..d1a9674 100644
|
|
--- a/drivers/acpi/ec.c
|
|
+++ b/drivers/acpi/ec.c
|
|
@@ -978,6 +978,10 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
|
|
ec_skip_dsdt_scan, "HP Folio 13", {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13"),}, NULL},
|
|
+ {
|
|
+ ec_validate_ecdt, "ASUS hardware", {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL},
|
|
{},
|
|
};
|
|
|
|
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
|
|
index 7dda4f7..d63a06b 100644
|
|
--- a/drivers/base/memory.c
|
|
+++ b/drivers/base/memory.c
|
|
@@ -154,6 +154,8 @@ static ssize_t show_mem_removable(struct device *dev,
|
|
container_of(dev, struct memory_block, dev);
|
|
|
|
for (i = 0; i < sections_per_block; i++) {
|
|
+ if (!present_section_nr(mem->start_section_nr + i))
|
|
+ continue;
|
|
pfn = section_nr_to_pfn(mem->start_section_nr + i);
|
|
ret &= is_mem_section_removable(pfn, PAGES_PER_SECTION);
|
|
}
|
|
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
|
|
index bb80853..ca72d1f 100644
|
|
--- a/drivers/base/regmap/regmap.c
|
|
+++ b/drivers/base/regmap/regmap.c
|
|
@@ -69,7 +69,7 @@ bool regmap_precious(struct regmap *map, unsigned int reg)
|
|
}
|
|
|
|
static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
|
|
- unsigned int num)
|
|
+ size_t num)
|
|
{
|
|
unsigned int i;
|
|
|
|
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
|
index d031932..6884d01 100644
|
|
--- a/drivers/gpu/drm/i915/i915_reg.h
|
|
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
|
@@ -3741,7 +3741,7 @@
|
|
#define EDP_LINK_TRAIN_600MV_0DB_IVB (0x30 <<22)
|
|
#define EDP_LINK_TRAIN_600MV_3_5DB_IVB (0x36 <<22)
|
|
#define EDP_LINK_TRAIN_800MV_0DB_IVB (0x38 <<22)
|
|
-#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x33 <<22)
|
|
+#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x3e <<22)
|
|
|
|
/* legacy values */
|
|
#define EDP_LINK_TRAIN_500MV_0DB_IVB (0x00 <<22)
|
|
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
|
|
index 21ee782..e1978a2 100644
|
|
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
|
|
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
|
|
@@ -29,7 +29,9 @@
|
|
#include "drmP.h"
|
|
#include "ttm/ttm_bo_driver.h"
|
|
|
|
-#define VMW_PPN_SIZE sizeof(unsigned long)
|
|
+#define VMW_PPN_SIZE (sizeof(unsigned long))
|
|
+/* A future safe maximum remap size. */
|
|
+#define VMW_PPN_PER_REMAP ((31 * 1024) / VMW_PPN_SIZE)
|
|
|
|
static int vmw_gmr2_bind(struct vmw_private *dev_priv,
|
|
struct page *pages[],
|
|
@@ -38,43 +40,61 @@ static int vmw_gmr2_bind(struct vmw_private *dev_priv,
|
|
{
|
|
SVGAFifoCmdDefineGMR2 define_cmd;
|
|
SVGAFifoCmdRemapGMR2 remap_cmd;
|
|
- uint32_t define_size = sizeof(define_cmd) + 4;
|
|
- uint32_t remap_size = VMW_PPN_SIZE * num_pages + sizeof(remap_cmd) + 4;
|
|
uint32_t *cmd;
|
|
uint32_t *cmd_orig;
|
|
+ uint32_t define_size = sizeof(define_cmd) + sizeof(*cmd);
|
|
+ uint32_t remap_num = num_pages / VMW_PPN_PER_REMAP + ((num_pages % VMW_PPN_PER_REMAP) > 0);
|
|
+ uint32_t remap_size = VMW_PPN_SIZE * num_pages + (sizeof(remap_cmd) + sizeof(*cmd)) * remap_num;
|
|
+ uint32_t remap_pos = 0;
|
|
+ uint32_t cmd_size = define_size + remap_size;
|
|
uint32_t i;
|
|
|
|
- cmd_orig = cmd = vmw_fifo_reserve(dev_priv, define_size + remap_size);
|
|
+ cmd_orig = cmd = vmw_fifo_reserve(dev_priv, cmd_size);
|
|
if (unlikely(cmd == NULL))
|
|
return -ENOMEM;
|
|
|
|
define_cmd.gmrId = gmr_id;
|
|
define_cmd.numPages = num_pages;
|
|
|
|
+ *cmd++ = SVGA_CMD_DEFINE_GMR2;
|
|
+ memcpy(cmd, &define_cmd, sizeof(define_cmd));
|
|
+ cmd += sizeof(define_cmd) / sizeof(*cmd);
|
|
+
|
|
+ /*
|
|
+ * Need to split the command if there are too many
|
|
+ * pages that goes into the gmr.
|
|
+ */
|
|
+
|
|
remap_cmd.gmrId = gmr_id;
|
|
remap_cmd.flags = (VMW_PPN_SIZE > sizeof(*cmd)) ?
|
|
SVGA_REMAP_GMR2_PPN64 : SVGA_REMAP_GMR2_PPN32;
|
|
- remap_cmd.offsetPages = 0;
|
|
- remap_cmd.numPages = num_pages;
|
|
|
|
- *cmd++ = SVGA_CMD_DEFINE_GMR2;
|
|
- memcpy(cmd, &define_cmd, sizeof(define_cmd));
|
|
- cmd += sizeof(define_cmd) / sizeof(uint32);
|
|
+ while (num_pages > 0) {
|
|
+ unsigned long nr = min(num_pages, (unsigned long)VMW_PPN_PER_REMAP);
|
|
+
|
|
+ remap_cmd.offsetPages = remap_pos;
|
|
+ remap_cmd.numPages = nr;
|
|
|
|
- *cmd++ = SVGA_CMD_REMAP_GMR2;
|
|
- memcpy(cmd, &remap_cmd, sizeof(remap_cmd));
|
|
- cmd += sizeof(remap_cmd) / sizeof(uint32);
|
|
+ *cmd++ = SVGA_CMD_REMAP_GMR2;
|
|
+ memcpy(cmd, &remap_cmd, sizeof(remap_cmd));
|
|
+ cmd += sizeof(remap_cmd) / sizeof(*cmd);
|
|
|
|
- for (i = 0; i < num_pages; ++i) {
|
|
- if (VMW_PPN_SIZE <= 4)
|
|
- *cmd = page_to_pfn(*pages++);
|
|
- else
|
|
- *((uint64_t *)cmd) = page_to_pfn(*pages++);
|
|
+ for (i = 0; i < nr; ++i) {
|
|
+ if (VMW_PPN_SIZE <= 4)
|
|
+ *cmd = page_to_pfn(*pages++);
|
|
+ else
|
|
+ *((uint64_t *)cmd) = page_to_pfn(*pages++);
|
|
|
|
- cmd += VMW_PPN_SIZE / sizeof(*cmd);
|
|
+ cmd += VMW_PPN_SIZE / sizeof(*cmd);
|
|
+ }
|
|
+
|
|
+ num_pages -= nr;
|
|
+ remap_pos += nr;
|
|
}
|
|
|
|
- vmw_fifo_commit(dev_priv, define_size + remap_size);
|
|
+ BUG_ON(cmd != cmd_orig + cmd_size / sizeof(*cmd));
|
|
+
|
|
+ vmw_fifo_commit(dev_priv, cmd_size);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
index 3e40a64..b290a8e 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
|
|
@@ -448,6 +448,7 @@ static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
|
|
struct ieee80211_conf *cur_conf = &priv->hw->conf;
|
|
bool txok;
|
|
int slot;
|
|
+ int hdrlen, padsize;
|
|
|
|
slot = strip_drv_header(priv, skb);
|
|
if (slot < 0) {
|
|
@@ -504,6 +505,15 @@ send_mac80211:
|
|
|
|
ath9k_htc_tx_clear_slot(priv, slot);
|
|
|
|
+ /* Remove padding before handing frame back to mac80211 */
|
|
+ hdrlen = ieee80211_get_hdrlen_from_skb(skb);
|
|
+
|
|
+ padsize = hdrlen & 3;
|
|
+ if (padsize && skb->len > hdrlen + padsize) {
|
|
+ memmove(skb->data + padsize, skb->data, hdrlen);
|
|
+ skb_pull(skb, padsize);
|
|
+ }
|
|
+
|
|
/* Send status to mac80211 */
|
|
ieee80211_tx_status(priv->hw, skb);
|
|
}
|
|
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
|
|
index 409ed06..3223daa 100644
|
|
--- a/drivers/net/wireless/iwlegacy/4965-mac.c
|
|
+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
|
|
@@ -4415,9 +4415,9 @@ il4965_irq_tasklet(struct il_priv *il)
|
|
set_bit(S_RFKILL, &il->status);
|
|
} else {
|
|
clear_bit(S_RFKILL, &il->status);
|
|
- wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
|
|
il_force_reset(il, true);
|
|
}
|
|
+ wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
|
|
|
|
handled |= CSR_INT_BIT_RF_KILL;
|
|
}
|
|
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
|
|
index 52a5f62..2d88ce8 100644
|
|
--- a/drivers/target/target_core_cdb.c
|
|
+++ b/drivers/target/target_core_cdb.c
|
|
@@ -97,9 +97,12 @@ target_emulate_inquiry_std(struct se_cmd *cmd, char *buf)
|
|
|
|
buf[7] = 0x2; /* CmdQue=1 */
|
|
|
|
- snprintf(&buf[8], 8, "LIO-ORG");
|
|
- snprintf(&buf[16], 16, "%s", dev->se_sub_dev->t10_wwn.model);
|
|
- snprintf(&buf[32], 4, "%s", dev->se_sub_dev->t10_wwn.revision);
|
|
+ memcpy(&buf[8], "LIO-ORG ", 8);
|
|
+ memset(&buf[16], 0x20, 16);
|
|
+ memcpy(&buf[16], dev->se_sub_dev->t10_wwn.model,
|
|
+ min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.model), 16));
|
|
+ memcpy(&buf[32], dev->se_sub_dev->t10_wwn.revision,
|
|
+ min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.revision), 4));
|
|
buf[4] = 31; /* Set additional length to 31 */
|
|
|
|
return 0;
|
|
diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c
|
|
index 6f4dd83..3749688 100644
|
|
--- a/drivers/tty/hvc/hvsi_lib.c
|
|
+++ b/drivers/tty/hvc/hvsi_lib.c
|
|
@@ -341,8 +341,8 @@ void hvsilib_establish(struct hvsi_priv *pv)
|
|
|
|
pr_devel("HVSI@%x: ... waiting handshake\n", pv->termno);
|
|
|
|
- /* Try for up to 200s */
|
|
- for (timeout = 0; timeout < 20; timeout++) {
|
|
+ /* Try for up to 400ms */
|
|
+ for (timeout = 0; timeout < 40; timeout++) {
|
|
if (pv->established)
|
|
goto established;
|
|
if (!hvsi_get_packet(pv))
|
|
diff --git a/fs/bio.c b/fs/bio.c
|
|
index 84da885..c0e5a4e 100644
|
|
--- a/fs/bio.c
|
|
+++ b/fs/bio.c
|
|
@@ -787,12 +787,22 @@ static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs,
|
|
int bio_uncopy_user(struct bio *bio)
|
|
{
|
|
struct bio_map_data *bmd = bio->bi_private;
|
|
- int ret = 0;
|
|
+ struct bio_vec *bvec;
|
|
+ int ret = 0, i;
|
|
|
|
- if (!bio_flagged(bio, BIO_NULL_MAPPED))
|
|
- ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs,
|
|
- bmd->nr_sgvecs, bio_data_dir(bio) == READ,
|
|
- 0, bmd->is_our_pages);
|
|
+ if (!bio_flagged(bio, BIO_NULL_MAPPED)) {
|
|
+ /*
|
|
+ * if we're in a workqueue, the request is orphaned, so
|
|
+ * don't copy into a random user address space, just free.
|
|
+ */
|
|
+ if (current->mm)
|
|
+ ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs,
|
|
+ bmd->nr_sgvecs, bio_data_dir(bio) == READ,
|
|
+ 0, bmd->is_our_pages);
|
|
+ else if (bmd->is_our_pages)
|
|
+ __bio_for_each_segment(bvec, bio, i, 0)
|
|
+ __free_page(bvec->bv_page);
|
|
+ }
|
|
bio_free_map_data(bmd);
|
|
bio_put(bio);
|
|
return ret;
|
|
diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c
|
|
index 9197a1b..b6f17c0 100644
|
|
--- a/fs/jfs/jfs_dtree.c
|
|
+++ b/fs/jfs/jfs_dtree.c
|
|
@@ -3047,6 +3047,14 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
|
|
dir_index = (u32) filp->f_pos;
|
|
|
|
+ /*
|
|
+ * NFSv4 reserves cookies 1 and 2 for . and .. so we add
|
|
+ * the value we return to the vfs is one greater than the
|
|
+ * one we use internally.
|
|
+ */
|
|
+ if (dir_index)
|
|
+ dir_index--;
|
|
+
|
|
if (dir_index > 1) {
|
|
struct dir_table_slot dirtab_slot;
|
|
|
|
@@ -3086,7 +3094,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
if (p->header.flag & BT_INTERNAL) {
|
|
jfs_err("jfs_readdir: bad index table");
|
|
DT_PUTPAGE(mp);
|
|
- filp->f_pos = -1;
|
|
+ filp->f_pos = DIREND;
|
|
return 0;
|
|
}
|
|
} else {
|
|
@@ -3094,7 +3102,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
/*
|
|
* self "."
|
|
*/
|
|
- filp->f_pos = 0;
|
|
+ filp->f_pos = 1;
|
|
if (filldir(dirent, ".", 1, 0, ip->i_ino,
|
|
DT_DIR))
|
|
return 0;
|
|
@@ -3102,7 +3110,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
/*
|
|
* parent ".."
|
|
*/
|
|
- filp->f_pos = 1;
|
|
+ filp->f_pos = 2;
|
|
if (filldir(dirent, "..", 2, 1, PARENT(ip), DT_DIR))
|
|
return 0;
|
|
|
|
@@ -3123,24 +3131,25 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
/*
|
|
* Legacy filesystem - OS/2 & Linux JFS < 0.3.6
|
|
*
|
|
- * pn = index = 0: First entry "."
|
|
- * pn = 0; index = 1: Second entry ".."
|
|
+ * pn = 0; index = 1: First entry "."
|
|
+ * pn = 0; index = 2: Second entry ".."
|
|
* pn > 0: Real entries, pn=1 -> leftmost page
|
|
* pn = index = -1: No more entries
|
|
*/
|
|
dtpos = filp->f_pos;
|
|
- if (dtpos == 0) {
|
|
+ if (dtpos < 2) {
|
|
/* build "." entry */
|
|
|
|
+ filp->f_pos = 1;
|
|
if (filldir(dirent, ".", 1, filp->f_pos, ip->i_ino,
|
|
DT_DIR))
|
|
return 0;
|
|
- dtoffset->index = 1;
|
|
+ dtoffset->index = 2;
|
|
filp->f_pos = dtpos;
|
|
}
|
|
|
|
if (dtoffset->pn == 0) {
|
|
- if (dtoffset->index == 1) {
|
|
+ if (dtoffset->index == 2) {
|
|
/* build ".." entry */
|
|
|
|
if (filldir(dirent, "..", 2, filp->f_pos,
|
|
@@ -3233,6 +3242,12 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
}
|
|
jfs_dirent->position = unique_pos++;
|
|
}
|
|
+ /*
|
|
+ * We add 1 to the index because we may
|
|
+ * use a value of 2 internally, and NFSv4
|
|
+ * doesn't like that.
|
|
+ */
|
|
+ jfs_dirent->position++;
|
|
} else {
|
|
jfs_dirent->position = dtpos;
|
|
len = min(d_namleft, DTLHDRDATALEN_LEGACY);
|
|
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c
|
|
index b97a3dd..6997cdd 100644
|
|
--- a/net/sunrpc/xdr.c
|
|
+++ b/net/sunrpc/xdr.c
|
|
@@ -233,10 +233,13 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base,
|
|
pgfrom_base -= copy;
|
|
|
|
vto = kmap_atomic(*pgto);
|
|
- vfrom = kmap_atomic(*pgfrom);
|
|
- memmove(vto + pgto_base, vfrom + pgfrom_base, copy);
|
|
+ if (*pgto != *pgfrom) {
|
|
+ vfrom = kmap_atomic(*pgfrom);
|
|
+ memcpy(vto + pgto_base, vfrom + pgfrom_base, copy);
|
|
+ kunmap_atomic(vfrom);
|
|
+ } else
|
|
+ memmove(vto + pgto_base, vto + pgfrom_base, copy);
|
|
flush_dcache_page(*pgto);
|
|
- kunmap_atomic(vfrom);
|
|
kunmap_atomic(vto);
|
|
|
|
} while ((len -= copy) != 0);
|
|
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
|
|
index d7ccf28..4589acd 100644
|
|
--- a/sound/isa/opti9xx/opti92x-ad1848.c
|
|
+++ b/sound/isa/opti9xx/opti92x-ad1848.c
|
|
@@ -173,11 +173,7 @@ MODULE_DEVICE_TABLE(pnp_card, snd_opti9xx_pnpids);
|
|
|
|
#endif /* CONFIG_PNP */
|
|
|
|
-#ifdef OPTi93X
|
|
-#define DEV_NAME "opti93x"
|
|
-#else
|
|
-#define DEV_NAME "opti92x"
|
|
-#endif
|
|
+#define DEV_NAME KBUILD_MODNAME
|
|
|
|
static char * snd_opti9xx_names[] = {
|
|
"unknown",
|
|
@@ -1126,7 +1122,7 @@ static void __devexit snd_opti9xx_pnp_remove(struct pnp_card_link * pcard)
|
|
|
|
static struct pnp_card_driver opti9xx_pnpc_driver = {
|
|
.flags = PNP_DRIVER_RES_DISABLE,
|
|
- .name = "opti9xx",
|
|
+ .name = DEV_NAME,
|
|
.id_table = snd_opti9xx_pnpids,
|
|
.probe = snd_opti9xx_pnp_probe,
|
|
.remove = __devexit_p(snd_opti9xx_pnp_remove),
|