mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 09:14:19 +08:00
Merge branch 'sh/stable-updates'
This commit is contained in:
commit
8e04221029
@ -143,8 +143,8 @@ o provide a way to configure fault attributes
|
||||
failslab, fail_page_alloc, and fail_make_request use this way.
|
||||
Helper functions:
|
||||
|
||||
init_fault_attr_entries(entries, attr, name);
|
||||
void cleanup_fault_attr_entries(entries);
|
||||
init_fault_attr_dentries(entries, attr, name);
|
||||
void cleanup_fault_attr_dentries(entries);
|
||||
|
||||
- module parameters
|
||||
|
||||
|
@ -702,6 +702,7 @@ config ARCH_OMAP
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select ARCH_HAS_HOLES_MEMORYMODEL
|
||||
help
|
||||
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
||||
|
||||
|
@ -94,7 +94,7 @@ CFLAGS_ABI +=-funwind-tables
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_THUMB2_KERNEL),y)
|
||||
AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=thumb,-Wa$(comma)-mauto-it)
|
||||
AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it)
|
||||
AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
|
||||
CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
|
||||
AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb
|
||||
|
@ -119,6 +119,11 @@ static unsigned long get_rate_nfc(struct clk *clk)
|
||||
return get_rate_per(8);
|
||||
}
|
||||
|
||||
static unsigned long get_rate_gpt(struct clk *clk)
|
||||
{
|
||||
return get_rate_per(5);
|
||||
}
|
||||
|
||||
static unsigned long get_rate_otg(struct clk *clk)
|
||||
{
|
||||
return 48000000; /* FIXME */
|
||||
@ -144,7 +149,7 @@ static void clk_cgcr_disable(struct clk *clk)
|
||||
__raw_writel(reg, clk->enable_reg);
|
||||
}
|
||||
|
||||
#define DEFINE_CLOCK(name, i, er, es, gr, sr) \
|
||||
#define DEFINE_CLOCK(name, i, er, es, gr, sr, s) \
|
||||
static struct clk name = { \
|
||||
.id = i, \
|
||||
.enable_reg = CRM_BASE + er, \
|
||||
@ -153,27 +158,30 @@ static void clk_cgcr_disable(struct clk *clk)
|
||||
.set_rate = sr, \
|
||||
.enable = clk_cgcr_enable, \
|
||||
.disable = clk_cgcr_disable, \
|
||||
.secondary = s, \
|
||||
}
|
||||
|
||||
DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL);
|
||||
DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL);
|
||||
DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL);
|
||||
DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL);
|
||||
DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL);
|
||||
DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL);
|
||||
DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL);
|
||||
DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL);
|
||||
DEFINE_CLOCK(fec_clk, 0, CCM_CGCR0, 23, get_rate_ipg, NULL);
|
||||
DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_gpt, NULL, NULL);
|
||||
DEFINE_CLOCK(uart_per_clk, 0, CCM_CGCR0, 15, get_rate_uart, NULL, NULL);
|
||||
DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(fec_ahb_clk, 0, CCM_CGCR0, 23, NULL, NULL, NULL);
|
||||
DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL, &uart_per_clk);
|
||||
DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL, &uart_per_clk);
|
||||
DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL, &uart_per_clk);
|
||||
DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL, &uart_per_clk);
|
||||
DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL, &uart_per_clk);
|
||||
DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL, NULL);
|
||||
DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL, NULL);
|
||||
DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL, NULL);
|
||||
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL, NULL);
|
||||
DEFINE_CLOCK(fec_clk, 0, CCM_CGCR1, 15, get_rate_ipg, NULL, &fec_ahb_clk);
|
||||
|
||||
#define _REGISTER_CLOCK(d, n, c) \
|
||||
{ \
|
||||
@ -208,13 +216,21 @@ static struct clk_lookup lookups[] = {
|
||||
_REGISTER_CLOCK("fec.0", NULL, fec_clk)
|
||||
};
|
||||
|
||||
int __init mx25_clocks_init(unsigned long fref)
|
||||
int __init mx25_clocks_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(lookups); i++)
|
||||
clkdev_add(&lookups[i]);
|
||||
|
||||
/* Turn off all clocks except the ones we need to survive, namely:
|
||||
* EMI, GPIO1-3 (CCM_CGCR1[18:16]), GPT1, IOMUXC (CCM_CGCR1[27]), IIM,
|
||||
* SCC
|
||||
*/
|
||||
__raw_writel((1 << 19), CRM_BASE + CCM_CGCR0);
|
||||
__raw_writel((0xf << 16) | (3 << 26), CRM_BASE + CCM_CGCR1);
|
||||
__raw_writel((1 << 5), CRM_BASE + CCM_CGCR2);
|
||||
|
||||
mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54);
|
||||
|
||||
return 0;
|
||||
|
@ -91,7 +91,7 @@ static void __init mx25pdk_init(void)
|
||||
|
||||
static void __init mx25pdk_timer_init(void)
|
||||
{
|
||||
mx25_clocks_init(26000000);
|
||||
mx25_clocks_init();
|
||||
}
|
||||
|
||||
static struct sys_timer mx25pdk_timer = {
|
||||
|
@ -173,6 +173,7 @@ static void expio_unmask_irq(u32 irq)
|
||||
}
|
||||
|
||||
static struct irq_chip expio_irq_chip = {
|
||||
.name = "EXPIO(CPLD)",
|
||||
.ack = expio_ack_irq,
|
||||
.mask = expio_mask_irq,
|
||||
.unmask = expio_unmask_irq,
|
||||
@ -302,6 +303,7 @@ static struct regulator_init_data ldo1_data = {
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
};
|
||||
@ -322,6 +324,7 @@ static struct regulator_init_data ldo2_data = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.apply_uV = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
|
||||
@ -459,6 +462,7 @@ static int mx31_wm8350_init(struct wm8350 *wm8350)
|
||||
|
||||
static struct wm8350_platform_data __initdata mx31_wm8350_pdata = {
|
||||
.init = mx31_wm8350_init,
|
||||
.irq_base = MXC_BOARD_IRQ_START + MXC_MAX_EXP_IO_LINES,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -505,7 +505,7 @@ static void __init gpmc_mem_init(void)
|
||||
void __init gpmc_init(void)
|
||||
{
|
||||
u32 l;
|
||||
char *ck;
|
||||
char *ck = NULL;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
ck = "core_l3_ck";
|
||||
@ -521,6 +521,9 @@ void __init gpmc_init(void)
|
||||
l = OMAP44XX_GPMC_BASE;
|
||||
}
|
||||
|
||||
if (WARN_ON(!ck))
|
||||
return;
|
||||
|
||||
gpmc_l3_clk = clk_get(NULL, ck);
|
||||
if (IS_ERR(gpmc_l3_clk)) {
|
||||
printk(KERN_ERR "Could not get GPMC clock %s\n", ck);
|
||||
|
@ -194,7 +194,7 @@ void __init omap_init_irq(void)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
|
||||
unsigned long base;
|
||||
unsigned long base = 0;
|
||||
struct omap_irq_bank *bank = irq_banks + i;
|
||||
|
||||
if (cpu_is_omap24xx())
|
||||
@ -202,6 +202,8 @@ void __init omap_init_irq(void)
|
||||
else if (cpu_is_omap34xx())
|
||||
base = OMAP34XX_IC_BASE;
|
||||
|
||||
BUG_ON(!base);
|
||||
|
||||
/* Static mapping, never released */
|
||||
bank->base_reg = ioremap(base, SZ_4K);
|
||||
if (!bank->base_reg) {
|
||||
|
@ -486,7 +486,7 @@ int __init omap_mux_init_signal(char *muxname, int val)
|
||||
static inline void omap_mux_decode(struct seq_file *s, u16 val)
|
||||
{
|
||||
char *flags[OMAP_MUX_MAX_NR_FLAGS];
|
||||
char mode[14];
|
||||
char mode[sizeof("OMAP_MUX_MODE") + 1];
|
||||
int i = -1;
|
||||
|
||||
sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
|
||||
@ -553,6 +553,7 @@ static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
|
||||
if (!m0_name)
|
||||
continue;
|
||||
|
||||
/* REVISIT: Needs to be updated if mode0 names get longer */
|
||||
for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
|
||||
if (m0_name[i] == '\0') {
|
||||
m0_def[i] = m0_name[i];
|
||||
@ -968,6 +969,13 @@ static void __init omap_mux_init_list(struct omap_mux *superset)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS)
|
||||
if (!superset->muxnames || !superset->muxnames[0]) {
|
||||
superset++;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
entry = omap_mux_list_add(superset);
|
||||
if (!entry) {
|
||||
printk(KERN_ERR "mux: Could not add entry\n");
|
||||
|
@ -649,6 +649,53 @@ static struct omap_mux __initdata omap3_muxmodes[] = {
|
||||
_OMAP3_MUXENTRY(UART3_TX_IRTX, 166,
|
||||
"uart3_tx_irtx", NULL, NULL, NULL,
|
||||
"gpio_166", NULL, NULL, "safe_mode"),
|
||||
|
||||
/* Only on 3630, see omap36xx_cbp_subset for the signals */
|
||||
_OMAP3_MUXENTRY(GPMC_A11, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MREAD, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MWRITE, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_SREAD, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_SWRITE, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(GPMC_A11, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD28, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD29, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD32, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD33, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD34, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD35, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
_OMAP3_MUXENTRY(SAD2D_MCAD36, 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL),
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
|
||||
|
@ -36,7 +36,13 @@
|
||||
#define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52
|
||||
#define UART_OMAP_WER 0x17 /* Wake-up enable register */
|
||||
|
||||
#define DEFAULT_TIMEOUT (5 * HZ)
|
||||
/*
|
||||
* NOTE: By default the serial timeout is disabled as it causes lost characters
|
||||
* over the serial ports. This means that the UART clocks will stay on until
|
||||
* disabled via sysfs. This also causes that any deeper omap sleep states are
|
||||
* blocked.
|
||||
*/
|
||||
#define DEFAULT_TIMEOUT 0
|
||||
|
||||
struct omap_uart_state {
|
||||
int num;
|
||||
@ -422,7 +428,8 @@ static void omap_uart_idle_init(struct omap_uart_state *uart)
|
||||
uart->timeout = DEFAULT_TIMEOUT;
|
||||
setup_timer(&uart->timer, omap_uart_idle_timer,
|
||||
(unsigned long) uart);
|
||||
mod_timer(&uart->timer, jiffies + uart->timeout);
|
||||
if (uart->timeout)
|
||||
mod_timer(&uart->timer, jiffies + uart->timeout);
|
||||
omap_uart_smart_idle_enable(uart, 0);
|
||||
|
||||
if (cpu_is_omap34xx()) {
|
||||
|
@ -334,8 +334,8 @@ static void realview_pbx_reset(char mode)
|
||||
* in the system FPGA
|
||||
*/
|
||||
__raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl);
|
||||
__raw_writel(0x0000, reset_ctrl);
|
||||
__raw_writel(0x0004, reset_ctrl);
|
||||
__raw_writel(0x00F0, reset_ctrl);
|
||||
__raw_writel(0x00F4, reset_ctrl);
|
||||
}
|
||||
|
||||
static void __init realview_pbx_init(void)
|
||||
|
@ -41,7 +41,7 @@ ENTRY(cpu_arm7_dcache_clean_area)
|
||||
ENTRY(cpu_arm7_data_abort)
|
||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||
ldr r8, [r0] @ read arm instruction
|
||||
ldr r8, [r2] @ read arm instruction
|
||||
tst r8, #1 << 20 @ L = 0 -> write?
|
||||
orreq r1, r1, #1 << 11 @ yes.
|
||||
and r7, r8, #15 << 24
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <mach/audmux.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
@ -32,6 +33,140 @@ static void __iomem *audmux_base;
|
||||
#define MXC_AUDMUX_V2_PTCR(x) ((x) * 8)
|
||||
#define MXC_AUDMUX_V2_PDCR(x) ((x) * 8 + 4)
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static struct dentry *audmux_debugfs_root;
|
||||
|
||||
static int audmux_open_file(struct inode *inode, struct file *file)
|
||||
{
|
||||
file->private_data = inode->i_private;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* There is an annoying discontinuity in the SSI numbering with regard
|
||||
* to the Linux number of the devices */
|
||||
static const char *audmux_port_string(int port)
|
||||
{
|
||||
switch (port) {
|
||||
case MX31_AUDMUX_PORT1_SSI0:
|
||||
return "imx-ssi.0";
|
||||
case MX31_AUDMUX_PORT2_SSI1:
|
||||
return "imx-ssi.1";
|
||||
case MX31_AUDMUX_PORT3_SSI_PINS_3:
|
||||
return "SSI3";
|
||||
case MX31_AUDMUX_PORT4_SSI_PINS_4:
|
||||
return "SSI4";
|
||||
case MX31_AUDMUX_PORT5_SSI_PINS_5:
|
||||
return "SSI5";
|
||||
case MX31_AUDMUX_PORT6_SSI_PINS_6:
|
||||
return "SSI6";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t audmux_read_file(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
ssize_t ret;
|
||||
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
int port = (int)file->private_data;
|
||||
u32 pdcr, ptcr;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (audmux_clk)
|
||||
clk_enable(audmux_clk);
|
||||
|
||||
ptcr = readl(audmux_base + MXC_AUDMUX_V2_PTCR(port));
|
||||
pdcr = readl(audmux_base + MXC_AUDMUX_V2_PDCR(port));
|
||||
|
||||
if (audmux_clk)
|
||||
clk_disable(audmux_clk);
|
||||
|
||||
ret = snprintf(buf, PAGE_SIZE, "PDCR: %08x\nPTCR: %08x\n",
|
||||
pdcr, ptcr);
|
||||
|
||||
if (ptcr & MXC_AUDMUX_V2_PTCR_TFSDIR)
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"TxFS output from %s, ",
|
||||
audmux_port_string((ptcr >> 27) & 0x7));
|
||||
else
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"TxFS input, ");
|
||||
|
||||
if (ptcr & MXC_AUDMUX_V2_PTCR_TCLKDIR)
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"TxClk output from %s",
|
||||
audmux_port_string((ptcr >> 22) & 0x7));
|
||||
else
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"TxClk input");
|
||||
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
|
||||
|
||||
if (ptcr & MXC_AUDMUX_V2_PTCR_SYN) {
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"Port is symmetric");
|
||||
} else {
|
||||
if (ptcr & MXC_AUDMUX_V2_PTCR_RFSDIR)
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"RxFS output from %s, ",
|
||||
audmux_port_string((ptcr >> 17) & 0x7));
|
||||
else
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"RxFS input, ");
|
||||
|
||||
if (ptcr & MXC_AUDMUX_V2_PTCR_RCLKDIR)
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"RxClk output from %s",
|
||||
audmux_port_string((ptcr >> 12) & 0x7));
|
||||
else
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"RxClk input");
|
||||
}
|
||||
|
||||
ret += snprintf(buf + ret, PAGE_SIZE - ret,
|
||||
"\nData received from %s\n",
|
||||
audmux_port_string((pdcr >> 13) & 0x7));
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
||||
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations audmux_debugfs_fops = {
|
||||
.open = audmux_open_file,
|
||||
.read = audmux_read_file,
|
||||
};
|
||||
|
||||
static void audmux_debugfs_init(void)
|
||||
{
|
||||
int i;
|
||||
char buf[20];
|
||||
|
||||
audmux_debugfs_root = debugfs_create_dir("audmux", NULL);
|
||||
if (!audmux_debugfs_root) {
|
||||
pr_warning("Failed to create AUDMUX debugfs root\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < 8; i++) {
|
||||
snprintf(buf, sizeof(buf), "ssi%d", i);
|
||||
if (!debugfs_create_file(buf, 0444, audmux_debugfs_root,
|
||||
(void *)i, &audmux_debugfs_fops))
|
||||
pr_warning("Failed to create AUDMUX port %d debugfs file\n",
|
||||
i);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void audmux_debugfs_init(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
int mxc_audmux_v2_configure_port(unsigned int port, unsigned int ptcr,
|
||||
unsigned int pdcr)
|
||||
{
|
||||
@ -68,6 +203,8 @@ static int mxc_audmux_v2_init(void)
|
||||
if (cpu_is_mx31() || cpu_is_mx35())
|
||||
audmux_base = IO_ADDRESS(AUDMUX_BASE_ADDR);
|
||||
|
||||
audmux_debugfs_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
enum mx31lilly_boards {
|
||||
enum mx31lite_boards {
|
||||
MX31LITE_NOBOARD = 0,
|
||||
MX31LITE_DB = 1,
|
||||
};
|
||||
|
@ -32,7 +32,7 @@ extern void mxc91231_init_irq(void);
|
||||
extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int);
|
||||
extern int mx1_clocks_init(unsigned long fref);
|
||||
extern int mx21_clocks_init(unsigned long lref, unsigned long fref);
|
||||
extern int mx25_clocks_init(unsigned long fref);
|
||||
extern int mx25_clocks_init(void);
|
||||
extern int mx27_clocks_init(unsigned long fref);
|
||||
extern int mx31_clocks_init(unsigned long fref);
|
||||
extern int mx35_clocks_init(void);
|
||||
|
@ -671,7 +671,7 @@
|
||||
#define MX35_PAD_LD8__SDMA_SDMA_DEBUG_PC_8 IOMUX_PAD(0x634, 0x1d0, 6, 0x0, 0, NO_PAD_CTRL)
|
||||
|
||||
#define MX35_PAD_LD9__IPU_DISPB_DAT_9 IOMUX_PAD(0x638, 0x1d4, 0, 0x0, 0, NO_PAD_CTRL)
|
||||
#define MX35_PAD_LD9__GPIO2_9 IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4 0, NO_PAD_CTRL)
|
||||
#define MX35_PAD_LD9__GPIO2_9 IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4, 0, NO_PAD_CTRL)
|
||||
#define MX35_PAD_LD9__SDMA_SDMA_DEBUG_PC_9 IOMUX_PAD(0x638, 0x1d4, 6, 0x0, 0, NO_PAD_CTRL)
|
||||
|
||||
#define MX35_PAD_LD10__IPU_DISPB_DAT_10 IOMUX_PAD(0x63c, 0x1d8, 0, 0x0, 0, NO_PAD_CTRL)
|
||||
|
@ -37,7 +37,12 @@
|
||||
* within sensible limits.
|
||||
*/
|
||||
#define MXC_BOARD_IRQ_START (MXC_INTERNAL_IRQS + MXC_GPIO_IRQS)
|
||||
|
||||
#ifdef CONFIG_MACH_MX31ADS_WM1133_EV1
|
||||
#define MXC_BOARD_IRQS 80
|
||||
#else
|
||||
#define MXC_BOARD_IRQS 16
|
||||
#endif
|
||||
|
||||
#define MXC_IPU_IRQ_START (MXC_BOARD_IRQ_START + MXC_BOARD_IRQS)
|
||||
|
||||
|
@ -391,7 +391,7 @@ static struct dentry *clk_debugfs_root;
|
||||
static int clk_debugfs_register_one(struct clk *c)
|
||||
{
|
||||
int err;
|
||||
struct dentry *d, *child;
|
||||
struct dentry *d, *child, *child_tmp;
|
||||
struct clk *pa = c->parent;
|
||||
char s[255];
|
||||
char *p = s;
|
||||
@ -423,7 +423,7 @@ static int clk_debugfs_register_one(struct clk *c)
|
||||
|
||||
err_out:
|
||||
d = c->dent;
|
||||
list_for_each_entry(child, &d->d_subdirs, d_u.d_child)
|
||||
list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
|
||||
debugfs_remove(child);
|
||||
debugfs_remove(c->dent);
|
||||
return err;
|
||||
|
@ -750,6 +750,7 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1
|
||||
/*
|
||||
* This only applies to chips that can't do both rising and falling edge
|
||||
* detection at once. For all other chips, this function is a noop.
|
||||
@ -760,11 +761,9 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
|
||||
u32 l = 0;
|
||||
|
||||
switch (bank->method) {
|
||||
#ifdef CONFIG_ARCH_OMAP1
|
||||
case METHOD_MPUIO:
|
||||
reg += OMAP_MPUIO_GPIO_INT_EDGE;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
case METHOD_GPIO_1510:
|
||||
reg += OMAP1510_GPIO_INT_CONTROL;
|
||||
@ -787,6 +786,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
|
||||
|
||||
__raw_writel(l, reg);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
|
||||
{
|
||||
|
@ -89,16 +89,6 @@
|
||||
#define USE_WAKEUP_LAT 0
|
||||
#define IGNORE_WAKEUP_LAT 1
|
||||
|
||||
/* XXX this should be moved into a separate file */
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
# define OMAP_32KSYNCT_BASE 0x48004000
|
||||
#elif defined(CONFIG_ARCH_OMAP2430)
|
||||
# define OMAP_32KSYNCT_BASE 0x49020000
|
||||
#elif defined(CONFIG_ARCH_OMAP3430)
|
||||
# define OMAP_32KSYNCT_BASE 0x48320000
|
||||
#else
|
||||
# error Unknown OMAP device
|
||||
#endif
|
||||
|
||||
/* Private functions */
|
||||
|
||||
|
@ -197,10 +197,13 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the FPSCR with the additional exception flags.
|
||||
* If any of the status flags are set, update the FPSCR.
|
||||
* Comparison instructions always return at least one of
|
||||
* these flags set.
|
||||
*/
|
||||
if (exceptions & (FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V))
|
||||
fpscr &= ~(FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V);
|
||||
|
||||
fpscr |= exceptions;
|
||||
|
||||
fmxr(FPSCR, fpscr);
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.31
|
||||
# Thu Sep 24 10:28:50 2009
|
||||
# Linux kernel version: 2.6.33-rc6
|
||||
# Wed Feb 3 10:02:59 2010
|
||||
#
|
||||
CONFIG_MICROBLAZE=y
|
||||
# CONFIG_SWAP is not set
|
||||
@ -19,8 +19,12 @@ CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
# CONFIG_PCI is not set
|
||||
CONFIG_NO_DMA=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
@ -44,6 +48,7 @@ CONFIG_SYSVIPC_SYSCTL=y
|
||||
#
|
||||
CONFIG_TREE_RCU=y
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
# CONFIG_TINY_RCU is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_RCU_FANOUT=32
|
||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||
@ -64,10 +69,12 @@ CONFIG_INITRAMFS_ROOT_GID=0
|
||||
CONFIG_RD_GZIP=y
|
||||
# CONFIG_RD_BZIP2 is not set
|
||||
# CONFIG_RD_LZMA is not set
|
||||
# CONFIG_RD_LZO is not set
|
||||
# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
|
||||
CONFIG_INITRAMFS_COMPRESSION_GZIP=y
|
||||
# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
|
||||
# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
|
||||
# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_ANON_INODES=y
|
||||
@ -90,21 +97,20 @@ CONFIG_EVENTFD=y
|
||||
CONFIG_AIO=y
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
CONFIG_SLOW_WORK=y
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_BASE_SMALL=1
|
||||
@ -123,14 +129,41 @@ CONFIG_LBDAF=y
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
||||
# CONFIG_INLINE_SPIN_UNLOCK is not set
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_READ_TRYLOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK_BH is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
||||
# CONFIG_INLINE_READ_UNLOCK is not set
|
||||
# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
||||
# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
|
||||
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
||||
# CONFIG_INLINE_WRITE_UNLOCK is not set
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
||||
# CONFIG_FREEZER is not set
|
||||
|
||||
#
|
||||
@ -139,11 +172,6 @@ CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_PLATFORM_GENERIC=y
|
||||
CONFIG_OPT_LIB_FUNCTION=y
|
||||
CONFIG_OPT_LIB_ASM=y
|
||||
CONFIG_ALLOW_EDIT_AUTO=y
|
||||
|
||||
#
|
||||
# Automatic platform settings from Kconfig.auto
|
||||
#
|
||||
|
||||
#
|
||||
# Definitions for MICROBLAZE0
|
||||
@ -203,12 +231,11 @@ CONFIG_FLATMEM_MANUAL=y
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=999999
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
# CONFIG_KSM is not set
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
|
||||
#
|
||||
@ -289,7 +316,13 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_WIRELESS=y
|
||||
# CONFIG_CFG80211 is not set
|
||||
# CONFIG_LIB80211 is not set
|
||||
|
||||
#
|
||||
# CFG80211 needs to be enabled for MAC80211
|
||||
#
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
@ -313,6 +346,10 @@ CONFIG_OF_DEVICE=y
|
||||
CONFIG_BLK_DEV=y
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
|
||||
#
|
||||
# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
|
||||
#
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
@ -349,7 +386,6 @@ CONFIG_NETDEVICES=y
|
||||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_ETHOC is not set
|
||||
# CONFIG_DNET is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
@ -359,12 +395,12 @@ CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_KS8851_MLL is not set
|
||||
CONFIG_XILINX_EMACLITE=y
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_NETDEV_10000=y
|
||||
CONFIG_WLAN=y
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_HOSTAP is not set
|
||||
|
||||
#
|
||||
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
||||
@ -408,6 +444,7 @@ CONFIG_SERIAL_UARTLITE=y
|
||||
CONFIG_SERIAL_UARTLITE_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
@ -433,7 +470,6 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
@ -526,8 +562,6 @@ CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
CONFIG_MISC_FILESYSTEMS=y
|
||||
@ -638,11 +672,13 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
@ -662,6 +698,9 @@ CONFIG_DEBUG_SLAB=y
|
||||
# CONFIG_DEBUG_SLAB_LEAK is not set
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
@ -680,10 +719,29 @@ CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
# CONFIG_PAGE_POISONING is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
CONFIG_FTRACE=y
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
CONFIG_BRANCH_PROFILE_NONE=y
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
# CONFIG_KMEMCHECK is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
# CONFIG_HEART_BEAT is not set
|
||||
CONFIG_DEBUG_BOOTMEM=y
|
||||
@ -694,7 +752,11 @@ CONFIG_DEBUG_BOOTMEM=y
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITYFS is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SMACK is not set
|
||||
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
|
||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||
CONFIG_DEFAULT_SECURITY=""
|
||||
CONFIG_CRYPTO=y
|
||||
|
||||
#
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.31
|
||||
# Thu Sep 24 10:29:43 2009
|
||||
# Linux kernel version: 2.6.33-rc6
|
||||
# Wed Feb 3 10:03:21 2010
|
||||
#
|
||||
CONFIG_MICROBLAZE=y
|
||||
# CONFIG_SWAP is not set
|
||||
@ -19,8 +19,12 @@ CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
# CONFIG_PCI is not set
|
||||
CONFIG_NO_DMA=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
@ -46,6 +50,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||
#
|
||||
CONFIG_TREE_RCU=y
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
# CONFIG_TINY_RCU is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_RCU_FANOUT=32
|
||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||
@ -81,16 +86,16 @@ CONFIG_EVENTFD=y
|
||||
CONFIG_AIO=y
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_MMAP_ALLOW_UNINITIALIZED is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
@ -116,14 +121,41 @@ CONFIG_LBDAF=y
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_READ_TRYLOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK_BH is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_READ_UNLOCK=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_READ_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
||||
# CONFIG_FREEZER is not set
|
||||
|
||||
#
|
||||
@ -132,7 +164,10 @@ CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_PLATFORM_GENERIC=y
|
||||
# CONFIG_SELFMOD is not set
|
||||
# CONFIG_OPT_LIB_FUNCTION is not set
|
||||
# CONFIG_ALLOW_EDIT_AUTO is not set
|
||||
|
||||
#
|
||||
# Definitions for MICROBLAZE0
|
||||
#
|
||||
CONFIG_KERNEL_BASE_ADDR=0x90000000
|
||||
CONFIG_XILINX_MICROBLAZE0_FAMILY="virtex5"
|
||||
CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1
|
||||
@ -190,7 +225,6 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1
|
||||
|
||||
#
|
||||
@ -274,9 +308,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
CONFIG_WIRELESS=y
|
||||
# CONFIG_CFG80211 is not set
|
||||
CONFIG_CFG80211_DEFAULT_PS_VALUE=0
|
||||
CONFIG_WIRELESS_OLD_REGULATORY=y
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_LIB80211 is not set
|
||||
|
||||
#
|
||||
@ -301,9 +332,9 @@ CONFIG_STANDALONE=y
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_TESTS is not set
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_TESTS is not set
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_OF_PARTS is not set
|
||||
@ -387,6 +418,10 @@ CONFIG_OF_DEVICE=y
|
||||
CONFIG_BLK_DEV=y
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
|
||||
#
|
||||
# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
|
||||
#
|
||||
CONFIG_BLK_DEV_NBD=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
@ -423,7 +458,6 @@ CONFIG_NETDEVICES=y
|
||||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_ETHOC is not set
|
||||
# CONFIG_DNET is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
@ -433,12 +467,12 @@ CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_KS8851_MLL is not set
|
||||
# CONFIG_XILINX_EMACLITE is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_NETDEV_10000=y
|
||||
CONFIG_WLAN=y
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_HOSTAP is not set
|
||||
|
||||
#
|
||||
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
||||
@ -482,6 +516,7 @@ CONFIG_SERIAL_UARTLITE=y
|
||||
CONFIG_SERIAL_UARTLITE_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
@ -508,7 +543,6 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
@ -616,7 +650,6 @@ CONFIG_INOTIFY_USER=y
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
CONFIG_MISC_FILESYSTEMS=y
|
||||
@ -672,11 +705,13 @@ CONFIG_MSDOS_PARTITION=y
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
@ -695,12 +730,16 @@ CONFIG_DEBUG_OBJECTS=y
|
||||
CONFIG_DEBUG_OBJECTS_SELFTEST=y
|
||||
CONFIG_DEBUG_OBJECTS_FREE=y
|
||||
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
||||
# CONFIG_DEBUG_OBJECTS_WORK is not set
|
||||
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
@ -720,8 +759,28 @@ CONFIG_DEBUG_SG=y
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
# CONFIG_PAGE_POISONING is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
CONFIG_FTRACE=y
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
CONFIG_BRANCH_PROFILE_NONE=y
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_DYNAMIC_DEBUG is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@ -734,7 +793,11 @@ CONFIG_EARLY_PRINTK=y
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITYFS is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SMACK is not set
|
||||
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
|
||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||
CONFIG_DEFAULT_SECURITY=""
|
||||
CONFIG_CRYPTO=y
|
||||
|
||||
#
|
||||
|
@ -122,7 +122,7 @@ ENTRY(_interrupt)
|
||||
|
||||
ret_from_intr:
|
||||
lwi r11, r1, PT_MODE
|
||||
bneid r11, 3f
|
||||
bneid r11, no_intr_resched
|
||||
|
||||
lwi r6, r31, TS_THREAD_INFO /* get thread info */
|
||||
lwi r19, r6, TI_FLAGS /* get flags in thread info */
|
||||
@ -133,16 +133,18 @@ ret_from_intr:
|
||||
bralid r15, schedule
|
||||
nop
|
||||
1: andi r11, r19, _TIF_SIGPENDING
|
||||
beqid r11, no_intr_reshed
|
||||
beqid r11, no_intr_resched
|
||||
addk r5, r1, r0
|
||||
addk r7, r0, r0
|
||||
bralid r15, do_signal
|
||||
addk r6, r0, r0
|
||||
|
||||
no_intr_reshed:
|
||||
no_intr_resched:
|
||||
/* Disable interrupts, we are now committed to the state restore */
|
||||
disable_irq
|
||||
|
||||
/* save mode indicator */
|
||||
lwi r11, r1, PT_MODE
|
||||
3:
|
||||
swi r11, r0, PER_CPU(KM)
|
||||
|
||||
/* save r31 */
|
||||
|
@ -412,8 +412,11 @@ u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
|
||||
if (desc_base == 0)
|
||||
return 0;
|
||||
|
||||
ctp->cdb_membase = desc_base;
|
||||
desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t));
|
||||
}
|
||||
} else
|
||||
ctp->cdb_membase = desc_base;
|
||||
|
||||
dp = (au1x_ddma_desc_t *)desc_base;
|
||||
|
||||
/* Keep track of the base descriptor. */
|
||||
@ -831,7 +834,7 @@ void au1xxx_dbdma_chan_free(u32 chanid)
|
||||
|
||||
au1xxx_dbdma_stop(chanid);
|
||||
|
||||
kfree((void *)ctp->chan_desc_base);
|
||||
kfree((void *)ctp->cdb_membase);
|
||||
|
||||
stp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
dtp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
|
@ -202,7 +202,7 @@ static struct resource usb_res[] = {
|
||||
.name = "mem",
|
||||
.flags = IORESOURCE_MEM,
|
||||
.start = 0x03400000,
|
||||
.end = 0x034001fff,
|
||||
.end = 0x03401fff,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -191,6 +191,9 @@
|
||||
# ifndef cpu_has_64bit_addresses
|
||||
# define cpu_has_64bit_addresses 0
|
||||
# endif
|
||||
# ifndef cpu_vmbits
|
||||
# define cpu_vmbits 31
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
@ -209,6 +212,10 @@
|
||||
# ifndef cpu_has_64bit_addresses
|
||||
# define cpu_has_64bit_addresses 1
|
||||
# endif
|
||||
# ifndef cpu_vmbits
|
||||
# define cpu_vmbits cpu_data[0].vmbits
|
||||
# define __NEED_VMBITS_PROBE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
|
||||
|
@ -58,6 +58,9 @@ struct cpuinfo_mips {
|
||||
struct cache_desc tcache; /* Tertiary/split secondary cache */
|
||||
int srsets; /* Shadow register sets */
|
||||
int core; /* physical core number */
|
||||
#ifdef CONFIG_64BIT
|
||||
int vmbits; /* Virtual memory size in bits */
|
||||
#endif
|
||||
#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
|
||||
/*
|
||||
* In the MIPS MT "SMTC" model, each TC is considered
|
||||
|
@ -305,6 +305,7 @@ typedef struct dbdma_chan_config {
|
||||
dbdev_tab_t *chan_dest;
|
||||
au1x_dma_chan_t *chan_ptr;
|
||||
au1x_ddma_desc_t *chan_desc_base;
|
||||
u32 cdb_membase; /* kmalloc base of above */
|
||||
au1x_ddma_desc_t *get_ptr, *put_ptr, *cur_ptr;
|
||||
void *chan_callparam;
|
||||
void (*chan_callback)(int, void *);
|
||||
|
@ -110,7 +110,9 @@
|
||||
#define VMALLOC_START MAP_BASE
|
||||
#define VMALLOC_END \
|
||||
(VMALLOC_START + \
|
||||
PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32))
|
||||
min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
|
||||
(1UL << cpu_vmbits)) - (1UL << 32))
|
||||
|
||||
#if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
|
||||
VMALLOC_START != CKSSEG
|
||||
/* Load modules into 32bit-compatible segment. */
|
||||
|
@ -284,6 +284,15 @@ static inline int __cpu_has_fpu(void)
|
||||
return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
|
||||
}
|
||||
|
||||
static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
|
||||
{
|
||||
#ifdef __NEED_VMBITS_PROBE
|
||||
write_c0_entryhi(0x3ffffffffffff000ULL);
|
||||
back_to_back_c0_hazard();
|
||||
c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
|
||||
| MIPS_CPU_COUNTER)
|
||||
|
||||
@ -969,6 +978,8 @@ __cpuinit void cpu_probe(void)
|
||||
c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
|
||||
else
|
||||
c->srsets = 1;
|
||||
|
||||
cpu_probe_vmbits(c);
|
||||
}
|
||||
|
||||
__cpuinit void cpu_report(void)
|
||||
|
@ -49,6 +49,7 @@
|
||||
#include <asm/numa.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
static unsigned long dma_reserve __initdata;
|
||||
|
||||
@ -615,6 +616,21 @@ void __init paging_init(void)
|
||||
* Memory hotplug specific functions
|
||||
*/
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/*
|
||||
* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need
|
||||
* updating.
|
||||
*/
|
||||
static void update_end_of_memory_vars(u64 start, u64 size)
|
||||
{
|
||||
unsigned long end_pfn = PFN_UP(start + size);
|
||||
|
||||
if (end_pfn > max_pfn) {
|
||||
max_pfn = end_pfn;
|
||||
max_low_pfn = end_pfn;
|
||||
high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Memory is added always to NORMAL zone. This means you will never get
|
||||
* additional DMA/DMA32 memory.
|
||||
@ -634,6 +650,9 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||
ret = __add_pages(nid, zone, start_pfn, nr_pages);
|
||||
WARN_ON_ONCE(ret);
|
||||
|
||||
/* update max_pfn, max_low_pfn and high_memory */
|
||||
update_end_of_memory_vars(start, size);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arch_add_memory);
|
||||
|
@ -147,16 +147,16 @@ blkiocg_weight_write(struct cgroup *cgroup, struct cftype *cftype, u64 val)
|
||||
return -EINVAL;
|
||||
|
||||
blkcg = cgroup_to_blkio_cgroup(cgroup);
|
||||
spin_lock(&blkio_list_lock);
|
||||
spin_lock_irq(&blkcg->lock);
|
||||
blkcg->weight = (unsigned int)val;
|
||||
hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) {
|
||||
spin_lock(&blkio_list_lock);
|
||||
list_for_each_entry(blkiop, &blkio_list, list)
|
||||
blkiop->ops.blkio_update_group_weight_fn(blkg,
|
||||
blkcg->weight);
|
||||
spin_unlock(&blkio_list_lock);
|
||||
}
|
||||
spin_unlock_irq(&blkcg->lock);
|
||||
spin_unlock(&blkio_list_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1803,7 +1803,7 @@ static bool cfq_should_idle(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
||||
* Otherwise, we do only if they are the last ones
|
||||
* in their service tree.
|
||||
*/
|
||||
return service_tree->count == 1;
|
||||
return service_tree->count == 1 && cfq_cfqq_sync(cfqq);
|
||||
}
|
||||
|
||||
static void cfq_arm_slice_timer(struct cfq_data *cfqd)
|
||||
|
@ -2973,7 +2973,6 @@ struct drbd_conf *drbd_new_device(unsigned int minor)
|
||||
goto out_no_q;
|
||||
mdev->rq_queue = q;
|
||||
q->queuedata = mdev;
|
||||
blk_queue_max_segment_size(q, DRBD_MAX_SEGMENT_SIZE);
|
||||
|
||||
disk = alloc_disk(1);
|
||||
if (!disk)
|
||||
@ -2997,6 +2996,7 @@ struct drbd_conf *drbd_new_device(unsigned int minor)
|
||||
q->backing_dev_info.congested_data = mdev;
|
||||
|
||||
blk_queue_make_request(q, drbd_make_request_26);
|
||||
blk_queue_max_segment_size(q, DRBD_MAX_SEGMENT_SIZE);
|
||||
blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
|
||||
blk_queue_merge_bvec(q, drbd_merge_bvec);
|
||||
q->queue_lock = &mdev->req_lock; /* needed since we use */
|
||||
|
@ -1224,7 +1224,7 @@ static int receive_Barrier(struct drbd_conf *mdev, struct p_header *h)
|
||||
epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO);
|
||||
if (!epoch) {
|
||||
dev_warn(DEV, "Allocation of an epoch failed, slowing down\n");
|
||||
issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &epoch->flags);
|
||||
issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &mdev->current_epoch->flags);
|
||||
drbd_wait_ee_list_empty(mdev, &mdev->active_ee);
|
||||
if (issue_flush) {
|
||||
rv = drbd_flush_after_epoch(mdev, mdev->current_epoch);
|
||||
|
@ -322,7 +322,7 @@ static void pkt_sysfs_dev_remove(struct pktcdvd_device *pd)
|
||||
pkt_kobj_remove(pd->kobj_stat);
|
||||
pkt_kobj_remove(pd->kobj_wqueue);
|
||||
if (class_pktcdvd)
|
||||
device_destroy(class_pktcdvd, pd->pkt_dev);
|
||||
device_unregister(pd->dev);
|
||||
}
|
||||
|
||||
|
||||
|
@ -195,5 +195,16 @@ config BT_MRVL_SDIO
|
||||
Say Y here to compile support for Marvell BT-over-SDIO driver
|
||||
into the kernel or say M to compile it as module.
|
||||
|
||||
endmenu
|
||||
config BT_ATH3K
|
||||
tristate "Atheros firmware download driver"
|
||||
depends on BT_HCIBTUSB
|
||||
select FW_LOADER
|
||||
help
|
||||
Bluetooth firmware download driver.
|
||||
This driver loads the firmware into the Atheros Bluetooth
|
||||
chipset.
|
||||
|
||||
Say Y here to compile support for "Atheros firmware download driver"
|
||||
into the kernel or say M to compile it as module (ath3k).
|
||||
|
||||
endmenu
|
||||
|
@ -15,6 +15,7 @@ obj-$(CONFIG_BT_HCIBTUART) += btuart_cs.o
|
||||
obj-$(CONFIG_BT_HCIBTUSB) += btusb.o
|
||||
obj-$(CONFIG_BT_HCIBTSDIO) += btsdio.o
|
||||
|
||||
obj-$(CONFIG_BT_ATH3K) += ath3k.o
|
||||
obj-$(CONFIG_BT_MRVL) += btmrvl.o
|
||||
obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o
|
||||
|
||||
|
187
drivers/bluetooth/ath3k.c
Normal file
187
drivers/bluetooth/ath3k.c
Normal file
@ -0,0 +1,187 @@
|
||||
/*
|
||||
* Copyright (c) 2008-2009 Atheros Communications Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/usb.h>
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
|
||||
#define VERSION "1.0"
|
||||
|
||||
|
||||
static struct usb_device_id ath3k_table[] = {
|
||||
/* Atheros AR3011 */
|
||||
{ USB_DEVICE(0x0CF3, 0x3000) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, ath3k_table);
|
||||
|
||||
#define USB_REQ_DFU_DNLOAD 1
|
||||
#define BULK_SIZE 4096
|
||||
|
||||
struct ath3k_data {
|
||||
struct usb_device *udev;
|
||||
u8 *fw_data;
|
||||
u32 fw_size;
|
||||
u32 fw_sent;
|
||||
};
|
||||
|
||||
static int ath3k_load_firmware(struct ath3k_data *data,
|
||||
unsigned char *firmware,
|
||||
int count)
|
||||
{
|
||||
u8 *send_buf;
|
||||
int err, pipe, len, size, sent = 0;
|
||||
|
||||
BT_DBG("ath3k %p udev %p", data, data->udev);
|
||||
|
||||
pipe = usb_sndctrlpipe(data->udev, 0);
|
||||
|
||||
if ((usb_control_msg(data->udev, pipe,
|
||||
USB_REQ_DFU_DNLOAD,
|
||||
USB_TYPE_VENDOR, 0, 0,
|
||||
firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) {
|
||||
BT_ERR("Can't change to loading configuration err");
|
||||
return -EBUSY;
|
||||
}
|
||||
sent += 20;
|
||||
count -= 20;
|
||||
|
||||
send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC);
|
||||
if (!send_buf) {
|
||||
BT_ERR("Can't allocate memory chunk for firmware");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
while (count) {
|
||||
size = min_t(uint, count, BULK_SIZE);
|
||||
pipe = usb_sndbulkpipe(data->udev, 0x02);
|
||||
memcpy(send_buf, firmware + sent, size);
|
||||
|
||||
err = usb_bulk_msg(data->udev, pipe, send_buf, size,
|
||||
&len, 3000);
|
||||
|
||||
if (err || (len != size)) {
|
||||
BT_ERR("Error in firmware loading err = %d,"
|
||||
"len = %d, size = %d", err, len, size);
|
||||
goto error;
|
||||
}
|
||||
|
||||
sent += size;
|
||||
count -= size;
|
||||
}
|
||||
|
||||
kfree(send_buf);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
kfree(send_buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ath3k_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
const struct firmware *firmware;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct ath3k_data *data;
|
||||
int size;
|
||||
|
||||
BT_DBG("intf %p id %p", intf, id);
|
||||
|
||||
if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
|
||||
return -ENODEV;
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
data->udev = udev;
|
||||
|
||||
if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) {
|
||||
kfree(data);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
size = max_t(uint, firmware->size, 4096);
|
||||
data->fw_data = kmalloc(size, GFP_KERNEL);
|
||||
if (!data->fw_data) {
|
||||
release_firmware(firmware);
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(data->fw_data, firmware->data, firmware->size);
|
||||
data->fw_size = firmware->size;
|
||||
data->fw_sent = 0;
|
||||
release_firmware(firmware);
|
||||
|
||||
usb_set_intfdata(intf, data);
|
||||
if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) {
|
||||
usb_set_intfdata(intf, NULL);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath3k_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct ath3k_data *data = usb_get_intfdata(intf);
|
||||
|
||||
BT_DBG("ath3k_disconnect intf %p", intf);
|
||||
|
||||
kfree(data->fw_data);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static struct usb_driver ath3k_driver = {
|
||||
.name = "ath3k",
|
||||
.probe = ath3k_probe,
|
||||
.disconnect = ath3k_disconnect,
|
||||
.id_table = ath3k_table,
|
||||
};
|
||||
|
||||
static int __init ath3k_init(void)
|
||||
{
|
||||
BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION);
|
||||
return usb_register(&ath3k_driver);
|
||||
}
|
||||
|
||||
static void __exit ath3k_exit(void)
|
||||
{
|
||||
usb_deregister(&ath3k_driver);
|
||||
}
|
||||
|
||||
module_init(ath3k_init);
|
||||
module_exit(ath3k_exit);
|
||||
|
||||
MODULE_AUTHOR("Atheros Communications");
|
||||
MODULE_DESCRIPTION("Atheros AR30xx firmware driver");
|
||||
MODULE_VERSION(VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE("ath3k-1.fw");
|
@ -503,7 +503,9 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
|
||||
unsigned int iobase;
|
||||
unsigned char reg;
|
||||
|
||||
BUG_ON(!info->hdev);
|
||||
if (!info || !info->hdev)
|
||||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
if (!test_bit(CARD_READY, &(info->hw_state)))
|
||||
return IRQ_HANDLED;
|
||||
|
@ -345,7 +345,9 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
|
||||
int iir;
|
||||
irqreturn_t r = IRQ_NONE;
|
||||
|
||||
BUG_ON(!info->hdev);
|
||||
if (!info || !info->hdev)
|
||||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
|
||||
|
@ -295,7 +295,9 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst)
|
||||
int iir, lsr;
|
||||
irqreturn_t r = IRQ_NONE;
|
||||
|
||||
BUG_ON(!info->hdev);
|
||||
if (!info || !info->hdev)
|
||||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
|
||||
|
@ -299,7 +299,9 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst)
|
||||
int iir, lsr;
|
||||
irqreturn_t r = IRQ_NONE;
|
||||
|
||||
BUG_ON(!info->hdev);
|
||||
if (!info || !info->hdev)
|
||||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
|
||||
|
@ -395,6 +395,7 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
|
||||
unsigned long p = *ppos;
|
||||
ssize_t low_count, read, sz;
|
||||
char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
|
||||
int err = 0;
|
||||
|
||||
read = 0;
|
||||
if (p < (unsigned long) high_memory) {
|
||||
@ -441,12 +442,16 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
|
||||
return -ENOMEM;
|
||||
while (count > 0) {
|
||||
sz = size_inside_page(p, count);
|
||||
if (!is_vmalloc_or_module_addr((void *)p)) {
|
||||
err = -ENXIO;
|
||||
break;
|
||||
}
|
||||
sz = vread(kbuf, (char *)p, sz);
|
||||
if (!sz)
|
||||
break;
|
||||
if (copy_to_user(buf, kbuf, sz)) {
|
||||
free_page((unsigned long)kbuf);
|
||||
return -EFAULT;
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
count -= sz;
|
||||
buf += sz;
|
||||
@ -455,8 +460,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
|
||||
}
|
||||
free_page((unsigned long)kbuf);
|
||||
}
|
||||
*ppos = p;
|
||||
return read;
|
||||
*ppos = p;
|
||||
return read ? read : err;
|
||||
}
|
||||
|
||||
|
||||
@ -520,6 +525,7 @@ static ssize_t write_kmem(struct file * file, const char __user * buf,
|
||||
ssize_t wrote = 0;
|
||||
ssize_t virtr = 0;
|
||||
char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
|
||||
int err = 0;
|
||||
|
||||
if (p < (unsigned long) high_memory) {
|
||||
unsigned long to_write = min_t(unsigned long, count,
|
||||
@ -540,14 +546,16 @@ static ssize_t write_kmem(struct file * file, const char __user * buf,
|
||||
unsigned long sz = size_inside_page(p, count);
|
||||
unsigned long n;
|
||||
|
||||
if (!is_vmalloc_or_module_addr((void *)p)) {
|
||||
err = -ENXIO;
|
||||
break;
|
||||
}
|
||||
n = copy_from_user(kbuf, buf, sz);
|
||||
if (n) {
|
||||
if (wrote + virtr)
|
||||
break;
|
||||
free_page((unsigned long)kbuf);
|
||||
return -EFAULT;
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
sz = vwrite(kbuf, (char *)p, sz);
|
||||
vwrite(kbuf, (char *)p, sz);
|
||||
count -= sz;
|
||||
buf += sz;
|
||||
virtr += sz;
|
||||
@ -556,8 +564,8 @@ static ssize_t write_kmem(struct file * file, const char __user * buf,
|
||||
free_page((unsigned long)kbuf);
|
||||
}
|
||||
|
||||
*ppos = p;
|
||||
return virtr + wrote;
|
||||
*ppos = p;
|
||||
return virtr + wrote ? : err;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1051,12 +1051,6 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
|
||||
/* like a named pipe */
|
||||
}
|
||||
|
||||
/*
|
||||
* If we gave the user some bytes, update the access time.
|
||||
*/
|
||||
if (count)
|
||||
file_accessed(file);
|
||||
|
||||
return (count ? count : retval);
|
||||
}
|
||||
|
||||
@ -1107,7 +1101,6 @@ static ssize_t random_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
size_t ret;
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
|
||||
ret = write_pool(&blocking_pool, buffer, count);
|
||||
if (ret)
|
||||
@ -1116,8 +1109,6 @@ static ssize_t random_write(struct file *file, const char __user *buffer,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
inode->i_mtime = current_fs_time(inode->i_sb);
|
||||
mark_inode_dirty(inode);
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
|
@ -36,17 +36,6 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||
|
||||
static u32 cn_idx = CN_IDX_CONNECTOR;
|
||||
static u32 cn_val = CN_VAL_CONNECTOR;
|
||||
|
||||
module_param(cn_idx, uint, 0);
|
||||
module_param(cn_val, uint, 0);
|
||||
MODULE_PARM_DESC(cn_idx, "Connector's main device idx.");
|
||||
MODULE_PARM_DESC(cn_val, "Connector's main device val.");
|
||||
|
||||
static DEFINE_MUTEX(notify_lock);
|
||||
static LIST_HEAD(notify_list);
|
||||
|
||||
static struct cn_dev cdev;
|
||||
|
||||
static int cn_already_initialized;
|
||||
@ -209,54 +198,6 @@ static void cn_rx_skb(struct sk_buff *__skb)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Notification routing.
|
||||
*
|
||||
* Gets id and checks if there are notification request for it's idx
|
||||
* and val. If there are such requests notify the listeners with the
|
||||
* given notify event.
|
||||
*
|
||||
*/
|
||||
static void cn_notify(struct cb_id *id, u32 notify_event)
|
||||
{
|
||||
struct cn_ctl_entry *ent;
|
||||
|
||||
mutex_lock(¬ify_lock);
|
||||
list_for_each_entry(ent, ¬ify_list, notify_entry) {
|
||||
int i;
|
||||
struct cn_notify_req *req;
|
||||
struct cn_ctl_msg *ctl = ent->msg;
|
||||
int idx_found, val_found;
|
||||
|
||||
idx_found = val_found = 0;
|
||||
|
||||
req = (struct cn_notify_req *)ctl->data;
|
||||
for (i = 0; i < ctl->idx_notify_num; ++i, ++req) {
|
||||
if (id->idx >= req->first &&
|
||||
id->idx < req->first + req->range) {
|
||||
idx_found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ctl->val_notify_num; ++i, ++req) {
|
||||
if (id->val >= req->first &&
|
||||
id->val < req->first + req->range) {
|
||||
val_found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx_found && val_found) {
|
||||
struct cn_msg m = { .ack = notify_event, };
|
||||
|
||||
memcpy(&m.id, id, sizeof(m.id));
|
||||
cn_netlink_send(&m, ctl->group, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
mutex_unlock(¬ify_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback add routing - adds callback with given ID and name.
|
||||
* If there is registered callback with the same ID it will not be added.
|
||||
@ -276,8 +217,6 @@ int cn_add_callback(struct cb_id *id, char *name,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cn_notify(id, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cn_add_callback);
|
||||
@ -295,111 +234,9 @@ void cn_del_callback(struct cb_id *id)
|
||||
struct cn_dev *dev = &cdev;
|
||||
|
||||
cn_queue_del_callback(dev->cbdev, id);
|
||||
cn_notify(id, 1);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cn_del_callback);
|
||||
|
||||
/*
|
||||
* Checks two connector's control messages to be the same.
|
||||
* Returns 1 if they are the same or if the first one is corrupted.
|
||||
*/
|
||||
static int cn_ctl_msg_equals(struct cn_ctl_msg *m1, struct cn_ctl_msg *m2)
|
||||
{
|
||||
int i;
|
||||
struct cn_notify_req *req1, *req2;
|
||||
|
||||
if (m1->idx_notify_num != m2->idx_notify_num)
|
||||
return 0;
|
||||
|
||||
if (m1->val_notify_num != m2->val_notify_num)
|
||||
return 0;
|
||||
|
||||
if (m1->len != m2->len)
|
||||
return 0;
|
||||
|
||||
if ((m1->idx_notify_num + m1->val_notify_num) * sizeof(*req1) !=
|
||||
m1->len)
|
||||
return 1;
|
||||
|
||||
req1 = (struct cn_notify_req *)m1->data;
|
||||
req2 = (struct cn_notify_req *)m2->data;
|
||||
|
||||
for (i = 0; i < m1->idx_notify_num; ++i) {
|
||||
if (req1->first != req2->first || req1->range != req2->range)
|
||||
return 0;
|
||||
req1++;
|
||||
req2++;
|
||||
}
|
||||
|
||||
for (i = 0; i < m1->val_notify_num; ++i) {
|
||||
if (req1->first != req2->first || req1->range != req2->range)
|
||||
return 0;
|
||||
req1++;
|
||||
req2++;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main connector device's callback.
|
||||
*
|
||||
* Used for notification of a request's processing.
|
||||
*/
|
||||
static void cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
|
||||
{
|
||||
struct cn_ctl_msg *ctl;
|
||||
struct cn_ctl_entry *ent;
|
||||
u32 size;
|
||||
|
||||
if (msg->len < sizeof(*ctl))
|
||||
return;
|
||||
|
||||
ctl = (struct cn_ctl_msg *)msg->data;
|
||||
|
||||
size = (sizeof(*ctl) + ((ctl->idx_notify_num +
|
||||
ctl->val_notify_num) *
|
||||
sizeof(struct cn_notify_req)));
|
||||
|
||||
if (msg->len != size)
|
||||
return;
|
||||
|
||||
if (ctl->len + sizeof(*ctl) != msg->len)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Remove notification.
|
||||
*/
|
||||
if (ctl->group == 0) {
|
||||
struct cn_ctl_entry *n;
|
||||
|
||||
mutex_lock(¬ify_lock);
|
||||
list_for_each_entry_safe(ent, n, ¬ify_list, notify_entry) {
|
||||
if (cn_ctl_msg_equals(ent->msg, ctl)) {
|
||||
list_del(&ent->notify_entry);
|
||||
kfree(ent);
|
||||
}
|
||||
}
|
||||
mutex_unlock(¬ify_lock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
size += sizeof(*ent);
|
||||
|
||||
ent = kzalloc(size, GFP_KERNEL);
|
||||
if (!ent)
|
||||
return;
|
||||
|
||||
ent->msg = (struct cn_ctl_msg *)(ent + 1);
|
||||
|
||||
memcpy(ent->msg, ctl, size - sizeof(*ent));
|
||||
|
||||
mutex_lock(¬ify_lock);
|
||||
list_add(&ent->notify_entry, ¬ify_list);
|
||||
mutex_unlock(¬ify_lock);
|
||||
}
|
||||
|
||||
static int cn_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct cn_queue_dev *dev = cdev.cbdev;
|
||||
@ -437,11 +274,8 @@ static const struct file_operations cn_file_ops = {
|
||||
static int __devinit cn_init(void)
|
||||
{
|
||||
struct cn_dev *dev = &cdev;
|
||||
int err;
|
||||
|
||||
dev->input = cn_rx_skb;
|
||||
dev->id.idx = cn_idx;
|
||||
dev->id.val = cn_val;
|
||||
|
||||
dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR,
|
||||
CN_NETLINK_USERS + 0xf,
|
||||
@ -457,14 +291,6 @@ static int __devinit cn_init(void)
|
||||
|
||||
cn_already_initialized = 1;
|
||||
|
||||
err = cn_add_callback(&dev->id, "connector", &cn_callback);
|
||||
if (err) {
|
||||
cn_already_initialized = 0;
|
||||
cn_queue_free_dev(dev->cbdev);
|
||||
netlink_kernel_release(dev->nls);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops);
|
||||
|
||||
return 0;
|
||||
@ -478,7 +304,6 @@ static void __devexit cn_fini(void)
|
||||
|
||||
proc_net_remove(&init_net, "connector");
|
||||
|
||||
cn_del_callback(&dev->id);
|
||||
cn_queue_free_dev(dev->cbdev);
|
||||
netlink_kernel_release(dev->nls);
|
||||
}
|
||||
|
@ -57,6 +57,23 @@ static int padlock_sha_update(struct shash_desc *desc,
|
||||
return crypto_shash_update(&dctx->fallback, data, length);
|
||||
}
|
||||
|
||||
static int padlock_sha_export(struct shash_desc *desc, void *out)
|
||||
{
|
||||
struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
|
||||
|
||||
return crypto_shash_export(&dctx->fallback, out);
|
||||
}
|
||||
|
||||
static int padlock_sha_import(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
|
||||
struct padlock_sha_ctx *ctx = crypto_shash_ctx(desc->tfm);
|
||||
|
||||
dctx->fallback.tfm = ctx->fallback;
|
||||
dctx->fallback.flags = desc->flags & CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
return crypto_shash_import(&dctx->fallback, in);
|
||||
}
|
||||
|
||||
static inline void padlock_output_block(uint32_t *src,
|
||||
uint32_t *dst, size_t count)
|
||||
{
|
||||
@ -235,7 +252,10 @@ static struct shash_alg sha1_alg = {
|
||||
.update = padlock_sha_update,
|
||||
.finup = padlock_sha1_finup,
|
||||
.final = padlock_sha1_final,
|
||||
.export = padlock_sha_export,
|
||||
.import = padlock_sha_import,
|
||||
.descsize = sizeof(struct padlock_sha_desc),
|
||||
.statesize = sizeof(struct sha1_state),
|
||||
.base = {
|
||||
.cra_name = "sha1",
|
||||
.cra_driver_name = "sha1-padlock",
|
||||
@ -256,7 +276,10 @@ static struct shash_alg sha256_alg = {
|
||||
.update = padlock_sha_update,
|
||||
.finup = padlock_sha256_finup,
|
||||
.final = padlock_sha256_final,
|
||||
.export = padlock_sha_export,
|
||||
.import = padlock_sha_import,
|
||||
.descsize = sizeof(struct padlock_sha_desc),
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.base = {
|
||||
.cra_name = "sha256",
|
||||
.cra_driver_name = "sha256-padlock",
|
||||
|
@ -1333,9 +1333,9 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
|
||||
|
||||
DEB_CAP(("vbuf:%p\n",vb));
|
||||
|
||||
release_all_pagetables(dev, buf);
|
||||
|
||||
saa7146_dma_free(dev,q,buf);
|
||||
|
||||
release_all_pagetables(dev, buf);
|
||||
}
|
||||
|
||||
static struct videobuf_queue_ops video_qops = {
|
||||
|
@ -93,9 +93,9 @@ static int ts_open(struct file *file)
|
||||
dprintk("open dev=%s\n", video_device_node_name(vdev));
|
||||
err = -EBUSY;
|
||||
if (!mutex_trylock(&dev->empress_tsq.vb_lock))
|
||||
goto done;
|
||||
return err;
|
||||
if (atomic_read(&dev->empress_users))
|
||||
goto done_up;
|
||||
goto done;
|
||||
|
||||
/* Unmute audio */
|
||||
saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
|
||||
@ -105,10 +105,8 @@ static int ts_open(struct file *file)
|
||||
file->private_data = dev;
|
||||
err = 0;
|
||||
|
||||
done_up:
|
||||
mutex_unlock(&dev->empress_tsq.vb_lock);
|
||||
done:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dev->empress_tsq.vb_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -276,8 +276,13 @@ struct be_adapter {
|
||||
int link_speed;
|
||||
u8 port_type;
|
||||
u8 transceiver;
|
||||
u8 generation; /* BladeEngine ASIC generation */
|
||||
};
|
||||
|
||||
/* BladeEngine Generation numbers */
|
||||
#define BE_GEN2 2
|
||||
#define BE_GEN3 3
|
||||
|
||||
extern const struct ethtool_ops be_ethtool_ops;
|
||||
|
||||
#define drvr_stats(adapter) (&adapter->stats.drvr_stats)
|
||||
|
@ -164,7 +164,8 @@ struct be_cmd_req_hdr {
|
||||
u8 domain; /* dword 0 */
|
||||
u32 timeout; /* dword 1 */
|
||||
u32 request_length; /* dword 2 */
|
||||
u32 rsvd; /* dword 3 */
|
||||
u8 version; /* dword 3 */
|
||||
u8 rsvd[3]; /* dword 3 */
|
||||
};
|
||||
|
||||
#define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */
|
||||
|
@ -1350,7 +1350,7 @@ static irqreturn_t be_intx(int irq, void *dev)
|
||||
int isr;
|
||||
|
||||
isr = ioread32(adapter->csr + CEV_ISR0_OFFSET +
|
||||
be_pci_func(adapter) * CEV_ISR_SIZE);
|
||||
(adapter->tx_eq.q.id/ 8) * CEV_ISR_SIZE);
|
||||
if (!isr)
|
||||
return IRQ_NONE;
|
||||
|
||||
@ -2051,6 +2051,7 @@ static void be_unmap_pci_bars(struct be_adapter *adapter)
|
||||
static int be_map_pci_bars(struct be_adapter *adapter)
|
||||
{
|
||||
u8 __iomem *addr;
|
||||
int pcicfg_reg;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2),
|
||||
pci_resource_len(adapter->pdev, 2));
|
||||
@ -2064,8 +2065,13 @@ static int be_map_pci_bars(struct be_adapter *adapter)
|
||||
goto pci_map_err;
|
||||
adapter->db = addr;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1),
|
||||
pci_resource_len(adapter->pdev, 1));
|
||||
if (adapter->generation == BE_GEN2)
|
||||
pcicfg_reg = 1;
|
||||
else
|
||||
pcicfg_reg = 0;
|
||||
|
||||
addr = ioremap_nocache(pci_resource_start(adapter->pdev, pcicfg_reg),
|
||||
pci_resource_len(adapter->pdev, pcicfg_reg));
|
||||
if (addr == NULL)
|
||||
goto pci_map_err;
|
||||
adapter->pcicfg = addr;
|
||||
@ -2162,6 +2168,7 @@ static int be_stats_init(struct be_adapter *adapter)
|
||||
cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma);
|
||||
if (cmd->va == NULL)
|
||||
return -1;
|
||||
memset(cmd->va, 0, cmd->size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2240,6 +2247,20 @@ static int __devinit be_probe(struct pci_dev *pdev,
|
||||
goto rel_reg;
|
||||
}
|
||||
adapter = netdev_priv(netdev);
|
||||
|
||||
switch (pdev->device) {
|
||||
case BE_DEVICE_ID1:
|
||||
case OC_DEVICE_ID1:
|
||||
adapter->generation = BE_GEN2;
|
||||
break;
|
||||
case BE_DEVICE_ID2:
|
||||
case OC_DEVICE_ID2:
|
||||
adapter->generation = BE_GEN3;
|
||||
break;
|
||||
default:
|
||||
adapter->generation = 0;
|
||||
}
|
||||
|
||||
adapter->pdev = pdev;
|
||||
pci_set_drvdata(pdev, adapter);
|
||||
adapter->netdev = netdev;
|
||||
|
@ -3639,7 +3639,7 @@ static int bond_open(struct net_device *bond_dev)
|
||||
*/
|
||||
if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) {
|
||||
/* something went wrong - fail the open operation */
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor);
|
||||
|
@ -2117,6 +2117,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter,
|
||||
/* set time_stamp *before* dma to help avoid a possible race */
|
||||
buffer_info->time_stamp = jiffies;
|
||||
buffer_info->next_to_watch = i;
|
||||
buffer_info->mapped_as_page = false;
|
||||
buffer_info->dma = pci_map_single(pdev, skb->data, len,
|
||||
PCI_DMA_TODEVICE);
|
||||
if (pci_dma_mapping_error(pdev, buffer_info->dma))
|
||||
|
@ -223,7 +223,7 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id,
|
||||
|
||||
if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] !=
|
||||
adapter->dcb_cfg.bw_percentage[0][bwg_id]) {
|
||||
adapter->dcb_set_bitmap |= BIT_PG_RX;
|
||||
adapter->dcb_set_bitmap |= BIT_PG_TX;
|
||||
adapter->dcb_set_bitmap |= BIT_RESETLINK;
|
||||
}
|
||||
}
|
||||
@ -341,6 +341,12 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
||||
if (!adapter->dcb_set_bitmap)
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
|
||||
adapter->ring_feature[RING_F_DCB].indices);
|
||||
|
||||
if (ret)
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
/*
|
||||
* Only take down the adapter if the configuration change
|
||||
* requires a reset.
|
||||
@ -359,14 +365,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
||||
}
|
||||
}
|
||||
|
||||
ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
|
||||
adapter->ring_feature[RING_F_DCB].indices);
|
||||
if (ret) {
|
||||
if (adapter->dcb_set_bitmap & BIT_RESETLINK)
|
||||
clear_bit(__IXGBE_RESETTING, &adapter->state);
|
||||
return DCB_NO_HW_CHG;
|
||||
}
|
||||
|
||||
if (adapter->dcb_cfg.pfc_mode_enable) {
|
||||
if ((adapter->hw.mac.type != ixgbe_mac_82598EB) &&
|
||||
(adapter->hw.fc.current_mode != ixgbe_fc_pfc))
|
||||
|
@ -854,8 +854,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks)
|
||||
|
||||
static irqreturn_t ks_irq(int irq, void *pw)
|
||||
{
|
||||
struct ks_net *ks = pw;
|
||||
struct net_device *netdev = ks->netdev;
|
||||
struct net_device *netdev = pw;
|
||||
struct ks_net *ks = netdev_priv(netdev);
|
||||
u16 status;
|
||||
|
||||
/*this should be the first in IRQ handler */
|
||||
|
@ -1063,7 +1063,7 @@ static int netdev_open(struct net_device *dev)
|
||||
if (retval) {
|
||||
printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
|
||||
FIRMWARE_RX);
|
||||
return retval;
|
||||
goto out_init;
|
||||
}
|
||||
if (fw_rx->size % 4) {
|
||||
printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
|
||||
@ -1108,6 +1108,9 @@ out_tx:
|
||||
release_firmware(fw_tx);
|
||||
out_rx:
|
||||
release_firmware(fw_rx);
|
||||
out_init:
|
||||
if (retval)
|
||||
netdev_close(dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -419,7 +419,7 @@ static int cdc_manage_power(struct usbnet *dev, int on)
|
||||
|
||||
static const struct driver_info cdc_info = {
|
||||
.description = "CDC Ethernet Device",
|
||||
.flags = FLAG_ETHER | FLAG_LINK_INTR,
|
||||
.flags = FLAG_ETHER,
|
||||
// .check_connect = cdc_check_connect,
|
||||
.bind = cdc_bind,
|
||||
.unbind = usbnet_cdc_unbind,
|
||||
|
@ -855,12 +855,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
|
||||
}
|
||||
}
|
||||
|
||||
static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah)
|
||||
static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah)
|
||||
{
|
||||
u32 i, j;
|
||||
|
||||
if ((ah->hw_version.devid == AR9280_DEVID_PCI) &&
|
||||
test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) {
|
||||
if (ah->hw_version.devid == AR9280_DEVID_PCI) {
|
||||
|
||||
/* EEPROM Fixup */
|
||||
for (i = 0; i < ah->iniModes.ia_rows; i++) {
|
||||
@ -980,7 +979,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
ath9k_hw_init_11a_eeprom_fix(ah);
|
||||
ath9k_hw_init_eeprom_fix(ah);
|
||||
|
||||
r = ath9k_hw_init_macaddr(ah);
|
||||
if (r) {
|
||||
|
@ -2655,10 +2655,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
||||
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
|
||||
ath9k_ps_wakeup(sc);
|
||||
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
|
||||
ath_beacon_return(sc, avp);
|
||||
ath9k_ps_restore(sc);
|
||||
}
|
||||
|
||||
ath_beacon_return(sc, avp);
|
||||
sc->sc_flags &= ~SC_OP_BEACONS;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
|
||||
|
@ -297,7 +297,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags,
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_add_station);
|
||||
|
||||
static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr)
|
||||
static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const u8 *addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 sta_id = iwl_find_station(priv, addr);
|
||||
@ -324,7 +324,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv,
|
||||
{
|
||||
struct iwl_rem_sta_cmd *rm_sta =
|
||||
(struct iwl_rem_sta_cmd *)cmd->cmd.payload;
|
||||
const char *addr = rm_sta->addr;
|
||||
const u8 *addr = rm_sta->addr;
|
||||
|
||||
if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
|
@ -376,20 +376,22 @@ static int __devinit fm3130_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
/* Disabling calibration mode */
|
||||
if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL)
|
||||
if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) {
|
||||
i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
|
||||
fm3130->regs[FM3130_RTC_CONTROL] &
|
||||
~(FM3130_RTC_CONTROL_BIT_CAL));
|
||||
dev_warn(&client->dev, "Disabling calibration mode!\n");
|
||||
}
|
||||
|
||||
/* Disabling read and write modes */
|
||||
if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE ||
|
||||
fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ)
|
||||
fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) {
|
||||
i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL,
|
||||
fm3130->regs[FM3130_RTC_CONTROL] &
|
||||
~(FM3130_RTC_CONTROL_BIT_READ |
|
||||
FM3130_RTC_CONTROL_BIT_WRITE));
|
||||
dev_warn(&client->dev, "Disabling READ or WRITE mode!\n");
|
||||
}
|
||||
|
||||
/* oscillator off? turn it on, so clock can tick. */
|
||||
if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN)
|
||||
|
@ -394,7 +394,7 @@ static void ulite_console_write(struct console *co, const char *s,
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
static int __init ulite_console_setup(struct console *co, char *options)
|
||||
static int __devinit ulite_console_setup(struct console *co, char *options)
|
||||
{
|
||||
struct uart_port *port;
|
||||
int baud = 9600;
|
||||
|
@ -35,7 +35,9 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#include "../core/hcd.h"
|
||||
#include "r8a66597.h"
|
||||
@ -820,6 +822,26 @@ static void enable_r8a66597_pipe(struct r8a66597 *r8a66597, struct urb *urb,
|
||||
enable_r8a66597_pipe_dma(r8a66597, dev, pipe, urb);
|
||||
}
|
||||
|
||||
static void r8a66597_urb_done(struct r8a66597 *r8a66597, struct urb *urb,
|
||||
int status)
|
||||
__releases(r8a66597->lock)
|
||||
__acquires(r8a66597->lock)
|
||||
{
|
||||
if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
|
||||
void *ptr;
|
||||
|
||||
for (ptr = urb->transfer_buffer;
|
||||
ptr < urb->transfer_buffer + urb->transfer_buffer_length;
|
||||
ptr += PAGE_SIZE)
|
||||
flush_dcache_page(virt_to_page(ptr));
|
||||
}
|
||||
|
||||
usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb);
|
||||
spin_unlock(&r8a66597->lock);
|
||||
usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb, status);
|
||||
spin_lock(&r8a66597->lock);
|
||||
}
|
||||
|
||||
/* this function must be called with interrupt disabled */
|
||||
static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address)
|
||||
{
|
||||
@ -838,15 +860,9 @@ static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address)
|
||||
list_del(&td->queue);
|
||||
kfree(td);
|
||||
|
||||
if (urb) {
|
||||
usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597),
|
||||
urb);
|
||||
if (urb)
|
||||
r8a66597_urb_done(r8a66597, urb, -ENODEV);
|
||||
|
||||
spin_unlock(&r8a66597->lock);
|
||||
usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb,
|
||||
-ENODEV);
|
||||
spin_lock(&r8a66597->lock);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1006,6 +1022,8 @@ static void start_root_hub_sampling(struct r8a66597 *r8a66597, int port,
|
||||
/* this function must be called with interrupt disabled */
|
||||
static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port,
|
||||
u16 syssts)
|
||||
__releases(r8a66597->lock)
|
||||
__acquires(r8a66597->lock)
|
||||
{
|
||||
if (syssts == SE0) {
|
||||
r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port));
|
||||
@ -1023,7 +1041,9 @@ static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port,
|
||||
usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597));
|
||||
}
|
||||
|
||||
spin_unlock(&r8a66597->lock);
|
||||
usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597));
|
||||
spin_lock(&r8a66597->lock);
|
||||
}
|
||||
|
||||
/* this function must be called with interrupt disabled */
|
||||
@ -1283,10 +1303,7 @@ __releases(r8a66597->lock) __acquires(r8a66597->lock)
|
||||
if (usb_pipeisoc(urb->pipe))
|
||||
urb->start_frame = r8a66597_get_frame(hcd);
|
||||
|
||||
usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb);
|
||||
spin_unlock(&r8a66597->lock);
|
||||
usb_hcd_giveback_urb(hcd, urb, status);
|
||||
spin_lock(&r8a66597->lock);
|
||||
r8a66597_urb_done(r8a66597, urb, status);
|
||||
}
|
||||
|
||||
if (restart) {
|
||||
|
@ -593,7 +593,8 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
|
||||
*/
|
||||
static int imxfb_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
struct imxfb_info *fbi = platform_get_drvdata(dev);
|
||||
struct fb_info *info = platform_get_drvdata(dev);
|
||||
struct imxfb_info *fbi = info->par;
|
||||
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
@ -603,7 +604,8 @@ static int imxfb_suspend(struct platform_device *dev, pm_message_t state)
|
||||
|
||||
static int imxfb_resume(struct platform_device *dev)
|
||||
{
|
||||
struct imxfb_info *fbi = platform_get_drvdata(dev);
|
||||
struct fb_info *info = platform_get_drvdata(dev);
|
||||
struct imxfb_info *fbi = info->par;
|
||||
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
|
@ -324,8 +324,11 @@ static void sdc_enable_channel(struct mx3fb_info *mx3_fbi)
|
||||
unsigned long flags;
|
||||
dma_cookie_t cookie;
|
||||
|
||||
dev_dbg(mx3fb->dev, "mx3fbi %p, desc %p, sg %p\n", mx3_fbi,
|
||||
to_tx_desc(mx3_fbi->txd), to_tx_desc(mx3_fbi->txd)->sg);
|
||||
if (mx3_fbi->txd)
|
||||
dev_dbg(mx3fb->dev, "mx3fbi %p, desc %p, sg %p\n", mx3_fbi,
|
||||
to_tx_desc(mx3_fbi->txd), to_tx_desc(mx3_fbi->txd)->sg);
|
||||
else
|
||||
dev_dbg(mx3fb->dev, "mx3fbi %p, txd = NULL\n", mx3_fbi);
|
||||
|
||||
/* This enables the channel */
|
||||
if (mx3_fbi->cookie < 0) {
|
||||
@ -646,6 +649,7 @@ static int sdc_set_global_alpha(struct mx3fb_data *mx3fb, bool enable, uint8_t a
|
||||
|
||||
static void sdc_set_brightness(struct mx3fb_data *mx3fb, uint8_t value)
|
||||
{
|
||||
dev_dbg(mx3fb->dev, "%s: value = %d\n", __func__, value);
|
||||
/* This might be board-specific */
|
||||
mx3fb_write_reg(mx3fb, 0x03000000UL | value << 16, SDC_PWM_CTRL);
|
||||
return;
|
||||
@ -1486,12 +1490,12 @@ static int mx3fb_probe(struct platform_device *pdev)
|
||||
goto ersdc0;
|
||||
}
|
||||
|
||||
mx3fb->backlight_level = 255;
|
||||
|
||||
ret = init_fb_chan(mx3fb, to_idmac_chan(chan));
|
||||
if (ret < 0)
|
||||
goto eisdc0;
|
||||
|
||||
mx3fb->backlight_level = 255;
|
||||
|
||||
return 0;
|
||||
|
||||
eisdc0:
|
||||
|
@ -61,7 +61,7 @@ static inline unsigned int vecs_to_idx(unsigned int nr)
|
||||
|
||||
static inline int use_bip_pool(unsigned int idx)
|
||||
{
|
||||
if (idx == BIOVEC_NR_POOLS)
|
||||
if (idx == BIOVEC_MAX_IDX)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -95,6 +95,7 @@ struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio,
|
||||
|
||||
/* Use mempool if lower order alloc failed or max vecs were requested */
|
||||
if (bip == NULL) {
|
||||
idx = BIOVEC_MAX_IDX; /* so we free the payload properly later */
|
||||
bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask);
|
||||
|
||||
if (unlikely(bip == NULL)) {
|
||||
|
7
fs/bio.c
7
fs/bio.c
@ -542,13 +542,18 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
|
||||
|
||||
if (page == prev->bv_page &&
|
||||
offset == prev->bv_offset + prev->bv_len) {
|
||||
unsigned int prev_bv_len = prev->bv_len;
|
||||
prev->bv_len += len;
|
||||
|
||||
if (q->merge_bvec_fn) {
|
||||
struct bvec_merge_data bvm = {
|
||||
/* prev_bvec is already charged in
|
||||
bi_size, discharge it in order to
|
||||
simulate merging updated prev_bvec
|
||||
as new bvec. */
|
||||
.bi_bdev = bio->bi_bdev,
|
||||
.bi_sector = bio->bi_sector,
|
||||
.bi_size = bio->bi_size,
|
||||
.bi_size = bio->bi_size - prev_bv_len,
|
||||
.bi_rw = bio->bi_rw,
|
||||
};
|
||||
|
||||
|
10
fs/exec.c
10
fs/exec.c
@ -961,6 +961,11 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
goto out;
|
||||
|
||||
bprm->mm = NULL; /* We're using it now */
|
||||
|
||||
current->flags &= ~PF_RANDOMIZE;
|
||||
flush_thread();
|
||||
current->personality &= ~bprm->per_clear;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
@ -997,9 +1002,6 @@ void setup_new_exec(struct linux_binprm * bprm)
|
||||
tcomm[i] = '\0';
|
||||
set_task_comm(current, tcomm);
|
||||
|
||||
current->flags &= ~PF_RANDOMIZE;
|
||||
flush_thread();
|
||||
|
||||
/* Set the new mm task size. We have to do that late because it may
|
||||
* depend on TIF_32BIT which is only updated in flush_thread() on
|
||||
* some architectures like powerpc
|
||||
@ -1015,8 +1017,6 @@ void setup_new_exec(struct linux_binprm * bprm)
|
||||
set_dumpable(current->mm, suid_dumpable);
|
||||
}
|
||||
|
||||
current->personality &= ~bprm->per_clear;
|
||||
|
||||
/*
|
||||
* Flush performance counters when crossing a
|
||||
* security domain:
|
||||
|
@ -828,6 +828,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_req *req,
|
||||
if (!page)
|
||||
break;
|
||||
|
||||
if (mapping_writably_mapped(mapping))
|
||||
flush_dcache_page(page);
|
||||
|
||||
pagefault_disable();
|
||||
tmp = iov_iter_copy_from_user_atomic(page, ii, offset, bytes);
|
||||
pagefault_enable();
|
||||
|
@ -769,6 +769,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
|
||||
if (!gl)
|
||||
return -ENOMEM;
|
||||
|
||||
atomic_inc(&sdp->sd_glock_disposal);
|
||||
gl->gl_flags = 0;
|
||||
gl->gl_name = name;
|
||||
atomic_set(&gl->gl_ref, 1);
|
||||
@ -1538,6 +1539,9 @@ void gfs2_gl_hash_clear(struct gfs2_sbd *sdp)
|
||||
up_write(&gfs2_umount_flush_sem);
|
||||
msleep(10);
|
||||
}
|
||||
flush_workqueue(glock_workqueue);
|
||||
wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0);
|
||||
gfs2_dump_lockstate(sdp);
|
||||
}
|
||||
|
||||
void gfs2_glock_finish_truncate(struct gfs2_inode *ip)
|
||||
|
@ -123,7 +123,7 @@ struct lm_lockops {
|
||||
int (*lm_mount) (struct gfs2_sbd *sdp, const char *fsname);
|
||||
void (*lm_unmount) (struct gfs2_sbd *sdp);
|
||||
void (*lm_withdraw) (struct gfs2_sbd *sdp);
|
||||
void (*lm_put_lock) (struct kmem_cache *cachep, void *gl);
|
||||
void (*lm_put_lock) (struct kmem_cache *cachep, struct gfs2_glock *gl);
|
||||
unsigned int (*lm_lock) (struct gfs2_glock *gl,
|
||||
unsigned int req_state, unsigned int flags);
|
||||
void (*lm_cancel) (struct gfs2_glock *gl);
|
||||
|
@ -544,6 +544,8 @@ struct gfs2_sbd {
|
||||
struct gfs2_holder sd_live_gh;
|
||||
struct gfs2_glock *sd_rename_gl;
|
||||
struct gfs2_glock *sd_trans_gl;
|
||||
wait_queue_head_t sd_glock_wait;
|
||||
atomic_t sd_glock_disposal;
|
||||
|
||||
/* Inode Stuff */
|
||||
|
||||
|
@ -21,6 +21,7 @@ static void gdlm_ast(void *arg)
|
||||
{
|
||||
struct gfs2_glock *gl = arg;
|
||||
unsigned ret = gl->gl_state;
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
|
||||
BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
|
||||
|
||||
@ -30,6 +31,8 @@ static void gdlm_ast(void *arg)
|
||||
switch (gl->gl_lksb.sb_status) {
|
||||
case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */
|
||||
kmem_cache_free(gfs2_glock_cachep, gl);
|
||||
if (atomic_dec_and_test(&sdp->sd_glock_disposal))
|
||||
wake_up(&sdp->sd_glock_wait);
|
||||
return;
|
||||
case -DLM_ECANCEL: /* Cancel while getting lock */
|
||||
ret |= LM_OUT_CANCELED;
|
||||
@ -164,14 +167,16 @@ static unsigned int gdlm_lock(struct gfs2_glock *gl,
|
||||
return LM_OUT_ASYNC;
|
||||
}
|
||||
|
||||
static void gdlm_put_lock(struct kmem_cache *cachep, void *ptr)
|
||||
static void gdlm_put_lock(struct kmem_cache *cachep, struct gfs2_glock *gl)
|
||||
{
|
||||
struct gfs2_glock *gl = ptr;
|
||||
struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
struct lm_lockstruct *ls = &sdp->sd_lockstruct;
|
||||
int error;
|
||||
|
||||
if (gl->gl_lksb.sb_lkid == 0) {
|
||||
kmem_cache_free(cachep, gl);
|
||||
if (atomic_dec_and_test(&sdp->sd_glock_disposal))
|
||||
wake_up(&sdp->sd_glock_wait);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -82,6 +82,8 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
|
||||
|
||||
gfs2_tune_init(&sdp->sd_tune);
|
||||
|
||||
init_waitqueue_head(&sdp->sd_glock_wait);
|
||||
atomic_set(&sdp->sd_glock_disposal, 0);
|
||||
spin_lock_init(&sdp->sd_statfs_spin);
|
||||
|
||||
spin_lock_init(&sdp->sd_rindex_spin);
|
||||
@ -983,9 +985,17 @@ static const match_table_t nolock_tokens = {
|
||||
{ Opt_err, NULL },
|
||||
};
|
||||
|
||||
static void nolock_put_lock(struct kmem_cache *cachep, struct gfs2_glock *gl)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
kmem_cache_free(cachep, gl);
|
||||
if (atomic_dec_and_test(&sdp->sd_glock_disposal))
|
||||
wake_up(&sdp->sd_glock_wait);
|
||||
}
|
||||
|
||||
static const struct lm_lockops nolock_ops = {
|
||||
.lm_proto_name = "lock_nolock",
|
||||
.lm_put_lock = kmem_cache_free,
|
||||
.lm_put_lock = nolock_put_lock,
|
||||
.lm_tokens = &nolock_tokens,
|
||||
};
|
||||
|
||||
|
@ -1088,7 +1088,8 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
error = vfs_follow_link(nd, buf);
|
||||
if (buf != array)
|
||||
kfree(buf);
|
||||
}
|
||||
} else
|
||||
path_put(&nd->path);
|
||||
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
@ -591,11 +591,7 @@ static int gfs2_ri_update(struct gfs2_inode *ip)
|
||||
u64 rgrp_count = ip->i_disksize;
|
||||
int error;
|
||||
|
||||
if (do_div(rgrp_count, sizeof(struct gfs2_rindex))) {
|
||||
gfs2_consist_inode(ip);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
do_div(rgrp_count, sizeof(struct gfs2_rindex));
|
||||
clear_rgrpdi(sdp);
|
||||
|
||||
file_ra_state_init(&ra_state, inode->i_mapping);
|
||||
@ -915,7 +911,7 @@ void gfs2_rgrp_repolish_clones(struct gfs2_rgrpd *rgd)
|
||||
struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip)
|
||||
{
|
||||
BUG_ON(ip->i_alloc != NULL);
|
||||
ip->i_alloc = kzalloc(sizeof(struct gfs2_alloc), GFP_KERNEL);
|
||||
ip->i_alloc = kzalloc(sizeof(struct gfs2_alloc), GFP_NOFS);
|
||||
return ip->i_alloc;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/gfs2_ondisk.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include "gfs2.h"
|
||||
#include "incore.h"
|
||||
|
@ -486,6 +486,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
|
||||
{
|
||||
dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
|
||||
|
||||
if (gfp & __GFP_WAIT)
|
||||
nfs_wb_page(page->mapping->host, page);
|
||||
/* If PagePrivate() is set, then the page is not freeable */
|
||||
if (PagePrivate(page))
|
||||
return 0;
|
||||
|
@ -1261,8 +1261,10 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
|
||||
if (fattr->valid & NFS_ATTR_FATTR_MODE) {
|
||||
if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) {
|
||||
umode_t newmode = inode->i_mode & S_IFMT;
|
||||
newmode |= fattr->mode & S_IALLUGO;
|
||||
inode->i_mode = newmode;
|
||||
invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
|
||||
inode->i_mode = fattr->mode;
|
||||
}
|
||||
} else if (server->caps & NFS_CAP_MODE)
|
||||
invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
|
||||
|
@ -146,6 +146,7 @@ enum {
|
||||
NFS_O_RDWR_STATE, /* OPEN stateid has read/write state */
|
||||
NFS_STATE_RECLAIM_REBOOT, /* OPEN stateid server rebooted */
|
||||
NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to recover state */
|
||||
NFS_STATE_POSIX_LOCKS, /* Posix locks are supported */
|
||||
};
|
||||
|
||||
struct nfs4_state {
|
||||
@ -277,6 +278,7 @@ extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t);
|
||||
extern void nfs4_schedule_state_recovery(struct nfs_client *);
|
||||
extern void nfs4_schedule_state_manager(struct nfs_client *);
|
||||
extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state);
|
||||
extern int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state);
|
||||
extern void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags);
|
||||
extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp);
|
||||
extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
|
||||
|
@ -249,19 +249,15 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
|
||||
if (state == NULL)
|
||||
break;
|
||||
nfs4_state_mark_reclaim_nograce(clp, state);
|
||||
case -NFS4ERR_STALE_CLIENTID:
|
||||
goto do_state_recovery;
|
||||
case -NFS4ERR_STALE_STATEID:
|
||||
case -NFS4ERR_EXPIRED:
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
ret = nfs4_wait_clnt_recover(clp);
|
||||
if (ret == 0)
|
||||
exception->retry = 1;
|
||||
#if !defined(CONFIG_NFS_V4_1)
|
||||
break;
|
||||
#else /* !defined(CONFIG_NFS_V4_1) */
|
||||
if (!nfs4_has_session(server->nfs_client))
|
||||
if (state == NULL)
|
||||
break;
|
||||
/* FALLTHROUGH */
|
||||
nfs4_state_mark_reclaim_reboot(clp, state);
|
||||
case -NFS4ERR_STALE_CLIENTID:
|
||||
case -NFS4ERR_EXPIRED:
|
||||
goto do_state_recovery;
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
case -NFS4ERR_BADSESSION:
|
||||
case -NFS4ERR_BADSLOT:
|
||||
case -NFS4ERR_BAD_HIGH_SLOT:
|
||||
@ -274,7 +270,7 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
exception->retry = 1;
|
||||
break;
|
||||
#endif /* !defined(CONFIG_NFS_V4_1) */
|
||||
#endif /* defined(CONFIG_NFS_V4_1) */
|
||||
case -NFS4ERR_FILE_OPEN:
|
||||
if (exception->timeout > HZ) {
|
||||
/* We have retried a decent amount, time to
|
||||
@ -293,6 +289,12 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
|
||||
}
|
||||
/* We failed to handle the error */
|
||||
return nfs4_map_errors(ret);
|
||||
do_state_recovery:
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
ret = nfs4_wait_clnt_recover(clp);
|
||||
if (ret == 0)
|
||||
exception->retry = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -1658,6 +1660,8 @@ static int _nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, in
|
||||
status = PTR_ERR(state);
|
||||
if (IS_ERR(state))
|
||||
goto err_opendata_put;
|
||||
if ((opendata->o_res.rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) != 0)
|
||||
set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
|
||||
nfs4_opendata_put(opendata);
|
||||
nfs4_put_state_owner(sp);
|
||||
*res = state;
|
||||
@ -3422,15 +3426,14 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
|
||||
if (state == NULL)
|
||||
break;
|
||||
nfs4_state_mark_reclaim_nograce(clp, state);
|
||||
case -NFS4ERR_STALE_CLIENTID:
|
||||
goto do_state_recovery;
|
||||
case -NFS4ERR_STALE_STATEID:
|
||||
if (state == NULL)
|
||||
break;
|
||||
nfs4_state_mark_reclaim_reboot(clp, state);
|
||||
case -NFS4ERR_STALE_CLIENTID:
|
||||
case -NFS4ERR_EXPIRED:
|
||||
rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
|
||||
rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
|
||||
task->tk_status = 0;
|
||||
return -EAGAIN;
|
||||
goto do_state_recovery;
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
case -NFS4ERR_BADSESSION:
|
||||
case -NFS4ERR_BADSLOT:
|
||||
@ -3458,6 +3461,13 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
|
||||
}
|
||||
task->tk_status = nfs4_map_errors(task->tk_status);
|
||||
return 0;
|
||||
do_state_recovery:
|
||||
rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
|
||||
nfs4_schedule_state_recovery(clp);
|
||||
if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
|
||||
rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
|
||||
task->tk_status = 0;
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -4088,6 +4098,28 @@ static const struct rpc_call_ops nfs4_recover_lock_ops = {
|
||||
.rpc_release = nfs4_lock_release,
|
||||
};
|
||||
|
||||
static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error)
|
||||
{
|
||||
struct nfs_client *clp = server->nfs_client;
|
||||
struct nfs4_state *state = lsp->ls_state;
|
||||
|
||||
switch (error) {
|
||||
case -NFS4ERR_ADMIN_REVOKED:
|
||||
case -NFS4ERR_BAD_STATEID:
|
||||
case -NFS4ERR_EXPIRED:
|
||||
if (new_lock_owner != 0 ||
|
||||
(lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
|
||||
nfs4_state_mark_reclaim_nograce(clp, state);
|
||||
lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
|
||||
break;
|
||||
case -NFS4ERR_STALE_STATEID:
|
||||
if (new_lock_owner != 0 ||
|
||||
(lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
|
||||
nfs4_state_mark_reclaim_reboot(clp, state);
|
||||
lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
|
||||
};
|
||||
}
|
||||
|
||||
static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
|
||||
{
|
||||
struct nfs4_lockdata *data;
|
||||
@ -4126,6 +4158,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
|
||||
ret = nfs4_wait_for_completion_rpc_task(task);
|
||||
if (ret == 0) {
|
||||
ret = data->rpc_status;
|
||||
if (ret)
|
||||
nfs4_handle_setlk_error(data->server, data->lsp,
|
||||
data->arg.new_lock_owner, ret);
|
||||
} else
|
||||
data->cancelled = 1;
|
||||
rpc_put_task(task);
|
||||
@ -4181,8 +4216,11 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock
|
||||
{
|
||||
struct nfs_inode *nfsi = NFS_I(state->inode);
|
||||
unsigned char fl_flags = request->fl_flags;
|
||||
int status;
|
||||
int status = -ENOLCK;
|
||||
|
||||
if ((fl_flags & FL_POSIX) &&
|
||||
!test_bit(NFS_STATE_POSIX_LOCKS, &state->flags))
|
||||
goto out;
|
||||
/* Is this a delegated open? */
|
||||
status = nfs4_set_lock_state(state, request);
|
||||
if (status != 0)
|
||||
|
@ -901,7 +901,7 @@ void nfs4_schedule_state_recovery(struct nfs_client *clp)
|
||||
nfs4_schedule_state_manager(clp);
|
||||
}
|
||||
|
||||
static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
|
||||
int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
|
||||
{
|
||||
|
||||
set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
|
||||
|
@ -176,6 +176,12 @@ void nfs_release_request(struct nfs_page *req)
|
||||
kref_put(&req->wb_kref, nfs_free_request);
|
||||
}
|
||||
|
||||
static int nfs_wait_bit_uninterruptible(void *word)
|
||||
{
|
||||
io_schedule();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs_wait_on_request - Wait for a request to complete.
|
||||
* @req: request to wait upon.
|
||||
@ -186,14 +192,9 @@ void nfs_release_request(struct nfs_page *req)
|
||||
int
|
||||
nfs_wait_on_request(struct nfs_page *req)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!test_bit(PG_BUSY, &req->wb_flags))
|
||||
goto out;
|
||||
ret = out_of_line_wait_on_bit(&req->wb_flags, PG_BUSY,
|
||||
nfs_wait_bit_killable, TASK_KILLABLE);
|
||||
out:
|
||||
return ret;
|
||||
return wait_on_bit(&req->wb_flags, PG_BUSY,
|
||||
nfs_wait_bit_uninterruptible,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -243,6 +243,7 @@ static int nfs_show_stats(struct seq_file *, struct vfsmount *);
|
||||
static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *);
|
||||
static int nfs_xdev_get_sb(struct file_system_type *fs_type,
|
||||
int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
|
||||
static void nfs_put_super(struct super_block *);
|
||||
static void nfs_kill_super(struct super_block *);
|
||||
static int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
|
||||
|
||||
@ -266,6 +267,7 @@ static const struct super_operations nfs_sops = {
|
||||
.alloc_inode = nfs_alloc_inode,
|
||||
.destroy_inode = nfs_destroy_inode,
|
||||
.write_inode = nfs_write_inode,
|
||||
.put_super = nfs_put_super,
|
||||
.statfs = nfs_statfs,
|
||||
.clear_inode = nfs_clear_inode,
|
||||
.umount_begin = nfs_umount_begin,
|
||||
@ -335,6 +337,7 @@ static const struct super_operations nfs4_sops = {
|
||||
.alloc_inode = nfs_alloc_inode,
|
||||
.destroy_inode = nfs_destroy_inode,
|
||||
.write_inode = nfs_write_inode,
|
||||
.put_super = nfs_put_super,
|
||||
.statfs = nfs_statfs,
|
||||
.clear_inode = nfs4_clear_inode,
|
||||
.umount_begin = nfs_umount_begin,
|
||||
@ -2257,6 +2260,17 @@ error_splat_super:
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure that we unregister the bdi before kill_anon_super
|
||||
* releases the device name
|
||||
*/
|
||||
static void nfs_put_super(struct super_block *s)
|
||||
{
|
||||
struct nfs_server *server = NFS_SB(s);
|
||||
|
||||
bdi_unregister(&server->backing_dev_info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Destroy an NFS2/3 superblock
|
||||
*/
|
||||
@ -2265,7 +2279,6 @@ static void nfs_kill_super(struct super_block *s)
|
||||
struct nfs_server *server = NFS_SB(s);
|
||||
|
||||
kill_anon_super(s);
|
||||
bdi_unregister(&server->backing_dev_info);
|
||||
nfs_fscache_release_super_cookie(s);
|
||||
nfs_free_server(server);
|
||||
}
|
||||
|
@ -15,8 +15,10 @@
|
||||
|
||||
#include "callback.h"
|
||||
|
||||
#ifdef CONFIG_NFS_V4
|
||||
static const int nfs_set_port_min = 0;
|
||||
static const int nfs_set_port_max = 65535;
|
||||
#endif
|
||||
static struct ctl_table_header *nfs_callback_sysctl_table;
|
||||
|
||||
static ctl_table nfs_cb_sysctls[] = {
|
||||
|
@ -1233,7 +1233,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
|
||||
|
||||
|
||||
#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
|
||||
void nfs_commitdata_release(void *data)
|
||||
static void nfs_commitdata_release(void *data)
|
||||
{
|
||||
struct nfs_write_data *wdata = data;
|
||||
|
||||
@ -1541,6 +1541,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
|
||||
break;
|
||||
}
|
||||
ret = nfs_wait_on_request(req);
|
||||
nfs_release_request(req);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
|
@ -2829,7 +2829,7 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
||||
|| sci->sc_seq_request != sci->sc_seq_done);
|
||||
spin_unlock(&sci->sc_state_lock);
|
||||
|
||||
if (flag || nilfs_segctor_confirm(sci))
|
||||
if (flag || !nilfs_segctor_confirm(sci))
|
||||
nilfs_segctor_write_out(sci);
|
||||
|
||||
WARN_ON(!list_empty(&sci->sc_copied_buffers));
|
||||
|
@ -24,9 +24,6 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define CN_IDX_CONNECTOR 0xffffffff
|
||||
#define CN_VAL_CONNECTOR 0xffffffff
|
||||
|
||||
/*
|
||||
* Process Events connector unique ids -- used for message routing
|
||||
*/
|
||||
@ -75,30 +72,6 @@ struct cn_msg {
|
||||
__u8 data[0];
|
||||
};
|
||||
|
||||
/*
|
||||
* Notify structure - requests notification about
|
||||
* registering/unregistering idx/val in range [first, first+range].
|
||||
*/
|
||||
struct cn_notify_req {
|
||||
__u32 first;
|
||||
__u32 range;
|
||||
};
|
||||
|
||||
/*
|
||||
* Main notification control message
|
||||
* *_notify_num - number of appropriate cn_notify_req structures after
|
||||
* this struct.
|
||||
* group - notification receiver's idx.
|
||||
* len - total length of the attached data.
|
||||
*/
|
||||
struct cn_ctl_msg {
|
||||
__u32 idx_notify_num;
|
||||
__u32 val_notify_num;
|
||||
__u32 group;
|
||||
__u32 len;
|
||||
__u8 data[0];
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/atomic.h>
|
||||
@ -151,11 +124,6 @@ struct cn_callback_entry {
|
||||
u32 seq, group;
|
||||
};
|
||||
|
||||
struct cn_ctl_entry {
|
||||
struct list_head notify_entry;
|
||||
struct cn_ctl_msg *msg;
|
||||
};
|
||||
|
||||
struct cn_dev {
|
||||
struct cb_id id;
|
||||
|
||||
|
@ -310,6 +310,7 @@ extern void sched_show_task(struct task_struct *p);
|
||||
#ifdef CONFIG_DETECT_SOFTLOCKUP
|
||||
extern void softlockup_tick(void);
|
||||
extern void touch_softlockup_watchdog(void);
|
||||
extern void touch_softlockup_watchdog_sync(void);
|
||||
extern void touch_all_softlockup_watchdogs(void);
|
||||
extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write,
|
||||
void __user *buffer,
|
||||
@ -323,6 +324,9 @@ static inline void softlockup_tick(void)
|
||||
static inline void touch_softlockup_watchdog(void)
|
||||
{
|
||||
}
|
||||
static inline void touch_softlockup_watchdog_sync(void)
|
||||
{
|
||||
}
|
||||
static inline void touch_all_softlockup_watchdogs(void)
|
||||
{
|
||||
}
|
||||
|
@ -2936,14 +2936,17 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
|
||||
|
||||
for_each_subsys(root, ss) {
|
||||
struct cgroup_subsys_state *css = ss->create(ss, cgrp);
|
||||
|
||||
if (IS_ERR(css)) {
|
||||
err = PTR_ERR(css);
|
||||
goto err_destroy;
|
||||
}
|
||||
init_cgroup_css(css, ss, cgrp);
|
||||
if (ss->use_id)
|
||||
if (alloc_css_id(ss, parent, cgrp))
|
||||
if (ss->use_id) {
|
||||
err = alloc_css_id(ss, parent, cgrp);
|
||||
if (err)
|
||||
goto err_destroy;
|
||||
}
|
||||
/* At error, ->destroy() callback has to free assigned ID. */
|
||||
}
|
||||
|
||||
|
@ -224,7 +224,7 @@ struct cred *cred_alloc_blank(void)
|
||||
#ifdef CONFIG_KEYS
|
||||
new->tgcred = kzalloc(sizeof(*new->tgcred), GFP_KERNEL);
|
||||
if (!new->tgcred) {
|
||||
kfree(new);
|
||||
kmem_cache_free(cred_jar, new);
|
||||
return NULL;
|
||||
}
|
||||
atomic_set(&new->tgcred->usage, 1);
|
||||
|
@ -530,8 +530,25 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb,
|
||||
return -EINVAL;
|
||||
|
||||
WARN_ON(!atomic_read(&pi_state->refcount));
|
||||
WARN_ON(pid && pi_state->owner &&
|
||||
pi_state->owner->pid != pid);
|
||||
|
||||
/*
|
||||
* When pi_state->owner is NULL then the owner died
|
||||
* and another waiter is on the fly. pi_state->owner
|
||||
* is fixed up by the task which acquires
|
||||
* pi_state->rt_mutex.
|
||||
*
|
||||
* We do not check for pid == 0 which can happen when
|
||||
* the owner died and robust_list_exit() cleared the
|
||||
* TID.
|
||||
*/
|
||||
if (pid && pi_state->owner) {
|
||||
/*
|
||||
* Bail out if user space manipulated the
|
||||
* futex value.
|
||||
*/
|
||||
if (pid != task_pid_vnr(pi_state->owner))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
atomic_inc(&pi_state->refcount);
|
||||
*ps = pi_state;
|
||||
@ -758,6 +775,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
|
||||
if (!pi_state)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* If current does not own the pi_state then the futex is
|
||||
* inconsistent and user space fiddled with the futex value.
|
||||
*/
|
||||
if (pi_state->owner != current)
|
||||
return -EINVAL;
|
||||
|
||||
raw_spin_lock(&pi_state->pi_mutex.wait_lock);
|
||||
new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
|
||||
|
||||
@ -1971,7 +1995,7 @@ retry_private:
|
||||
/* Unqueue and drop the lock */
|
||||
unqueue_me_pi(&q);
|
||||
|
||||
goto out;
|
||||
goto out_put_key;
|
||||
|
||||
out_unlock_put_key:
|
||||
queue_unlock(&q, hb);
|
||||
|
@ -349,6 +349,7 @@ EXPORT_SYMBOL(__kfifo_from_user_n);
|
||||
* @fifo: the fifo to be used.
|
||||
* @from: pointer to the data to be added.
|
||||
* @len: the length of the data to be added.
|
||||
* @total: the actual returned data length.
|
||||
*
|
||||
* This function copies at most @len bytes from the @from into the
|
||||
* FIFO depending and returns -EFAULT/0.
|
||||
@ -399,7 +400,7 @@ EXPORT_SYMBOL(__kfifo_to_user_n);
|
||||
* @fifo: the fifo to be used.
|
||||
* @to: where the data must be copied.
|
||||
* @len: the size of the destination buffer.
|
||||
@ @lenout: pointer to output variable with copied data
|
||||
* @lenout: pointer to output variable with copied data
|
||||
*
|
||||
* This function copies at most @len bytes from the FIFO into the
|
||||
* @to buffer and 0 or -EFAULT.
|
||||
|
@ -599,7 +599,7 @@ static void kgdb_wait(struct pt_regs *regs)
|
||||
|
||||
/* Signal the primary CPU that we are done: */
|
||||
atomic_set(&cpu_in_kgdb[cpu], 0);
|
||||
touch_softlockup_watchdog();
|
||||
touch_softlockup_watchdog_sync();
|
||||
clocksource_touch_watchdog();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
@ -1453,7 +1453,7 @@ acquirelock:
|
||||
(kgdb_info[cpu].task &&
|
||||
kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
|
||||
atomic_set(&kgdb_active, -1);
|
||||
touch_softlockup_watchdog();
|
||||
touch_softlockup_watchdog_sync();
|
||||
clocksource_touch_watchdog();
|
||||
local_irq_restore(flags);
|
||||
|
||||
@ -1553,7 +1553,7 @@ kgdb_restore:
|
||||
}
|
||||
/* Free kgdb_active */
|
||||
atomic_set(&kgdb_active, -1);
|
||||
touch_softlockup_watchdog();
|
||||
touch_softlockup_watchdog_sync();
|
||||
clocksource_touch_watchdog();
|
||||
local_irq_restore(flags);
|
||||
|
||||
|
@ -25,6 +25,7 @@ static DEFINE_SPINLOCK(print_lock);
|
||||
static DEFINE_PER_CPU(unsigned long, softlockup_touch_ts); /* touch timestamp */
|
||||
static DEFINE_PER_CPU(unsigned long, softlockup_print_ts); /* print timestamp */
|
||||
static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog);
|
||||
static DEFINE_PER_CPU(bool, softlock_touch_sync);
|
||||
|
||||
static int __read_mostly did_panic;
|
||||
int __read_mostly softlockup_thresh = 60;
|
||||
@ -79,6 +80,12 @@ void touch_softlockup_watchdog(void)
|
||||
}
|
||||
EXPORT_SYMBOL(touch_softlockup_watchdog);
|
||||
|
||||
void touch_softlockup_watchdog_sync(void)
|
||||
{
|
||||
__raw_get_cpu_var(softlock_touch_sync) = true;
|
||||
__raw_get_cpu_var(softlockup_touch_ts) = 0;
|
||||
}
|
||||
|
||||
void touch_all_softlockup_watchdogs(void)
|
||||
{
|
||||
int cpu;
|
||||
@ -118,6 +125,14 @@ void softlockup_tick(void)
|
||||
}
|
||||
|
||||
if (touch_ts == 0) {
|
||||
if (unlikely(per_cpu(softlock_touch_sync, this_cpu))) {
|
||||
/*
|
||||
* If the time stamp was touched atomically
|
||||
* make sure the scheduler tick is up to date.
|
||||
*/
|
||||
per_cpu(softlock_touch_sync, this_cpu) = false;
|
||||
sched_clock_tick();
|
||||
}
|
||||
__touch_softlockup_watchdog();
|
||||
return;
|
||||
}
|
||||
|
@ -2232,6 +2232,9 @@ again:
|
||||
if (unlikely(status))
|
||||
break;
|
||||
|
||||
if (mapping_writably_mapped(mapping))
|
||||
flush_dcache_page(page);
|
||||
|
||||
pagefault_disable();
|
||||
copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes);
|
||||
pagefault_enable();
|
||||
|
@ -1515,10 +1515,9 @@ static struct attribute_group hstate_attr_group = {
|
||||
.attrs = hstate_attrs,
|
||||
};
|
||||
|
||||
static int __init hugetlb_sysfs_add_hstate(struct hstate *h,
|
||||
struct kobject *parent,
|
||||
struct kobject **hstate_kobjs,
|
||||
struct attribute_group *hstate_attr_group)
|
||||
static int hugetlb_sysfs_add_hstate(struct hstate *h, struct kobject *parent,
|
||||
struct kobject **hstate_kobjs,
|
||||
struct attribute_group *hstate_attr_group)
|
||||
{
|
||||
int retval;
|
||||
int hi = h - hstates;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user