Merge branch 'for-linus' of ../linux-2.6-block into block-for-2.6.39/core
This merge creates two set of conflicts. One is simple context conflicts caused by removal of throtl_scheduled_delayed_work() in for-linus and removal of throtl_shutdown_timer_wq() in for-2.6.39/core. The other is caused by commit255bb490c8
(block: blk-flush shouldn't call directly into q->request_fn() __blk_run_queue()) in for-linus crashing with FLUSH reimplementation in for-2.6.39/core. The conflict isn't trivial but the resolution is straight-forward. * __blk_run_queue() calls in flush_end_io() and flush_data_end_io() should be called with @force_kblockd set to %true. * elv_insert() in blk_kick_flush() should use %ELEVATOR_INSERT_REQUEUE. Both changes are to avoid invoking ->request_fn() directly from request completion path and closely match the changes in the commit255bb490c8
. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
commit
e83a46bbb1
1
.gitignore
vendored
1
.gitignore
vendored
@ -28,6 +28,7 @@ modules.builtin
|
|||||||
*.gz
|
*.gz
|
||||||
*.bz2
|
*.bz2
|
||||||
*.lzma
|
*.lzma
|
||||||
|
*.xz
|
||||||
*.lzo
|
*.lzo
|
||||||
*.patch
|
*.patch
|
||||||
*.gcno
|
*.gcno
|
||||||
|
11
MAINTAINERS
11
MAINTAINERS
@ -1692,6 +1692,13 @@ M: Andy Whitcroft <apw@canonical.com>
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: scripts/checkpatch.pl
|
F: scripts/checkpatch.pl
|
||||||
|
|
||||||
|
CHINESE DOCUMENTATION
|
||||||
|
M: Harry Wei <harryxiyou@gmail.com>
|
||||||
|
L: xiyoulinuxkernelgroup@googlegroups.com
|
||||||
|
L: linux-kernel@zh-kernel.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/zh_CN/
|
||||||
|
|
||||||
CISCO VIC ETHERNET NIC DRIVER
|
CISCO VIC ETHERNET NIC DRIVER
|
||||||
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
||||||
M: Roopa Prabhu <roprabhu@cisco.com>
|
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||||
@ -5266,7 +5273,7 @@ S: Maintained
|
|||||||
F: drivers/net/wireless/rtl818x/rtl8180/
|
F: drivers/net/wireless/rtl818x/rtl8180/
|
||||||
|
|
||||||
RTL8187 WIRELESS DRIVER
|
RTL8187 WIRELESS DRIVER
|
||||||
M: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
M: Herton Ronaldo Krzesinski <herton@canonical.com>
|
||||||
M: Hin-Tak Leung <htl10@users.sourceforge.net>
|
M: Hin-Tak Leung <htl10@users.sourceforge.net>
|
||||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
@ -6104,7 +6111,7 @@ S: Maintained
|
|||||||
F: security/tomoyo/
|
F: security/tomoyo/
|
||||||
|
|
||||||
TOPSTAR LAPTOP EXTRAS DRIVER
|
TOPSTAR LAPTOP EXTRAS DRIVER
|
||||||
M: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
M: Herton Ronaldo Krzesinski <herton@canonical.com>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/topstar-laptop.c
|
F: drivers/platform/x86/topstar-laptop.c
|
||||||
|
@ -77,7 +77,7 @@ static int _dpll_test_fint(struct clk *clk, u8 n)
|
|||||||
dd = clk->dpll_data;
|
dd = clk->dpll_data;
|
||||||
|
|
||||||
/* DPLL divider must result in a valid jitter correction val */
|
/* DPLL divider must result in a valid jitter correction val */
|
||||||
fint = clk->parent->rate / (n + 1);
|
fint = clk->parent->rate / n;
|
||||||
if (fint < DPLL_FINT_BAND1_MIN) {
|
if (fint < DPLL_FINT_BAND1_MIN) {
|
||||||
|
|
||||||
pr_debug("rejecting n=%d due to Fint failure, "
|
pr_debug("rejecting n=%d due to Fint failure, "
|
||||||
|
@ -334,7 +334,7 @@ static struct omap_mbox mbox_iva_info = {
|
|||||||
.priv = &omap2_mbox_iva_priv,
|
.priv = &omap2_mbox_iva_priv,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct omap_mbox *omap2_mboxes[] = { &mbox_iva_info, &mbox_dsp_info, NULL };
|
struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP4)
|
#if defined(CONFIG_ARCH_OMAP4)
|
||||||
|
@ -605,7 +605,7 @@ static void __init omap_mux_dbg_create_entry(
|
|||||||
list_for_each_entry(e, &partition->muxmodes, node) {
|
list_for_each_entry(e, &partition->muxmodes, node) {
|
||||||
struct omap_mux *m = &e->mux;
|
struct omap_mux *m = &e->mux;
|
||||||
|
|
||||||
(void)debugfs_create_file(m->muxnames[0], S_IWUGO, mux_dbg_dir,
|
(void)debugfs_create_file(m->muxnames[0], S_IWUSR, mux_dbg_dir,
|
||||||
m, &omap_mux_dbg_signal_fops);
|
m, &omap_mux_dbg_signal_fops);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -637,14 +637,14 @@ static int __init pm_dbg_init(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUGO, d,
|
(void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d,
|
||||||
&enable_off_mode, &pm_dbg_option_fops);
|
&enable_off_mode, &pm_dbg_option_fops);
|
||||||
(void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUGO, d,
|
(void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUSR, d,
|
||||||
&sleep_while_idle, &pm_dbg_option_fops);
|
&sleep_while_idle, &pm_dbg_option_fops);
|
||||||
(void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUGO, d,
|
(void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUSR, d,
|
||||||
&wakeup_timer_seconds, &pm_dbg_option_fops);
|
&wakeup_timer_seconds, &pm_dbg_option_fops);
|
||||||
(void) debugfs_create_file("wakeup_timer_milliseconds",
|
(void) debugfs_create_file("wakeup_timer_milliseconds",
|
||||||
S_IRUGO | S_IWUGO, d, &wakeup_timer_milliseconds,
|
S_IRUGO | S_IWUSR, d, &wakeup_timer_milliseconds,
|
||||||
&pm_dbg_option_fops);
|
&pm_dbg_option_fops);
|
||||||
pm_dbg_init_done = 1;
|
pm_dbg_init_done = 1;
|
||||||
|
|
||||||
|
@ -38,8 +38,8 @@
|
|||||||
#define OMAP4430_PRCM_MPU_CPU1_INST 0x0800
|
#define OMAP4430_PRCM_MPU_CPU1_INST 0x0800
|
||||||
|
|
||||||
/* PRCM_MPU clockdomain register offsets (from instance start) */
|
/* PRCM_MPU clockdomain register offsets (from instance start) */
|
||||||
#define OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS 0x0000
|
#define OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS 0x0018
|
||||||
#define OMAP4430_PRCM_MPU_CPU1_MPU_CDOFFS 0x0000
|
#define OMAP4430_PRCM_MPU_CPU1_MPU_CDOFFS 0x0018
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -900,7 +900,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||||||
return PTR_ERR(dbg_dir);
|
return PTR_ERR(dbg_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUGO, dbg_dir,
|
(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, dbg_dir,
|
||||||
(void *)sr_info, &pm_sr_fops);
|
(void *)sr_info, &pm_sr_fops);
|
||||||
(void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir,
|
(void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir,
|
||||||
&sr_info->err_weight);
|
&sr_info->err_weight);
|
||||||
@ -939,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||||||
strcpy(name, "volt_");
|
strcpy(name, "volt_");
|
||||||
sprintf(volt_name, "%d", volt_data[i].volt_nominal);
|
sprintf(volt_name, "%d", volt_data[i].volt_nominal);
|
||||||
strcat(name, volt_name);
|
strcat(name, volt_name);
|
||||||
(void) debugfs_create_x32(name, S_IRUGO | S_IWUGO, nvalue_dir,
|
(void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,
|
||||||
&(sr_info->nvalue_table[i].nvalue));
|
&(sr_info->nvalue_table[i].nvalue));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
#include <plat/dmtimer.h>
|
#include <plat/dmtimer.h>
|
||||||
#include <asm/localtimer.h>
|
#include <asm/localtimer.h>
|
||||||
|
#include <asm/sched_clock.h>
|
||||||
|
|
||||||
#include "timer-gp.h"
|
#include "timer-gp.h"
|
||||||
|
|
||||||
@ -190,6 +191,7 @@ static void __init omap2_gp_clocksource_init(void)
|
|||||||
/*
|
/*
|
||||||
* clocksource
|
* clocksource
|
||||||
*/
|
*/
|
||||||
|
static DEFINE_CLOCK_DATA(cd);
|
||||||
static struct omap_dm_timer *gpt_clocksource;
|
static struct omap_dm_timer *gpt_clocksource;
|
||||||
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
||||||
{
|
{
|
||||||
@ -204,6 +206,15 @@ static struct clocksource clocksource_gpt = {
|
|||||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void notrace dmtimer_update_sched_clock(void)
|
||||||
|
{
|
||||||
|
u32 cyc;
|
||||||
|
|
||||||
|
cyc = omap_dm_timer_read_counter(gpt_clocksource);
|
||||||
|
|
||||||
|
update_sched_clock(&cd, cyc, (u32)~0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup free-running counter for clocksource */
|
/* Setup free-running counter for clocksource */
|
||||||
static void __init omap2_gp_clocksource_init(void)
|
static void __init omap2_gp_clocksource_init(void)
|
||||||
{
|
{
|
||||||
@ -224,6 +235,8 @@ static void __init omap2_gp_clocksource_init(void)
|
|||||||
|
|
||||||
omap_dm_timer_set_load_start(gpt, 1, 0);
|
omap_dm_timer_set_load_start(gpt, 1, 0);
|
||||||
|
|
||||||
|
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, tick_rate);
|
||||||
|
|
||||||
if (clocksource_register_hz(&clocksource_gpt, tick_rate))
|
if (clocksource_register_hz(&clocksource_gpt, tick_rate))
|
||||||
printk(err2, clocksource_gpt.name);
|
printk(err2, clocksource_gpt.name);
|
||||||
}
|
}
|
||||||
|
@ -57,5 +57,6 @@ struct tegra_kbc_platform_data {
|
|||||||
const struct matrix_keymap_data *keymap_data;
|
const struct matrix_keymap_data *keymap_data;
|
||||||
|
|
||||||
bool wakeup;
|
bool wakeup;
|
||||||
|
bool use_fn_map;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -322,15 +322,18 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
|
|||||||
|
|
||||||
struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)
|
struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)
|
||||||
{
|
{
|
||||||
struct omap_mbox *mbox;
|
struct omap_mbox *_mbox, *mbox = NULL;
|
||||||
int ret;
|
int i, ret;
|
||||||
|
|
||||||
if (!mboxes)
|
if (!mboxes)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
for (mbox = *mboxes; mbox; mbox++)
|
for (i = 0; (_mbox = mboxes[i]); i++) {
|
||||||
if (!strcmp(mbox->name, name))
|
if (!strcmp(_mbox->name, name)) {
|
||||||
|
mbox = _mbox;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!mbox)
|
if (!mbox)
|
||||||
return ERR_PTR(-ENOENT);
|
return ERR_PTR(-ENOENT);
|
||||||
|
@ -72,11 +72,6 @@ SECTIONS
|
|||||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||||
.init.data : { INIT_DATA }
|
.init.data : { INIT_DATA }
|
||||||
.init.setup : { INIT_SETUP(16) }
|
.init.setup : { INIT_SETUP(16) }
|
||||||
#ifdef CONFIG_ETRAX_ARCH_V32
|
|
||||||
__start___param = .;
|
|
||||||
__param : { *(__param) }
|
|
||||||
__stop___param = .;
|
|
||||||
#endif
|
|
||||||
.initcall.init : {
|
.initcall.init : {
|
||||||
INIT_CALLS
|
INIT_CALLS
|
||||||
}
|
}
|
||||||
|
@ -88,6 +88,7 @@ extern int acpi_disabled;
|
|||||||
extern int acpi_pci_disabled;
|
extern int acpi_pci_disabled;
|
||||||
extern int acpi_skip_timer_override;
|
extern int acpi_skip_timer_override;
|
||||||
extern int acpi_use_timer_override;
|
extern int acpi_use_timer_override;
|
||||||
|
extern int acpi_fix_pin2_polarity;
|
||||||
|
|
||||||
extern u8 acpi_sci_flags;
|
extern u8 acpi_sci_flags;
|
||||||
extern int acpi_sci_override_gsi;
|
extern int acpi_sci_override_gsi;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#define ARCH_P4_CNTRVAL_BITS (40)
|
#define ARCH_P4_CNTRVAL_BITS (40)
|
||||||
#define ARCH_P4_CNTRVAL_MASK ((1ULL << ARCH_P4_CNTRVAL_BITS) - 1)
|
#define ARCH_P4_CNTRVAL_MASK ((1ULL << ARCH_P4_CNTRVAL_BITS) - 1)
|
||||||
|
#define ARCH_P4_UNFLAGGED_BIT ((1ULL) << (ARCH_P4_CNTRVAL_BITS - 1))
|
||||||
|
|
||||||
#define P4_ESCR_EVENT_MASK 0x7e000000U
|
#define P4_ESCR_EVENT_MASK 0x7e000000U
|
||||||
#define P4_ESCR_EVENT_SHIFT 25
|
#define P4_ESCR_EVENT_SHIFT 25
|
||||||
|
@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
|||||||
*/
|
*/
|
||||||
CMOS_WRITE(0, 0xf);
|
CMOS_WRITE(0, 0xf);
|
||||||
|
|
||||||
*((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
*((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __init smpboot_setup_io_apic(void)
|
static inline void __init smpboot_setup_io_apic(void)
|
||||||
|
@ -72,6 +72,7 @@ u8 acpi_sci_flags __initdata;
|
|||||||
int acpi_sci_override_gsi __initdata;
|
int acpi_sci_override_gsi __initdata;
|
||||||
int acpi_skip_timer_override __initdata;
|
int acpi_skip_timer_override __initdata;
|
||||||
int acpi_use_timer_override __initdata;
|
int acpi_use_timer_override __initdata;
|
||||||
|
int acpi_fix_pin2_polarity __initdata;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
|
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
|
||||||
@ -415,10 +416,15 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (acpi_skip_timer_override &&
|
if (intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
||||||
intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
if (acpi_skip_timer_override) {
|
||||||
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
if (acpi_fix_pin2_polarity && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) {
|
||||||
|
intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK;
|
||||||
|
printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_override_legacy_irq(intsrc->source_irq,
|
mp_override_legacy_irq(intsrc->source_irq,
|
||||||
|
@ -284,7 +284,7 @@ static int __init apbt_clockevent_register(void)
|
|||||||
memcpy(&adev->evt, &apbt_clockevent, sizeof(struct clock_event_device));
|
memcpy(&adev->evt, &apbt_clockevent, sizeof(struct clock_event_device));
|
||||||
|
|
||||||
if (mrst_timer_options == MRST_TIMER_LAPIC_APBT) {
|
if (mrst_timer_options == MRST_TIMER_LAPIC_APBT) {
|
||||||
apbt_clockevent.rating = APBT_CLOCKEVENT_RATING - 100;
|
adev->evt.rating = APBT_CLOCKEVENT_RATING - 100;
|
||||||
global_clock_event = &adev->evt;
|
global_clock_event = &adev->evt;
|
||||||
printk(KERN_DEBUG "%s clockevent registered as global\n",
|
printk(KERN_DEBUG "%s clockevent registered as global\n",
|
||||||
global_clock_event->name);
|
global_clock_event->name);
|
||||||
|
@ -770,9 +770,14 @@ static inline int p4_pmu_clear_cccr_ovf(struct hw_perf_event *hwc)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* it might be unflagged overflow */
|
/*
|
||||||
rdmsrl(hwc->event_base + hwc->idx, v);
|
* In some circumstances the overflow might issue an NMI but did
|
||||||
if (!(v & ARCH_P4_CNTRVAL_MASK))
|
* not set P4_CCCR_OVF bit. Because a counter holds a negative value
|
||||||
|
* we simply check for high bit being set, if it's cleared it means
|
||||||
|
* the counter has reached zero value and continued counting before
|
||||||
|
* real NMI signal was received:
|
||||||
|
*/
|
||||||
|
if (!(v & ARCH_P4_UNFLAGGED_BIT))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -143,15 +143,10 @@ static void __init ati_bugs(int num, int slot, int func)
|
|||||||
|
|
||||||
static u32 __init ati_sbx00_rev(int num, int slot, int func)
|
static u32 __init ati_sbx00_rev(int num, int slot, int func)
|
||||||
{
|
{
|
||||||
u32 old, d;
|
u32 d;
|
||||||
|
|
||||||
d = read_pci_config(num, slot, func, 0x70);
|
|
||||||
old = d;
|
|
||||||
d &= ~(1<<8);
|
|
||||||
write_pci_config(num, slot, func, 0x70, d);
|
|
||||||
d = read_pci_config(num, slot, func, 0x8);
|
d = read_pci_config(num, slot, func, 0x8);
|
||||||
d &= 0xff;
|
d &= 0xff;
|
||||||
write_pci_config(num, slot, func, 0x70, old);
|
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@ -160,11 +155,14 @@ static void __init ati_bugs_contd(int num, int slot, int func)
|
|||||||
{
|
{
|
||||||
u32 d, rev;
|
u32 d, rev;
|
||||||
|
|
||||||
if (acpi_use_timer_override)
|
rev = ati_sbx00_rev(num, slot, func);
|
||||||
|
if (rev >= 0x40)
|
||||||
|
acpi_fix_pin2_polarity = 1;
|
||||||
|
|
||||||
|
if (rev > 0x13)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rev = ati_sbx00_rev(num, slot, func);
|
if (acpi_use_timer_override)
|
||||||
if (rev > 0x13)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* check for IRQ0 interrupt swap */
|
/* check for IRQ0 interrupt swap */
|
||||||
|
@ -285,6 +285,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
|
DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{ /* Handle problems with rebooting on VersaLogic Menlow boards */
|
||||||
|
.callback = set_bios_reboot,
|
||||||
|
.ident = "VersaLogic Menlow based board",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2777,6 +2777,8 @@ static int dr_interception(struct vcpu_svm *svm)
|
|||||||
kvm_register_write(&svm->vcpu, reg, val);
|
kvm_register_write(&svm->vcpu, reg, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_emulated_instruction(&svm->vcpu);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ void blk_start_queue(struct request_queue *q)
|
|||||||
WARN_ON(!irqs_disabled());
|
WARN_ON(!irqs_disabled());
|
||||||
|
|
||||||
queue_flag_clear(QUEUE_FLAG_STOPPED, q);
|
queue_flag_clear(QUEUE_FLAG_STOPPED, q);
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, false);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blk_start_queue);
|
EXPORT_SYMBOL(blk_start_queue);
|
||||||
|
|
||||||
@ -396,13 +396,14 @@ EXPORT_SYMBOL(blk_sync_queue);
|
|||||||
/**
|
/**
|
||||||
* __blk_run_queue - run a single device queue
|
* __blk_run_queue - run a single device queue
|
||||||
* @q: The queue to run
|
* @q: The queue to run
|
||||||
|
* @force_kblockd: Don't run @q->request_fn directly. Use kblockd.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* See @blk_run_queue. This variant must be called with the queue lock
|
* See @blk_run_queue. This variant must be called with the queue lock
|
||||||
* held and interrupts disabled.
|
* held and interrupts disabled.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void __blk_run_queue(struct request_queue *q)
|
void __blk_run_queue(struct request_queue *q, bool force_kblockd)
|
||||||
{
|
{
|
||||||
blk_remove_plug(q);
|
blk_remove_plug(q);
|
||||||
|
|
||||||
@ -416,7 +417,7 @@ void __blk_run_queue(struct request_queue *q)
|
|||||||
* Only recurse once to avoid overrunning the stack, let the unplug
|
* Only recurse once to avoid overrunning the stack, let the unplug
|
||||||
* handling reinvoke the handler shortly if we already got there.
|
* handling reinvoke the handler shortly if we already got there.
|
||||||
*/
|
*/
|
||||||
if (!queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) {
|
if (!force_kblockd && !queue_flag_test_and_set(QUEUE_FLAG_REENTER, q)) {
|
||||||
q->request_fn(q);
|
q->request_fn(q);
|
||||||
queue_flag_clear(QUEUE_FLAG_REENTER, q);
|
queue_flag_clear(QUEUE_FLAG_REENTER, q);
|
||||||
} else {
|
} else {
|
||||||
@ -439,7 +440,7 @@ void blk_run_queue(struct request_queue *q)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(q->queue_lock, flags);
|
spin_lock_irqsave(q->queue_lock, flags);
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, false);
|
||||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blk_run_queue);
|
EXPORT_SYMBOL(blk_run_queue);
|
||||||
@ -1085,7 +1086,7 @@ void blk_insert_request(struct request_queue *q, struct request *rq,
|
|||||||
|
|
||||||
drive_stat_acct(rq, 1);
|
drive_stat_acct(rq, 1);
|
||||||
__elv_add_request(q, rq, where, 0);
|
__elv_add_request(q, rq, where, 0);
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, false);
|
||||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blk_insert_request);
|
EXPORT_SYMBOL(blk_insert_request);
|
||||||
@ -2642,13 +2643,6 @@ int kblockd_schedule_work(struct request_queue *q, struct work_struct *work)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kblockd_schedule_work);
|
EXPORT_SYMBOL(kblockd_schedule_work);
|
||||||
|
|
||||||
int kblockd_schedule_delayed_work(struct request_queue *q,
|
|
||||||
struct delayed_work *dwork, unsigned long delay)
|
|
||||||
{
|
|
||||||
return queue_delayed_work(kblockd_workqueue, dwork, delay);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(kblockd_schedule_delayed_work);
|
|
||||||
|
|
||||||
int __init blk_dev_init(void)
|
int __init blk_dev_init(void)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(__REQ_NR_BITS > 8 *
|
BUILD_BUG_ON(__REQ_NR_BITS > 8 *
|
||||||
|
@ -212,9 +212,14 @@ static void flush_end_io(struct request *flush_rq, int error)
|
|||||||
queued |= blk_flush_complete_seq(rq, seq, error);
|
queued |= blk_flush_complete_seq(rq, seq, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* after populating an empty queue, kick it to avoid stall */
|
/*
|
||||||
|
* Moving a request silently to empty queue_head may stall the
|
||||||
|
* queue. Kick the queue in those cases. This function is called
|
||||||
|
* from request completion path and calling directly into
|
||||||
|
* request_fn may confuse the driver. Always use kblockd.
|
||||||
|
*/
|
||||||
if (queued && was_empty)
|
if (queued && was_empty)
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -257,7 +262,7 @@ static bool blk_kick_flush(struct request_queue *q)
|
|||||||
q->flush_rq.end_io = flush_end_io;
|
q->flush_rq.end_io = flush_end_io;
|
||||||
|
|
||||||
q->flush_pending_idx ^= 1;
|
q->flush_pending_idx ^= 1;
|
||||||
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_FRONT);
|
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_REQUEUE);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,9 +271,12 @@ static void flush_data_end_io(struct request *rq, int error)
|
|||||||
struct request_queue *q = rq->q;
|
struct request_queue *q = rq->q;
|
||||||
bool was_empty = elv_queue_empty(q);
|
bool was_empty = elv_queue_empty(q);
|
||||||
|
|
||||||
/* after populating an empty queue, kick it to avoid stall */
|
/*
|
||||||
|
* After populating an empty queue, kick it to avoid stall. Read
|
||||||
|
* the comment in flush_end_io().
|
||||||
|
*/
|
||||||
if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error) && was_empty)
|
if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error) && was_empty)
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -132,7 +132,7 @@ static void bio_batch_end_io(struct bio *bio, int err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blkdev_issue_zeroout generate number of zero filed write bios
|
* blkdev_issue_zeroout - generate number of zero filed write bios
|
||||||
* @bdev: blockdev to issue
|
* @bdev: blockdev to issue
|
||||||
* @sector: start sector
|
* @sector: start sector
|
||||||
* @nr_sects: number of sectors to write
|
* @nr_sects: number of sectors to write
|
||||||
|
@ -20,6 +20,11 @@ static int throtl_quantum = 32;
|
|||||||
/* Throttling is performed over 100ms slice and after that slice is renewed */
|
/* Throttling is performed over 100ms slice and after that slice is renewed */
|
||||||
static unsigned long throtl_slice = HZ/10; /* 100 ms */
|
static unsigned long throtl_slice = HZ/10; /* 100 ms */
|
||||||
|
|
||||||
|
/* A workqueue to queue throttle related work */
|
||||||
|
static struct workqueue_struct *kthrotld_workqueue;
|
||||||
|
static void throtl_schedule_delayed_work(struct throtl_data *td,
|
||||||
|
unsigned long delay);
|
||||||
|
|
||||||
struct throtl_rb_root {
|
struct throtl_rb_root {
|
||||||
struct rb_root rb;
|
struct rb_root rb;
|
||||||
struct rb_node *left;
|
struct rb_node *left;
|
||||||
@ -345,10 +350,9 @@ static void throtl_schedule_next_dispatch(struct throtl_data *td)
|
|||||||
update_min_dispatch_time(st);
|
update_min_dispatch_time(st);
|
||||||
|
|
||||||
if (time_before_eq(st->min_disptime, jiffies))
|
if (time_before_eq(st->min_disptime, jiffies))
|
||||||
throtl_schedule_delayed_work(td->queue, 0);
|
throtl_schedule_delayed_work(td, 0);
|
||||||
else
|
else
|
||||||
throtl_schedule_delayed_work(td->queue,
|
throtl_schedule_delayed_work(td, (st->min_disptime - jiffies));
|
||||||
(st->min_disptime - jiffies));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@ -815,10 +819,10 @@ void blk_throtl_work(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Call with queue lock held */
|
/* Call with queue lock held */
|
||||||
void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay)
|
static void
|
||||||
|
throtl_schedule_delayed_work(struct throtl_data *td, unsigned long delay)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct throtl_data *td = q->td;
|
|
||||||
struct delayed_work *dwork = &td->throtl_work;
|
struct delayed_work *dwork = &td->throtl_work;
|
||||||
|
|
||||||
if (total_nr_queued(td) > 0) {
|
if (total_nr_queued(td) > 0) {
|
||||||
@ -827,12 +831,11 @@ void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay)
|
|||||||
* Cancel that and schedule a new one.
|
* Cancel that and schedule a new one.
|
||||||
*/
|
*/
|
||||||
__cancel_delayed_work(dwork);
|
__cancel_delayed_work(dwork);
|
||||||
kblockd_schedule_delayed_work(q, dwork, delay);
|
queue_delayed_work(kthrotld_workqueue, dwork, delay);
|
||||||
throtl_log(td, "schedule work. delay=%lu jiffies=%lu",
|
throtl_log(td, "schedule work. delay=%lu jiffies=%lu",
|
||||||
delay, jiffies);
|
delay, jiffies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(throtl_schedule_delayed_work);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
throtl_destroy_tg(struct throtl_data *td, struct throtl_grp *tg)
|
throtl_destroy_tg(struct throtl_data *td, struct throtl_grp *tg)
|
||||||
@ -920,7 +923,7 @@ static void throtl_update_blkio_group_read_bps(void *key,
|
|||||||
smp_mb__after_atomic_inc();
|
smp_mb__after_atomic_inc();
|
||||||
|
|
||||||
/* Schedule a work now to process the limit change */
|
/* Schedule a work now to process the limit change */
|
||||||
throtl_schedule_delayed_work(td->queue, 0);
|
throtl_schedule_delayed_work(td, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void throtl_update_blkio_group_write_bps(void *key,
|
static void throtl_update_blkio_group_write_bps(void *key,
|
||||||
@ -934,7 +937,7 @@ static void throtl_update_blkio_group_write_bps(void *key,
|
|||||||
smp_mb__before_atomic_inc();
|
smp_mb__before_atomic_inc();
|
||||||
atomic_inc(&td->limits_changed);
|
atomic_inc(&td->limits_changed);
|
||||||
smp_mb__after_atomic_inc();
|
smp_mb__after_atomic_inc();
|
||||||
throtl_schedule_delayed_work(td->queue, 0);
|
throtl_schedule_delayed_work(td, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void throtl_update_blkio_group_read_iops(void *key,
|
static void throtl_update_blkio_group_read_iops(void *key,
|
||||||
@ -948,7 +951,7 @@ static void throtl_update_blkio_group_read_iops(void *key,
|
|||||||
smp_mb__before_atomic_inc();
|
smp_mb__before_atomic_inc();
|
||||||
atomic_inc(&td->limits_changed);
|
atomic_inc(&td->limits_changed);
|
||||||
smp_mb__after_atomic_inc();
|
smp_mb__after_atomic_inc();
|
||||||
throtl_schedule_delayed_work(td->queue, 0);
|
throtl_schedule_delayed_work(td, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void throtl_update_blkio_group_write_iops(void *key,
|
static void throtl_update_blkio_group_write_iops(void *key,
|
||||||
@ -962,7 +965,7 @@ static void throtl_update_blkio_group_write_iops(void *key,
|
|||||||
smp_mb__before_atomic_inc();
|
smp_mb__before_atomic_inc();
|
||||||
atomic_inc(&td->limits_changed);
|
atomic_inc(&td->limits_changed);
|
||||||
smp_mb__after_atomic_inc();
|
smp_mb__after_atomic_inc();
|
||||||
throtl_schedule_delayed_work(td->queue, 0);
|
throtl_schedule_delayed_work(td, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void throtl_shutdown_wq(struct request_queue *q)
|
static void throtl_shutdown_wq(struct request_queue *q)
|
||||||
@ -1135,6 +1138,10 @@ void blk_throtl_exit(struct request_queue *q)
|
|||||||
|
|
||||||
static int __init throtl_init(void)
|
static int __init throtl_init(void)
|
||||||
{
|
{
|
||||||
|
kthrotld_workqueue = alloc_workqueue("kthrotld", WQ_MEM_RECLAIM, 0);
|
||||||
|
if (!kthrotld_workqueue)
|
||||||
|
panic("Failed to create kthrotld\n");
|
||||||
|
|
||||||
blkio_policy_register(&blkio_policy_throtl);
|
blkio_policy_register(&blkio_policy_throtl);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3324,7 +3324,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||||||
cfqd->busy_queues > 1) {
|
cfqd->busy_queues > 1) {
|
||||||
cfq_del_timer(cfqd, cfqq);
|
cfq_del_timer(cfqd, cfqq);
|
||||||
cfq_clear_cfqq_wait_request(cfqq);
|
cfq_clear_cfqq_wait_request(cfqq);
|
||||||
__blk_run_queue(cfqd->queue);
|
__blk_run_queue(cfqd->queue, false);
|
||||||
} else {
|
} else {
|
||||||
cfq_blkiocg_update_idle_time_stats(
|
cfq_blkiocg_update_idle_time_stats(
|
||||||
&cfqq->cfqg->blkg);
|
&cfqq->cfqg->blkg);
|
||||||
@ -3339,7 +3339,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||||||
* this new queue is RT and the current one is BE
|
* this new queue is RT and the current one is BE
|
||||||
*/
|
*/
|
||||||
cfq_preempt_queue(cfqd, cfqq);
|
cfq_preempt_queue(cfqd, cfqq);
|
||||||
__blk_run_queue(cfqd->queue);
|
__blk_run_queue(cfqd->queue, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3700,7 +3700,7 @@ static void cfq_kick_queue(struct work_struct *work)
|
|||||||
struct request_queue *q = cfqd->queue;
|
struct request_queue *q = cfqd->queue;
|
||||||
|
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
__blk_run_queue(cfqd->queue);
|
__blk_run_queue(cfqd->queue, false);
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,7 +602,7 @@ void elv_quiesce_start(struct request_queue *q)
|
|||||||
*/
|
*/
|
||||||
elv_drain_elevator(q);
|
elv_drain_elevator(q);
|
||||||
while (q->rq.elvpriv) {
|
while (q->rq.elvpriv) {
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, false);
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
@ -651,7 +651,7 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
|
|||||||
* with anything. There's no point in delaying queue
|
* with anything. There's no point in delaying queue
|
||||||
* processing.
|
* processing.
|
||||||
*/
|
*/
|
||||||
__blk_run_queue(q);
|
__blk_run_queue(q, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ELEVATOR_INSERT_SORT:
|
case ELEVATOR_INSERT_SORT:
|
||||||
|
@ -1355,7 +1355,7 @@ int invalidate_partition(struct gendisk *disk, int partno)
|
|||||||
struct block_device *bdev = bdget_disk(disk, partno);
|
struct block_device *bdev = bdget_disk(disk, partno);
|
||||||
if (bdev) {
|
if (bdev) {
|
||||||
fsync_bdev(bdev);
|
fsync_bdev(bdev);
|
||||||
res = __invalidate_device(bdev);
|
res = __invalidate_device(bdev, true);
|
||||||
bdput(bdev);
|
bdput(bdev);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
@ -294,9 +294,11 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(n, (int __user *) arg))
|
if (get_user(n, (int __user *) arg))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!(mode & FMODE_EXCL) &&
|
if (!(mode & FMODE_EXCL)) {
|
||||||
blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
|
bdgrab(bdev);
|
||||||
return -EBUSY;
|
if (blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
ret = set_blocksize(bdev, n);
|
ret = set_blocksize(bdev, n);
|
||||||
if (!(mode & FMODE_EXCL))
|
if (!(mode & FMODE_EXCL))
|
||||||
blkdev_put(bdev, mode | FMODE_EXCL);
|
blkdev_put(bdev, mode | FMODE_EXCL);
|
||||||
|
@ -3281,7 +3281,7 @@ static int set_geometry(unsigned int cmd, struct floppy_struct *g,
|
|||||||
struct block_device *bdev = opened_bdev[cnt];
|
struct block_device *bdev = opened_bdev[cnt];
|
||||||
if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
|
if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
|
||||||
continue;
|
continue;
|
||||||
__invalidate_device(bdev);
|
__invalidate_device(bdev, true);
|
||||||
}
|
}
|
||||||
mutex_unlock(&open_lock);
|
mutex_unlock(&open_lock);
|
||||||
} else {
|
} else {
|
||||||
|
@ -78,7 +78,6 @@
|
|||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
static DEFINE_MUTEX(loop_mutex);
|
|
||||||
static LIST_HEAD(loop_devices);
|
static LIST_HEAD(loop_devices);
|
||||||
static DEFINE_MUTEX(loop_devices_mutex);
|
static DEFINE_MUTEX(loop_devices_mutex);
|
||||||
|
|
||||||
@ -1501,11 +1500,9 @@ static int lo_open(struct block_device *bdev, fmode_t mode)
|
|||||||
{
|
{
|
||||||
struct loop_device *lo = bdev->bd_disk->private_data;
|
struct loop_device *lo = bdev->bd_disk->private_data;
|
||||||
|
|
||||||
mutex_lock(&loop_mutex);
|
|
||||||
mutex_lock(&lo->lo_ctl_mutex);
|
mutex_lock(&lo->lo_ctl_mutex);
|
||||||
lo->lo_refcnt++;
|
lo->lo_refcnt++;
|
||||||
mutex_unlock(&lo->lo_ctl_mutex);
|
mutex_unlock(&lo->lo_ctl_mutex);
|
||||||
mutex_unlock(&loop_mutex);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1515,7 +1512,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
|
|||||||
struct loop_device *lo = disk->private_data;
|
struct loop_device *lo = disk->private_data;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
mutex_lock(&loop_mutex);
|
|
||||||
mutex_lock(&lo->lo_ctl_mutex);
|
mutex_lock(&lo->lo_ctl_mutex);
|
||||||
|
|
||||||
if (--lo->lo_refcnt)
|
if (--lo->lo_refcnt)
|
||||||
@ -1540,7 +1536,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
|
|||||||
out:
|
out:
|
||||||
mutex_unlock(&lo->lo_ctl_mutex);
|
mutex_unlock(&lo->lo_ctl_mutex);
|
||||||
out_unlocked:
|
out_unlocked:
|
||||||
mutex_unlock(&loop_mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,9 @@ static struct usb_device_id ath3k_table[] = {
|
|||||||
|
|
||||||
/* Atheros AR9285 Malbec with sflash firmware */
|
/* Atheros AR9285 Malbec with sflash firmware */
|
||||||
{ USB_DEVICE(0x03F0, 0x311D) },
|
{ USB_DEVICE(0x03F0, 0x311D) },
|
||||||
|
|
||||||
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
|
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -105,6 +105,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||||||
/* Atheros AR9285 Malbec with sflash firmware */
|
/* Atheros AR9285 Malbec with sflash firmware */
|
||||||
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
||||||
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
|
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
||||||
/* Broadcom BCM2035 */
|
/* Broadcom BCM2035 */
|
||||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||||
@ -829,7 +832,7 @@ static void btusb_work(struct work_struct *work)
|
|||||||
|
|
||||||
if (hdev->conn_hash.sco_num > 0) {
|
if (hdev->conn_hash.sco_num > 0) {
|
||||||
if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
|
if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
|
||||||
err = usb_autopm_get_interface(data->isoc);
|
err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
||||||
usb_kill_anchored_urbs(&data->isoc_anchor);
|
usb_kill_anchored_urbs(&data->isoc_anchor);
|
||||||
@ -858,7 +861,7 @@ static void btusb_work(struct work_struct *work)
|
|||||||
|
|
||||||
__set_isoc_interface(hdev, 0);
|
__set_isoc_interface(hdev, 0);
|
||||||
if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
|
if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
|
||||||
usb_autopm_put_interface(data->isoc);
|
usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1041,8 +1044,6 @@ static int btusb_probe(struct usb_interface *intf,
|
|||||||
|
|
||||||
usb_set_intfdata(intf, data);
|
usb_set_intfdata(intf, data);
|
||||||
|
|
||||||
usb_enable_autosuspend(interface_to_usbdev(intf));
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -773,18 +773,23 @@ int __init agp_amd64_init(void)
|
|||||||
#else
|
#else
|
||||||
printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n");
|
printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n");
|
||||||
#endif
|
#endif
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First check that we have at least one AMD64 NB */
|
/* First check that we have at least one AMD64 NB */
|
||||||
if (!pci_dev_present(amd_nb_misc_ids))
|
if (!pci_dev_present(amd_nb_misc_ids)) {
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/* Look for any AGP bridge */
|
/* Look for any AGP bridge */
|
||||||
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
||||||
err = driver_attach(&agp_amd64_pci_driver.driver);
|
err = driver_attach(&agp_amd64_pci_driver.driver);
|
||||||
if (err == 0 && agp_bridges_found == 0)
|
if (err == 0 && agp_bridges_found == 0) {
|
||||||
|
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +130,7 @@
|
|||||||
#define INTEL_GMCH_GMS_STOLEN_352M (0xd << 4)
|
#define INTEL_GMCH_GMS_STOLEN_352M (0xd << 4)
|
||||||
|
|
||||||
#define I915_IFPADDR 0x60
|
#define I915_IFPADDR 0x60
|
||||||
|
#define I830_HIC 0x70
|
||||||
|
|
||||||
/* Intel 965G registers */
|
/* Intel 965G registers */
|
||||||
#define I965_MSAC 0x62
|
#define I965_MSAC 0x62
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/agp_backend.h>
|
#include <linux/agp_backend.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include "agp.h"
|
#include "agp.h"
|
||||||
#include "intel-agp.h"
|
#include "intel-agp.h"
|
||||||
@ -70,12 +71,8 @@ static struct _intel_private {
|
|||||||
u32 __iomem *gtt; /* I915G */
|
u32 __iomem *gtt; /* I915G */
|
||||||
bool clear_fake_agp; /* on first access via agp, fill with scratch */
|
bool clear_fake_agp; /* on first access via agp, fill with scratch */
|
||||||
int num_dcache_entries;
|
int num_dcache_entries;
|
||||||
union {
|
void __iomem *i9xx_flush_page;
|
||||||
void __iomem *i9xx_flush_page;
|
|
||||||
void *i8xx_flush_page;
|
|
||||||
};
|
|
||||||
char *i81x_gtt_table;
|
char *i81x_gtt_table;
|
||||||
struct page *i8xx_page;
|
|
||||||
struct resource ifp_resource;
|
struct resource ifp_resource;
|
||||||
int resource_valid;
|
int resource_valid;
|
||||||
struct page *scratch_page;
|
struct page *scratch_page;
|
||||||
@ -722,28 +719,6 @@ static int intel_fake_agp_fetch_size(void)
|
|||||||
|
|
||||||
static void i830_cleanup(void)
|
static void i830_cleanup(void)
|
||||||
{
|
{
|
||||||
if (intel_private.i8xx_flush_page) {
|
|
||||||
kunmap(intel_private.i8xx_flush_page);
|
|
||||||
intel_private.i8xx_flush_page = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
__free_page(intel_private.i8xx_page);
|
|
||||||
intel_private.i8xx_page = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void intel_i830_setup_flush(void)
|
|
||||||
{
|
|
||||||
/* return if we've already set the flush mechanism up */
|
|
||||||
if (intel_private.i8xx_page)
|
|
||||||
return;
|
|
||||||
|
|
||||||
intel_private.i8xx_page = alloc_page(GFP_KERNEL);
|
|
||||||
if (!intel_private.i8xx_page)
|
|
||||||
return;
|
|
||||||
|
|
||||||
intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page);
|
|
||||||
if (!intel_private.i8xx_flush_page)
|
|
||||||
i830_cleanup();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The chipset_flush interface needs to get data that has already been
|
/* The chipset_flush interface needs to get data that has already been
|
||||||
@ -758,14 +733,27 @@ static void intel_i830_setup_flush(void)
|
|||||||
*/
|
*/
|
||||||
static void i830_chipset_flush(void)
|
static void i830_chipset_flush(void)
|
||||||
{
|
{
|
||||||
unsigned int *pg = intel_private.i8xx_flush_page;
|
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
|
||||||
|
|
||||||
memset(pg, 0, 1024);
|
/* Forcibly evict everything from the CPU write buffers.
|
||||||
|
* clflush appears to be insufficient.
|
||||||
|
*/
|
||||||
|
wbinvd_on_all_cpus();
|
||||||
|
|
||||||
if (cpu_has_clflush)
|
/* Now we've only seen documents for this magic bit on 855GM,
|
||||||
clflush_cache_range(pg, 1024);
|
* we hope it exists for the other gen2 chipsets...
|
||||||
else if (wbinvd_on_all_cpus() != 0)
|
*
|
||||||
printk(KERN_ERR "Timed out waiting for cache flush.\n");
|
* Also works as advertised on my 845G.
|
||||||
|
*/
|
||||||
|
writel(readl(intel_private.registers+I830_HIC) | (1<<31),
|
||||||
|
intel_private.registers+I830_HIC);
|
||||||
|
|
||||||
|
while (readl(intel_private.registers+I830_HIC) & (1<<31)) {
|
||||||
|
if (time_after(jiffies, timeout))
|
||||||
|
break;
|
||||||
|
|
||||||
|
udelay(50);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void i830_write_entry(dma_addr_t addr, unsigned int entry,
|
static void i830_write_entry(dma_addr_t addr, unsigned int entry,
|
||||||
@ -849,8 +837,6 @@ static int i830_setup(void)
|
|||||||
|
|
||||||
intel_private.gtt_bus_addr = reg_addr + I810_PTE_BASE;
|
intel_private.gtt_bus_addr = reg_addr + I810_PTE_BASE;
|
||||||
|
|
||||||
intel_i830_setup_flush();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -830,8 +830,7 @@ static void monitor_card(unsigned long p)
|
|||||||
test_bit(IS_ANY_T1, &dev->flags))) {
|
test_bit(IS_ANY_T1, &dev->flags))) {
|
||||||
DEBUGP(4, dev, "Perform AUTOPPS\n");
|
DEBUGP(4, dev, "Perform AUTOPPS\n");
|
||||||
set_bit(IS_AUTOPPS_ACT, &dev->flags);
|
set_bit(IS_AUTOPPS_ACT, &dev->flags);
|
||||||
ptsreq.protocol = ptsreq.protocol =
|
ptsreq.protocol = (0x01 << dev->proto);
|
||||||
(0x01 << dev->proto);
|
|
||||||
ptsreq.flags = 0x01;
|
ptsreq.flags = 0x01;
|
||||||
ptsreq.pts1 = 0x00;
|
ptsreq.pts1 = 0x00;
|
||||||
ptsreq.pts2 = 0x00;
|
ptsreq.pts2 = 0x00;
|
||||||
|
@ -78,7 +78,6 @@ static void signalled_reboot_callback(void *callback_data)
|
|||||||
static int ipwireless_probe(struct pcmcia_device *p_dev, void *priv_data)
|
static int ipwireless_probe(struct pcmcia_device *p_dev, void *priv_data)
|
||||||
{
|
{
|
||||||
struct ipw_dev *ipw = priv_data;
|
struct ipw_dev *ipw = priv_data;
|
||||||
struct resource *io_resource;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||||
@ -92,9 +91,12 @@ static int ipwireless_probe(struct pcmcia_device *p_dev, void *priv_data)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
io_resource = request_region(p_dev->resource[0]->start,
|
if (!request_region(p_dev->resource[0]->start,
|
||||||
resource_size(p_dev->resource[0]),
|
resource_size(p_dev->resource[0]),
|
||||||
IPWIRELESS_PCCARD_NAME);
|
IPWIRELESS_PCCARD_NAME)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
p_dev->resource[2]->flags |=
|
p_dev->resource[2]->flags |=
|
||||||
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
||||||
@ -105,22 +107,25 @@ static int ipwireless_probe(struct pcmcia_device *p_dev, void *priv_data)
|
|||||||
|
|
||||||
ret = pcmcia_map_mem_page(p_dev, p_dev->resource[2], p_dev->card_addr);
|
ret = pcmcia_map_mem_page(p_dev, p_dev->resource[2], p_dev->card_addr);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto exit2;
|
goto exit1;
|
||||||
|
|
||||||
ipw->is_v2_card = resource_size(p_dev->resource[2]) == 0x100;
|
ipw->is_v2_card = resource_size(p_dev->resource[2]) == 0x100;
|
||||||
|
|
||||||
ipw->attr_memory = ioremap(p_dev->resource[2]->start,
|
ipw->common_memory = ioremap(p_dev->resource[2]->start,
|
||||||
resource_size(p_dev->resource[2]));
|
resource_size(p_dev->resource[2]));
|
||||||
request_mem_region(p_dev->resource[2]->start,
|
if (!request_mem_region(p_dev->resource[2]->start,
|
||||||
resource_size(p_dev->resource[2]),
|
resource_size(p_dev->resource[2]),
|
||||||
IPWIRELESS_PCCARD_NAME);
|
IPWIRELESS_PCCARD_NAME)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto exit2;
|
||||||
|
}
|
||||||
|
|
||||||
p_dev->resource[3]->flags |= WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM |
|
p_dev->resource[3]->flags |= WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM |
|
||||||
WIN_ENABLE;
|
WIN_ENABLE;
|
||||||
p_dev->resource[3]->end = 0; /* this used to be 0x1000 */
|
p_dev->resource[3]->end = 0; /* this used to be 0x1000 */
|
||||||
ret = pcmcia_request_window(p_dev, p_dev->resource[3], 0);
|
ret = pcmcia_request_window(p_dev, p_dev->resource[3], 0);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto exit2;
|
goto exit3;
|
||||||
|
|
||||||
ret = pcmcia_map_mem_page(p_dev, p_dev->resource[3], 0);
|
ret = pcmcia_map_mem_page(p_dev, p_dev->resource[3], 0);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -128,23 +133,28 @@ static int ipwireless_probe(struct pcmcia_device *p_dev, void *priv_data)
|
|||||||
|
|
||||||
ipw->attr_memory = ioremap(p_dev->resource[3]->start,
|
ipw->attr_memory = ioremap(p_dev->resource[3]->start,
|
||||||
resource_size(p_dev->resource[3]));
|
resource_size(p_dev->resource[3]));
|
||||||
request_mem_region(p_dev->resource[3]->start,
|
if (!request_mem_region(p_dev->resource[3]->start,
|
||||||
resource_size(p_dev->resource[3]),
|
resource_size(p_dev->resource[3]),
|
||||||
IPWIRELESS_PCCARD_NAME);
|
IPWIRELESS_PCCARD_NAME)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto exit4;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
exit4:
|
||||||
|
iounmap(ipw->attr_memory);
|
||||||
exit3:
|
exit3:
|
||||||
|
release_mem_region(p_dev->resource[2]->start,
|
||||||
|
resource_size(p_dev->resource[2]));
|
||||||
exit2:
|
exit2:
|
||||||
if (ipw->common_memory) {
|
iounmap(ipw->common_memory);
|
||||||
release_mem_region(p_dev->resource[2]->start,
|
|
||||||
resource_size(p_dev->resource[2]));
|
|
||||||
iounmap(ipw->common_memory);
|
|
||||||
}
|
|
||||||
exit1:
|
exit1:
|
||||||
release_resource(io_resource);
|
release_region(p_dev->resource[0]->start,
|
||||||
|
resource_size(p_dev->resource[0]));
|
||||||
|
exit:
|
||||||
pcmcia_disable_device(p_dev);
|
pcmcia_disable_device(p_dev);
|
||||||
return -1;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int config_ipwireless(struct ipw_dev *ipw)
|
static int config_ipwireless(struct ipw_dev *ipw)
|
||||||
@ -219,6 +229,8 @@ exit:
|
|||||||
|
|
||||||
static void release_ipwireless(struct ipw_dev *ipw)
|
static void release_ipwireless(struct ipw_dev *ipw)
|
||||||
{
|
{
|
||||||
|
release_region(ipw->link->resource[0]->start,
|
||||||
|
resource_size(ipw->link->resource[0]));
|
||||||
if (ipw->common_memory) {
|
if (ipw->common_memory) {
|
||||||
release_mem_region(ipw->link->resource[2]->start,
|
release_mem_region(ipw->link->resource[2]->start,
|
||||||
resource_size(ipw->link->resource[2]));
|
resource_size(ipw->link->resource[2]));
|
||||||
|
@ -164,8 +164,10 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
|
|||||||
* available. In that case we can't account for this and just
|
* available. In that case we can't account for this and just
|
||||||
* hope for the best.
|
* hope for the best.
|
||||||
*/
|
*/
|
||||||
if ((vblrc > 0) && (abs(diff_ns) > 1000000))
|
if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
|
||||||
atomic_inc(&dev->_vblank_count[crtc]);
|
atomic_inc(&dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
|
}
|
||||||
|
|
||||||
/* Invalidate all timestamps while vblank irq's are off. */
|
/* Invalidate all timestamps while vblank irq's are off. */
|
||||||
clear_vblank_timestamps(dev, crtc);
|
clear_vblank_timestamps(dev, crtc);
|
||||||
@ -491,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc)
|
|||||||
/* Dot clock in Hz: */
|
/* Dot clock in Hz: */
|
||||||
dotclock = (u64) crtc->hwmode.clock * 1000;
|
dotclock = (u64) crtc->hwmode.clock * 1000;
|
||||||
|
|
||||||
|
/* Fields of interlaced scanout modes are only halve a frame duration.
|
||||||
|
* Double the dotclock to get halve the frame-/line-/pixelduration.
|
||||||
|
*/
|
||||||
|
if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
|
dotclock *= 2;
|
||||||
|
|
||||||
/* Valid dotclock? */
|
/* Valid dotclock? */
|
||||||
if (dotclock > 0) {
|
if (dotclock > 0) {
|
||||||
/* Convert scanline length in pixels and video dot clock to
|
/* Convert scanline length in pixels and video dot clock to
|
||||||
@ -603,14 +611,6 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
|
|||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't know yet how to handle interlaced or
|
|
||||||
* double scan modes. Just no-op for now.
|
|
||||||
*/
|
|
||||||
if (mode->flags & (DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLSCAN)) {
|
|
||||||
DRM_DEBUG("crtc %d: Noop due to unsupported mode.\n", crtc);
|
|
||||||
return -ENOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get current scanout position with system timestamp.
|
/* Get current scanout position with system timestamp.
|
||||||
* Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
|
* Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
|
||||||
* if single query takes longer than max_error nanoseconds.
|
* if single query takes longer than max_error nanoseconds.
|
||||||
@ -858,10 +858,11 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)
|
|||||||
if (rc) {
|
if (rc) {
|
||||||
tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
|
tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
|
||||||
vblanktimestamp(dev, crtc, tslot) = t_vblank;
|
vblanktimestamp(dev, crtc, tslot) = t_vblank;
|
||||||
smp_wmb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
smp_mb__before_atomic_inc();
|
||||||
atomic_add(diff, &dev->_vblank_count[crtc]);
|
atomic_add(diff, &dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1011,7 +1012,8 @@ int drm_modeset_ctl(struct drm_device *dev, void *data,
|
|||||||
struct drm_file *file_priv)
|
struct drm_file *file_priv)
|
||||||
{
|
{
|
||||||
struct drm_modeset_ctl *modeset = data;
|
struct drm_modeset_ctl *modeset = data;
|
||||||
int crtc, ret = 0;
|
int ret = 0;
|
||||||
|
unsigned int crtc;
|
||||||
|
|
||||||
/* If drm_vblank_init() hasn't been called yet, just no-op */
|
/* If drm_vblank_init() hasn't been called yet, just no-op */
|
||||||
if (!dev->num_crtcs)
|
if (!dev->num_crtcs)
|
||||||
@ -1293,15 +1295,16 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc)
|
|||||||
* e.g., due to spurious vblank interrupts. We need to
|
* e.g., due to spurious vblank interrupts. We need to
|
||||||
* ignore those for accounting.
|
* ignore those for accounting.
|
||||||
*/
|
*/
|
||||||
if (abs(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
|
if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
|
||||||
/* Store new timestamp in ringbuffer. */
|
/* Store new timestamp in ringbuffer. */
|
||||||
vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
|
vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
|
||||||
smp_wmb();
|
|
||||||
|
|
||||||
/* Increment cooked vblank count. This also atomically commits
|
/* Increment cooked vblank count. This also atomically commits
|
||||||
* the timestamp computed above.
|
* the timestamp computed above.
|
||||||
*/
|
*/
|
||||||
|
smp_mb__before_atomic_inc();
|
||||||
atomic_inc(&dev->_vblank_count[crtc]);
|
atomic_inc(&dev->_vblank_count[crtc]);
|
||||||
|
smp_mb__after_atomic_inc();
|
||||||
} else {
|
} else {
|
||||||
DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
|
DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
|
||||||
crtc, (int) diff_ns);
|
crtc, (int) diff_ns);
|
||||||
|
@ -184,7 +184,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
|
|||||||
static bool
|
static bool
|
||||||
i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
|
i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
|
||||||
{
|
{
|
||||||
int tile_width;
|
int tile_width, tile_height;
|
||||||
|
|
||||||
/* Linear is always fine */
|
/* Linear is always fine */
|
||||||
if (tiling_mode == I915_TILING_NONE)
|
if (tiling_mode == I915_TILING_NONE)
|
||||||
@ -215,6 +215,20 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_GEN2(dev) ||
|
||||||
|
(tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)))
|
||||||
|
tile_height = 32;
|
||||||
|
else
|
||||||
|
tile_height = 8;
|
||||||
|
/* i8xx is strange: It has 2 interleaved rows of tiles, so needs an even
|
||||||
|
* number of tile rows. */
|
||||||
|
if (IS_GEN2(dev))
|
||||||
|
tile_height *= 2;
|
||||||
|
|
||||||
|
/* Size needs to be aligned to a full tile row */
|
||||||
|
if (size & (tile_height * stride - 1))
|
||||||
|
return false;
|
||||||
|
|
||||||
/* 965+ just needs multiples of tile width */
|
/* 965+ just needs multiples of tile width */
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
if (stride & (tile_width - 1))
|
if (stride & (tile_width - 1))
|
||||||
|
@ -316,6 +316,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
|||||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||||
struct intel_encoder *encoder;
|
struct intel_encoder *encoder;
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("running encoder hotplug functions\n");
|
||||||
|
|
||||||
list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
|
list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
|
||||||
if (encoder->hot_plug)
|
if (encoder->hot_plug)
|
||||||
encoder->hot_plug(encoder);
|
encoder->hot_plug(encoder);
|
||||||
@ -1649,9 +1651,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
|||||||
} else {
|
} else {
|
||||||
hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
||||||
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
||||||
hotplug_mask |= SDE_AUX_MASK | SDE_FDI_MASK | SDE_TRANS_MASK;
|
hotplug_mask |= SDE_AUX_MASK;
|
||||||
I915_WRITE(FDI_RXA_IMR, 0);
|
|
||||||
I915_WRITE(FDI_RXB_IMR, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_priv->pch_irq_mask = ~hotplug_mask;
|
dev_priv->pch_irq_mask = ~hotplug_mask;
|
||||||
|
@ -1630,19 +1630,19 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
|
|||||||
struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
|
struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
|
||||||
|
|
||||||
wait_event(dev_priv->pending_flip_queue,
|
wait_event(dev_priv->pending_flip_queue,
|
||||||
|
atomic_read(&dev_priv->mm.wedged) ||
|
||||||
atomic_read(&obj->pending_flip) == 0);
|
atomic_read(&obj->pending_flip) == 0);
|
||||||
|
|
||||||
/* Big Hammer, we also need to ensure that any pending
|
/* Big Hammer, we also need to ensure that any pending
|
||||||
* MI_WAIT_FOR_EVENT inside a user batch buffer on the
|
* MI_WAIT_FOR_EVENT inside a user batch buffer on the
|
||||||
* current scanout is retired before unpinning the old
|
* current scanout is retired before unpinning the old
|
||||||
* framebuffer.
|
* framebuffer.
|
||||||
|
*
|
||||||
|
* This should only fail upon a hung GPU, in which case we
|
||||||
|
* can safely continue.
|
||||||
*/
|
*/
|
||||||
ret = i915_gem_object_flush_gpu(obj, false);
|
ret = i915_gem_object_flush_gpu(obj, false);
|
||||||
if (ret) {
|
(void) ret;
|
||||||
i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
|
|
||||||
mutex_unlock(&dev->struct_mutex);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y,
|
ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y,
|
||||||
@ -2045,6 +2045,31 @@ static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
|
|||||||
atomic_read(&obj->pending_flip) == 0);
|
atomic_read(&obj->pending_flip) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool intel_crtc_driving_pch(struct drm_crtc *crtc)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = crtc->dev;
|
||||||
|
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||||
|
struct intel_encoder *encoder;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there's a non-PCH eDP on this crtc, it must be DP_A, and that
|
||||||
|
* must be driven by its own crtc; no sharing is possible.
|
||||||
|
*/
|
||||||
|
list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
|
||||||
|
if (encoder->base.crtc != crtc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (encoder->type) {
|
||||||
|
case INTEL_OUTPUT_EDP:
|
||||||
|
if (!intel_encoder_is_pch_edp(&encoder->base))
|
||||||
|
return false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
@ -2053,6 +2078,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
int plane = intel_crtc->plane;
|
int plane = intel_crtc->plane;
|
||||||
u32 reg, temp;
|
u32 reg, temp;
|
||||||
|
bool is_pch_port = false;
|
||||||
|
|
||||||
if (intel_crtc->active)
|
if (intel_crtc->active)
|
||||||
return;
|
return;
|
||||||
@ -2066,7 +2092,56 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||||||
I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
|
I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
ironlake_fdi_enable(crtc);
|
is_pch_port = intel_crtc_driving_pch(crtc);
|
||||||
|
|
||||||
|
if (is_pch_port)
|
||||||
|
ironlake_fdi_enable(crtc);
|
||||||
|
else {
|
||||||
|
/* disable CPU FDI tx and PCH FDI rx */
|
||||||
|
reg = FDI_TX_CTL(pipe);
|
||||||
|
temp = I915_READ(reg);
|
||||||
|
I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
|
||||||
|
POSTING_READ(reg);
|
||||||
|
|
||||||
|
reg = FDI_RX_CTL(pipe);
|
||||||
|
temp = I915_READ(reg);
|
||||||
|
temp &= ~(0x7 << 16);
|
||||||
|
temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
|
||||||
|
I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
|
||||||
|
|
||||||
|
POSTING_READ(reg);
|
||||||
|
udelay(100);
|
||||||
|
|
||||||
|
/* Ironlake workaround, disable clock pointer after downing FDI */
|
||||||
|
if (HAS_PCH_IBX(dev))
|
||||||
|
I915_WRITE(FDI_RX_CHICKEN(pipe),
|
||||||
|
I915_READ(FDI_RX_CHICKEN(pipe) &
|
||||||
|
~FDI_RX_PHASE_SYNC_POINTER_ENABLE));
|
||||||
|
|
||||||
|
/* still set train pattern 1 */
|
||||||
|
reg = FDI_TX_CTL(pipe);
|
||||||
|
temp = I915_READ(reg);
|
||||||
|
temp &= ~FDI_LINK_TRAIN_NONE;
|
||||||
|
temp |= FDI_LINK_TRAIN_PATTERN_1;
|
||||||
|
I915_WRITE(reg, temp);
|
||||||
|
|
||||||
|
reg = FDI_RX_CTL(pipe);
|
||||||
|
temp = I915_READ(reg);
|
||||||
|
if (HAS_PCH_CPT(dev)) {
|
||||||
|
temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
|
||||||
|
temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
|
||||||
|
} else {
|
||||||
|
temp &= ~FDI_LINK_TRAIN_NONE;
|
||||||
|
temp |= FDI_LINK_TRAIN_PATTERN_1;
|
||||||
|
}
|
||||||
|
/* BPC in FDI rx is consistent with that in PIPECONF */
|
||||||
|
temp &= ~(0x07 << 16);
|
||||||
|
temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
|
||||||
|
I915_WRITE(reg, temp);
|
||||||
|
|
||||||
|
POSTING_READ(reg);
|
||||||
|
udelay(100);
|
||||||
|
}
|
||||||
|
|
||||||
/* Enable panel fitting for LVDS */
|
/* Enable panel fitting for LVDS */
|
||||||
if (dev_priv->pch_pf_size &&
|
if (dev_priv->pch_pf_size &&
|
||||||
@ -2100,6 +2175,10 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||||||
intel_flush_display_plane(dev, plane);
|
intel_flush_display_plane(dev, plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip the PCH stuff if possible */
|
||||||
|
if (!is_pch_port)
|
||||||
|
goto done;
|
||||||
|
|
||||||
/* For PCH output, training FDI link */
|
/* For PCH output, training FDI link */
|
||||||
if (IS_GEN6(dev))
|
if (IS_GEN6(dev))
|
||||||
gen6_fdi_link_train(crtc);
|
gen6_fdi_link_train(crtc);
|
||||||
@ -2184,7 +2263,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||||||
I915_WRITE(reg, temp | TRANS_ENABLE);
|
I915_WRITE(reg, temp | TRANS_ENABLE);
|
||||||
if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
|
if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
|
||||||
DRM_ERROR("failed to enable transcoder %d\n", pipe);
|
DRM_ERROR("failed to enable transcoder %d\n", pipe);
|
||||||
|
done:
|
||||||
intel_crtc_load_lut(crtc);
|
intel_crtc_load_lut(crtc);
|
||||||
intel_update_fbc(dev);
|
intel_update_fbc(dev);
|
||||||
intel_crtc_update_cursor(crtc, true);
|
intel_crtc_update_cursor(crtc, true);
|
||||||
@ -6496,7 +6575,7 @@ static void ironlake_disable_rc6(struct drm_device *dev)
|
|||||||
POSTING_READ(RSTDBYCTL);
|
POSTING_READ(RSTDBYCTL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ironlake_disable_rc6(dev);
|
ironlake_teardown_rc6(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ironlake_setup_rc6(struct drm_device *dev)
|
static int ironlake_setup_rc6(struct drm_device *dev)
|
||||||
|
@ -49,7 +49,10 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
|
|||||||
DRM_ERROR("bo %p still attached to GEM object\n", bo);
|
DRM_ERROR("bo %p still attached to GEM object\n", bo);
|
||||||
|
|
||||||
nv10_mem_put_tile_region(dev, nvbo->tile, NULL);
|
nv10_mem_put_tile_region(dev, nvbo->tile, NULL);
|
||||||
nouveau_vm_put(&nvbo->vma);
|
if (nvbo->vma.node) {
|
||||||
|
nouveau_vm_unmap(&nvbo->vma);
|
||||||
|
nouveau_vm_put(&nvbo->vma);
|
||||||
|
}
|
||||||
kfree(nvbo);
|
kfree(nvbo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3490,7 +3490,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
|
|||||||
track->num_texture = 16;
|
track->num_texture = 16;
|
||||||
track->maxy = 4096;
|
track->maxy = 4096;
|
||||||
track->separate_cube = 0;
|
track->separate_cube = 0;
|
||||||
track->aaresolve = true;
|
track->aaresolve = false;
|
||||||
track->aa.robj = NULL;
|
track->aa.robj = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3801,8 +3801,6 @@ static int r100_startup(struct radeon_device *rdev)
|
|||||||
r100_mc_program(rdev);
|
r100_mc_program(rdev);
|
||||||
/* Resume clock */
|
/* Resume clock */
|
||||||
r100_clock_startup(rdev);
|
r100_clock_startup(rdev);
|
||||||
/* Initialize GPU configuration (# pipes, ...) */
|
|
||||||
// r100_gpu_init(rdev);
|
|
||||||
/* Initialize GART (initialize after TTM so we can allocate
|
/* Initialize GART (initialize after TTM so we can allocate
|
||||||
* memory through TTM but finalize after TTM) */
|
* memory through TTM but finalize after TTM) */
|
||||||
r100_enable_bm(rdev);
|
r100_enable_bm(rdev);
|
||||||
|
@ -971,7 +971,7 @@ void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|||||||
max_fractional_feed_div = pll->max_frac_feedback_div;
|
max_fractional_feed_div = pll->max_frac_feedback_div;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (post_div = min_post_div; post_div <= max_post_div; ++post_div) {
|
for (post_div = max_post_div; post_div >= min_post_div; --post_div) {
|
||||||
uint32_t ref_div;
|
uint32_t ref_div;
|
||||||
|
|
||||||
if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
|
if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
|
||||||
|
@ -113,11 +113,14 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
|
|||||||
u32 tiling_flags = 0;
|
u32 tiling_flags = 0;
|
||||||
int ret;
|
int ret;
|
||||||
int aligned_size, size;
|
int aligned_size, size;
|
||||||
|
int height = mode_cmd->height;
|
||||||
|
|
||||||
/* need to align pitch with crtc limits */
|
/* need to align pitch with crtc limits */
|
||||||
mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
|
mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
|
||||||
|
|
||||||
size = mode_cmd->pitch * mode_cmd->height;
|
if (rdev->family >= CHIP_R600)
|
||||||
|
height = ALIGN(mode_cmd->height, 8);
|
||||||
|
size = mode_cmd->pitch * height;
|
||||||
aligned_size = ALIGN(size, PAGE_SIZE);
|
aligned_size = ALIGN(size, PAGE_SIZE);
|
||||||
ret = radeon_gem_object_create(rdev, aligned_size, 0,
|
ret = radeon_gem_object_create(rdev, aligned_size, 0,
|
||||||
RADEON_GEM_DOMAIN_VRAM,
|
RADEON_GEM_DOMAIN_VRAM,
|
||||||
|
@ -242,6 +242,7 @@ static const struct i2c_device_id ad7414_id[] = {
|
|||||||
{ "ad7414", 0 },
|
{ "ad7414", 0 },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, ad7414_id);
|
||||||
|
|
||||||
static struct i2c_driver ad7414_driver = {
|
static struct i2c_driver ad7414_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
|
@ -334,6 +334,7 @@ static const struct i2c_device_id adt7411_id[] = {
|
|||||||
{ "adt7411", 0 },
|
{ "adt7411", 0 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, adt7411_id);
|
||||||
|
|
||||||
static struct i2c_driver adt7411_driver = {
|
static struct i2c_driver adt7411_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
|
@ -847,11 +847,15 @@ complete:
|
|||||||
dev_err(dev->dev, "Arbitration lost\n");
|
dev_err(dev->dev, "Arbitration lost\n");
|
||||||
err |= OMAP_I2C_STAT_AL;
|
err |= OMAP_I2C_STAT_AL;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* ProDB0017052: Clear ARDY bit twice
|
||||||
|
*/
|
||||||
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
||||||
OMAP_I2C_STAT_AL)) {
|
OMAP_I2C_STAT_AL)) {
|
||||||
omap_i2c_ack_stat(dev, stat &
|
omap_i2c_ack_stat(dev, stat &
|
||||||
(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
|
(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
|
||||||
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
|
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR |
|
||||||
|
OMAP_I2C_STAT_ARDY));
|
||||||
omap_i2c_complete_cmd(dev, err);
|
omap_i2c_complete_cmd(dev, err);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
@ -1137,12 +1141,41 @@ omap_i2c_remove(struct platform_device *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SUSPEND
|
||||||
|
static int omap_i2c_suspend(struct device *dev)
|
||||||
|
{
|
||||||
|
if (!pm_runtime_suspended(dev))
|
||||||
|
if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_suspend)
|
||||||
|
dev->bus->pm->runtime_suspend(dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_i2c_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
if (!pm_runtime_suspended(dev))
|
||||||
|
if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_resume)
|
||||||
|
dev->bus->pm->runtime_resume(dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct dev_pm_ops omap_i2c_pm_ops = {
|
||||||
|
.suspend = omap_i2c_suspend,
|
||||||
|
.resume = omap_i2c_resume,
|
||||||
|
};
|
||||||
|
#define OMAP_I2C_PM_OPS (&omap_i2c_pm_ops)
|
||||||
|
#else
|
||||||
|
#define OMAP_I2C_PM_OPS NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_driver omap_i2c_driver = {
|
static struct platform_driver omap_i2c_driver = {
|
||||||
.probe = omap_i2c_probe,
|
.probe = omap_i2c_probe,
|
||||||
.remove = omap_i2c_remove,
|
.remove = omap_i2c_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "omap_i2c",
|
.name = "omap_i2c",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.pm = OMAP_I2C_PM_OPS,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -942,7 +942,7 @@ stu300_probe(struct platform_device *pdev)
|
|||||||
adap->owner = THIS_MODULE;
|
adap->owner = THIS_MODULE;
|
||||||
/* DDC class but actually often used for more generic I2C */
|
/* DDC class but actually often used for more generic I2C */
|
||||||
adap->class = I2C_CLASS_DDC;
|
adap->class = I2C_CLASS_DDC;
|
||||||
strncpy(adap->name, "ST Microelectronics DDC I2C adapter",
|
strlcpy(adap->name, "ST Microelectronics DDC I2C adapter",
|
||||||
sizeof(adap->name));
|
sizeof(adap->name));
|
||||||
adap->nr = bus_nr;
|
adap->nr = bus_nr;
|
||||||
adap->algo = &stu300_algo;
|
adap->algo = &stu300_algo;
|
||||||
|
@ -360,7 +360,7 @@ static int gameport_queue_event(void *object, struct module *owner,
|
|||||||
event->owner = owner;
|
event->owner = owner;
|
||||||
|
|
||||||
list_add_tail(&event->node, &gameport_event_list);
|
list_add_tail(&event->node, &gameport_event_list);
|
||||||
schedule_work(&gameport_event_work);
|
queue_work(system_long_wq, &gameport_event_work);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&gameport_event_lock, flags);
|
spin_unlock_irqrestore(&gameport_event_lock, flags);
|
||||||
|
@ -71,8 +71,9 @@ struct tegra_kbc {
|
|||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
unsigned int repoll_dly;
|
unsigned int repoll_dly;
|
||||||
unsigned long cp_dly_jiffies;
|
unsigned long cp_dly_jiffies;
|
||||||
|
bool use_fn_map;
|
||||||
const struct tegra_kbc_platform_data *pdata;
|
const struct tegra_kbc_platform_data *pdata;
|
||||||
unsigned short keycode[KBC_MAX_KEY];
|
unsigned short keycode[KBC_MAX_KEY * 2];
|
||||||
unsigned short current_keys[KBC_MAX_KPENT];
|
unsigned short current_keys[KBC_MAX_KPENT];
|
||||||
unsigned int num_pressed_keys;
|
unsigned int num_pressed_keys;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
@ -178,6 +179,40 @@ static const u32 tegra_kbc_default_keymap[] = {
|
|||||||
KEY(15, 5, KEY_F2),
|
KEY(15, 5, KEY_F2),
|
||||||
KEY(15, 6, KEY_CAPSLOCK),
|
KEY(15, 6, KEY_CAPSLOCK),
|
||||||
KEY(15, 7, KEY_F6),
|
KEY(15, 7, KEY_F6),
|
||||||
|
|
||||||
|
/* Software Handled Function Keys */
|
||||||
|
KEY(20, 0, KEY_KP7),
|
||||||
|
|
||||||
|
KEY(21, 0, KEY_KP9),
|
||||||
|
KEY(21, 1, KEY_KP8),
|
||||||
|
KEY(21, 2, KEY_KP4),
|
||||||
|
KEY(21, 4, KEY_KP1),
|
||||||
|
|
||||||
|
KEY(22, 1, KEY_KPSLASH),
|
||||||
|
KEY(22, 2, KEY_KP6),
|
||||||
|
KEY(22, 3, KEY_KP5),
|
||||||
|
KEY(22, 4, KEY_KP3),
|
||||||
|
KEY(22, 5, KEY_KP2),
|
||||||
|
KEY(22, 7, KEY_KP0),
|
||||||
|
|
||||||
|
KEY(27, 1, KEY_KPASTERISK),
|
||||||
|
KEY(27, 3, KEY_KPMINUS),
|
||||||
|
KEY(27, 4, KEY_KPPLUS),
|
||||||
|
KEY(27, 5, KEY_KPDOT),
|
||||||
|
|
||||||
|
KEY(28, 5, KEY_VOLUMEUP),
|
||||||
|
|
||||||
|
KEY(29, 3, KEY_HOME),
|
||||||
|
KEY(29, 4, KEY_END),
|
||||||
|
KEY(29, 5, KEY_BRIGHTNESSDOWN),
|
||||||
|
KEY(29, 6, KEY_VOLUMEDOWN),
|
||||||
|
KEY(29, 7, KEY_BRIGHTNESSUP),
|
||||||
|
|
||||||
|
KEY(30, 0, KEY_NUMLOCK),
|
||||||
|
KEY(30, 1, KEY_SCROLLLOCK),
|
||||||
|
KEY(30, 2, KEY_MUTE),
|
||||||
|
|
||||||
|
KEY(31, 4, KEY_HELP),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct matrix_keymap_data tegra_kbc_default_keymap_data = {
|
static const struct matrix_keymap_data tegra_kbc_default_keymap_data = {
|
||||||
@ -224,6 +259,7 @@ static void tegra_kbc_report_keys(struct tegra_kbc *kbc)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int num_down = 0;
|
unsigned int num_down = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
bool fn_keypress = false;
|
||||||
|
|
||||||
spin_lock_irqsave(&kbc->lock, flags);
|
spin_lock_irqsave(&kbc->lock, flags);
|
||||||
for (i = 0; i < KBC_MAX_KPENT; i++) {
|
for (i = 0; i < KBC_MAX_KPENT; i++) {
|
||||||
@ -237,11 +273,28 @@ static void tegra_kbc_report_keys(struct tegra_kbc *kbc)
|
|||||||
MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT);
|
MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT);
|
||||||
|
|
||||||
scancodes[num_down] = scancode;
|
scancodes[num_down] = scancode;
|
||||||
keycodes[num_down++] = kbc->keycode[scancode];
|
keycodes[num_down] = kbc->keycode[scancode];
|
||||||
|
/* If driver uses Fn map, do not report the Fn key. */
|
||||||
|
if ((keycodes[num_down] == KEY_FN) && kbc->use_fn_map)
|
||||||
|
fn_keypress = true;
|
||||||
|
else
|
||||||
|
num_down++;
|
||||||
}
|
}
|
||||||
|
|
||||||
val >>= 8;
|
val >>= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the platform uses Fn keymaps, translate keys on a Fn keypress.
|
||||||
|
* Function keycodes are KBC_MAX_KEY apart from the plain keycodes.
|
||||||
|
*/
|
||||||
|
if (fn_keypress) {
|
||||||
|
for (i = 0; i < num_down; i++) {
|
||||||
|
scancodes[i] += KBC_MAX_KEY;
|
||||||
|
keycodes[i] = kbc->keycode[scancodes[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&kbc->lock, flags);
|
spin_unlock_irqrestore(&kbc->lock, flags);
|
||||||
|
|
||||||
tegra_kbc_report_released_keys(kbc->idev,
|
tegra_kbc_report_released_keys(kbc->idev,
|
||||||
@ -594,8 +647,11 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
input_dev->keycode = kbc->keycode;
|
input_dev->keycode = kbc->keycode;
|
||||||
input_dev->keycodesize = sizeof(kbc->keycode[0]);
|
input_dev->keycodesize = sizeof(kbc->keycode[0]);
|
||||||
input_dev->keycodemax = ARRAY_SIZE(kbc->keycode);
|
input_dev->keycodemax = KBC_MAX_KEY;
|
||||||
|
if (pdata->use_fn_map)
|
||||||
|
input_dev->keycodemax *= 2;
|
||||||
|
|
||||||
|
kbc->use_fn_map = pdata->use_fn_map;
|
||||||
keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data;
|
keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data;
|
||||||
matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
|
matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
|
||||||
input_dev->keycode, input_dev->keybit);
|
input_dev->keycode, input_dev->keybit);
|
||||||
|
@ -51,6 +51,29 @@
|
|||||||
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||||
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||||
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following describes response for the 0x0c query.
|
||||||
|
*
|
||||||
|
* byte mask name meaning
|
||||||
|
* ---- ---- ------- ------------
|
||||||
|
* 1 0x01 adjustable threshold capacitive button sensitivity
|
||||||
|
* can be adjusted
|
||||||
|
* 1 0x02 report max query 0x0d gives max coord reported
|
||||||
|
* 1 0x04 clearpad sensor is ClearPad product
|
||||||
|
* 1 0x08 advanced gesture not particularly meaningful
|
||||||
|
* 1 0x10 clickpad bit 0 1-button ClickPad
|
||||||
|
* 1 0x60 multifinger mode identifies firmware finger counting
|
||||||
|
* (not reporting!) algorithm.
|
||||||
|
* Not particularly meaningful
|
||||||
|
* 1 0x80 covered pad W clipped to 14, 15 == pad mostly covered
|
||||||
|
* 2 0x01 clickpad bit 1 2-button ClickPad
|
||||||
|
* 2 0x02 deluxe LED controls touchpad support LED commands
|
||||||
|
* ala multimedia control bar
|
||||||
|
* 2 0x04 reduced filtering firmware does less filtering on
|
||||||
|
* position data, driver should watch
|
||||||
|
* for noise.
|
||||||
|
*/
|
||||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
||||||
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
||||||
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
||||||
|
@ -299,7 +299,7 @@ static int serio_queue_event(void *object, struct module *owner,
|
|||||||
event->owner = owner;
|
event->owner = owner;
|
||||||
|
|
||||||
list_add_tail(&event->node, &serio_event_list);
|
list_add_tail(&event->node, &serio_event_list);
|
||||||
schedule_work(&serio_event_work);
|
queue_work(system_long_wq, &serio_event_work);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&serio_event_lock, flags);
|
spin_unlock_irqrestore(&serio_event_lock, flags);
|
||||||
|
@ -216,7 +216,6 @@ static int linear_run (mddev_t *mddev)
|
|||||||
|
|
||||||
if (md_check_no_bitmap(mddev))
|
if (md_check_no_bitmap(mddev))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
mddev->queue->queue_lock = &mddev->queue->__queue_lock;
|
|
||||||
conf = linear_conf(mddev, mddev->raid_disks);
|
conf = linear_conf(mddev, mddev->raid_disks);
|
||||||
|
|
||||||
if (!conf)
|
if (!conf)
|
||||||
|
@ -553,6 +553,9 @@ static mddev_t * mddev_find(dev_t unit)
|
|||||||
{
|
{
|
||||||
mddev_t *mddev, *new = NULL;
|
mddev_t *mddev, *new = NULL;
|
||||||
|
|
||||||
|
if (unit && MAJOR(unit) != MD_MAJOR)
|
||||||
|
unit &= ~((1<<MdpMinorShift)-1);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
spin_lock(&all_mddevs_lock);
|
spin_lock(&all_mddevs_lock);
|
||||||
|
|
||||||
@ -4138,10 +4141,10 @@ array_size_store(mddev_t *mddev, const char *buf, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mddev->array_sectors = sectors;
|
mddev->array_sectors = sectors;
|
||||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
if (mddev->pers) {
|
||||||
if (mddev->pers)
|
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||||
revalidate_disk(mddev->gendisk);
|
revalidate_disk(mddev->gendisk);
|
||||||
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4624,6 +4627,7 @@ static int do_md_run(mddev_t *mddev)
|
|||||||
}
|
}
|
||||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||||
revalidate_disk(mddev->gendisk);
|
revalidate_disk(mddev->gendisk);
|
||||||
|
mddev->changed = 1;
|
||||||
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
|
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
@ -4712,6 +4716,7 @@ static void md_clean(mddev_t *mddev)
|
|||||||
mddev->sync_speed_min = mddev->sync_speed_max = 0;
|
mddev->sync_speed_min = mddev->sync_speed_max = 0;
|
||||||
mddev->recovery = 0;
|
mddev->recovery = 0;
|
||||||
mddev->in_sync = 0;
|
mddev->in_sync = 0;
|
||||||
|
mddev->changed = 0;
|
||||||
mddev->degraded = 0;
|
mddev->degraded = 0;
|
||||||
mddev->safemode = 0;
|
mddev->safemode = 0;
|
||||||
mddev->bitmap_info.offset = 0;
|
mddev->bitmap_info.offset = 0;
|
||||||
@ -4827,6 +4832,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
|||||||
|
|
||||||
set_capacity(disk, 0);
|
set_capacity(disk, 0);
|
||||||
mutex_unlock(&mddev->open_mutex);
|
mutex_unlock(&mddev->open_mutex);
|
||||||
|
mddev->changed = 1;
|
||||||
revalidate_disk(disk);
|
revalidate_disk(disk);
|
||||||
|
|
||||||
if (mddev->ro)
|
if (mddev->ro)
|
||||||
@ -6011,7 +6017,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
|
|||||||
atomic_inc(&mddev->openers);
|
atomic_inc(&mddev->openers);
|
||||||
mutex_unlock(&mddev->open_mutex);
|
mutex_unlock(&mddev->open_mutex);
|
||||||
|
|
||||||
check_disk_size_change(mddev->gendisk, bdev);
|
check_disk_change(bdev);
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -6026,6 +6032,21 @@ static int md_release(struct gendisk *disk, fmode_t mode)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int md_media_changed(struct gendisk *disk)
|
||||||
|
{
|
||||||
|
mddev_t *mddev = disk->private_data;
|
||||||
|
|
||||||
|
return mddev->changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int md_revalidate(struct gendisk *disk)
|
||||||
|
{
|
||||||
|
mddev_t *mddev = disk->private_data;
|
||||||
|
|
||||||
|
mddev->changed = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
static const struct block_device_operations md_fops =
|
static const struct block_device_operations md_fops =
|
||||||
{
|
{
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
@ -6036,6 +6057,8 @@ static const struct block_device_operations md_fops =
|
|||||||
.compat_ioctl = md_compat_ioctl,
|
.compat_ioctl = md_compat_ioctl,
|
||||||
#endif
|
#endif
|
||||||
.getgeo = md_getgeo,
|
.getgeo = md_getgeo,
|
||||||
|
.media_changed = md_media_changed,
|
||||||
|
.revalidate_disk= md_revalidate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int md_thread(void * arg)
|
static int md_thread(void * arg)
|
||||||
|
@ -274,6 +274,8 @@ struct mddev_s
|
|||||||
atomic_t active; /* general refcount */
|
atomic_t active; /* general refcount */
|
||||||
atomic_t openers; /* number of active opens */
|
atomic_t openers; /* number of active opens */
|
||||||
|
|
||||||
|
int changed; /* True if we might need to
|
||||||
|
* reread partition info */
|
||||||
int degraded; /* whether md should consider
|
int degraded; /* whether md should consider
|
||||||
* adding a spare
|
* adding a spare
|
||||||
*/
|
*/
|
||||||
|
@ -435,7 +435,6 @@ static int multipath_run (mddev_t *mddev)
|
|||||||
* bookkeeping area. [whatever we allocate in multipath_run(),
|
* bookkeeping area. [whatever we allocate in multipath_run(),
|
||||||
* should be freed in multipath_stop()]
|
* should be freed in multipath_stop()]
|
||||||
*/
|
*/
|
||||||
mddev->queue->queue_lock = &mddev->queue->__queue_lock;
|
|
||||||
|
|
||||||
conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL);
|
conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL);
|
||||||
mddev->private = conf;
|
mddev->private = conf;
|
||||||
|
@ -361,7 +361,6 @@ static int raid0_run(mddev_t *mddev)
|
|||||||
if (md_check_no_bitmap(mddev))
|
if (md_check_no_bitmap(mddev))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors);
|
blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors);
|
||||||
mddev->queue->queue_lock = &mddev->queue->__queue_lock;
|
|
||||||
|
|
||||||
/* if private is not null, we are here after takeover */
|
/* if private is not null, we are here after takeover */
|
||||||
if (mddev->private == NULL) {
|
if (mddev->private == NULL) {
|
||||||
@ -670,6 +669,7 @@ static void *raid0_takeover_raid1(mddev_t *mddev)
|
|||||||
mddev->new_layout = 0;
|
mddev->new_layout = 0;
|
||||||
mddev->new_chunk_sectors = 128; /* by default set chunk size to 64k */
|
mddev->new_chunk_sectors = 128; /* by default set chunk size to 64k */
|
||||||
mddev->delta_disks = 1 - mddev->raid_disks;
|
mddev->delta_disks = 1 - mddev->raid_disks;
|
||||||
|
mddev->raid_disks = 1;
|
||||||
/* make sure it will be not marked as dirty */
|
/* make sure it will be not marked as dirty */
|
||||||
mddev->recovery_cp = MaxSector;
|
mddev->recovery_cp = MaxSector;
|
||||||
|
|
||||||
|
@ -593,7 +593,10 @@ static int flush_pending_writes(conf_t *conf)
|
|||||||
if (conf->pending_bio_list.head) {
|
if (conf->pending_bio_list.head) {
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
bio = bio_list_get(&conf->pending_bio_list);
|
bio = bio_list_get(&conf->pending_bio_list);
|
||||||
|
/* Only take the spinlock to quiet a warning */
|
||||||
|
spin_lock(conf->mddev->queue->queue_lock);
|
||||||
blk_remove_plug(conf->mddev->queue);
|
blk_remove_plug(conf->mddev->queue);
|
||||||
|
spin_unlock(conf->mddev->queue->queue_lock);
|
||||||
spin_unlock_irq(&conf->device_lock);
|
spin_unlock_irq(&conf->device_lock);
|
||||||
/* flush any pending bitmap writes to
|
/* flush any pending bitmap writes to
|
||||||
* disk before proceeding w/ I/O */
|
* disk before proceeding w/ I/O */
|
||||||
@ -959,7 +962,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
|
|||||||
atomic_inc(&r1_bio->remaining);
|
atomic_inc(&r1_bio->remaining);
|
||||||
spin_lock_irqsave(&conf->device_lock, flags);
|
spin_lock_irqsave(&conf->device_lock, flags);
|
||||||
bio_list_add(&conf->pending_bio_list, mbio);
|
bio_list_add(&conf->pending_bio_list, mbio);
|
||||||
blk_plug_device(mddev->queue);
|
blk_plug_device_unlocked(mddev->queue);
|
||||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||||
}
|
}
|
||||||
r1_bio_write_done(r1_bio, bio->bi_vcnt, behind_pages, behind_pages != NULL);
|
r1_bio_write_done(r1_bio, bio->bi_vcnt, behind_pages, behind_pages != NULL);
|
||||||
@ -2021,7 +2024,6 @@ static int run(mddev_t *mddev)
|
|||||||
if (IS_ERR(conf))
|
if (IS_ERR(conf))
|
||||||
return PTR_ERR(conf);
|
return PTR_ERR(conf);
|
||||||
|
|
||||||
mddev->queue->queue_lock = &conf->device_lock;
|
|
||||||
list_for_each_entry(rdev, &mddev->disks, same_set) {
|
list_for_each_entry(rdev, &mddev->disks, same_set) {
|
||||||
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
||||||
rdev->data_offset << 9);
|
rdev->data_offset << 9);
|
||||||
|
@ -662,7 +662,10 @@ static int flush_pending_writes(conf_t *conf)
|
|||||||
if (conf->pending_bio_list.head) {
|
if (conf->pending_bio_list.head) {
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
bio = bio_list_get(&conf->pending_bio_list);
|
bio = bio_list_get(&conf->pending_bio_list);
|
||||||
|
/* Spinlock only taken to quiet a warning */
|
||||||
|
spin_lock(conf->mddev->queue->queue_lock);
|
||||||
blk_remove_plug(conf->mddev->queue);
|
blk_remove_plug(conf->mddev->queue);
|
||||||
|
spin_unlock(conf->mddev->queue->queue_lock);
|
||||||
spin_unlock_irq(&conf->device_lock);
|
spin_unlock_irq(&conf->device_lock);
|
||||||
/* flush any pending bitmap writes to disk
|
/* flush any pending bitmap writes to disk
|
||||||
* before proceeding w/ I/O */
|
* before proceeding w/ I/O */
|
||||||
@ -971,7 +974,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
|
|||||||
atomic_inc(&r10_bio->remaining);
|
atomic_inc(&r10_bio->remaining);
|
||||||
spin_lock_irqsave(&conf->device_lock, flags);
|
spin_lock_irqsave(&conf->device_lock, flags);
|
||||||
bio_list_add(&conf->pending_bio_list, mbio);
|
bio_list_add(&conf->pending_bio_list, mbio);
|
||||||
blk_plug_device(mddev->queue);
|
blk_plug_device_unlocked(mddev->queue);
|
||||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2304,8 +2307,6 @@ static int run(mddev_t *mddev)
|
|||||||
if (!conf)
|
if (!conf)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
mddev->queue->queue_lock = &conf->device_lock;
|
|
||||||
|
|
||||||
mddev->thread = conf->thread;
|
mddev->thread = conf->thread;
|
||||||
conf->thread = NULL;
|
conf->thread = NULL;
|
||||||
|
|
||||||
|
@ -5204,7 +5204,6 @@ static int run(mddev_t *mddev)
|
|||||||
|
|
||||||
mddev->queue->backing_dev_info.congested_data = mddev;
|
mddev->queue->backing_dev_info.congested_data = mddev;
|
||||||
mddev->queue->backing_dev_info.congested_fn = raid5_congested;
|
mddev->queue->backing_dev_info.congested_fn = raid5_congested;
|
||||||
mddev->queue->queue_lock = &conf->device_lock;
|
|
||||||
mddev->queue->unplug_fn = raid5_unplug_queue;
|
mddev->queue->unplug_fn = raid5_unplug_queue;
|
||||||
|
|
||||||
chunk_size = mddev->chunk_sectors << 9;
|
chunk_size = mddev->chunk_sectors << 9;
|
||||||
|
@ -802,10 +802,7 @@ dm9000_init_dm9000(struct net_device *dev)
|
|||||||
/* Checksum mode */
|
/* Checksum mode */
|
||||||
dm9000_set_rx_csum_unlocked(dev, db->rx_csum);
|
dm9000_set_rx_csum_unlocked(dev, db->rx_csum);
|
||||||
|
|
||||||
/* GPIO0 on pre-activate PHY */
|
|
||||||
iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
|
|
||||||
iow(db, DM9000_GPCR, GPCR_GEP_CNTL); /* Let GPIO0 output */
|
iow(db, DM9000_GPCR, GPCR_GEP_CNTL); /* Let GPIO0 output */
|
||||||
iow(db, DM9000_GPR, 0); /* Enable PHY */
|
|
||||||
|
|
||||||
ncr = (db->flags & DM9000_PLATF_EXT_PHY) ? NCR_EXT_PHY : 0;
|
ncr = (db->flags & DM9000_PLATF_EXT_PHY) ? NCR_EXT_PHY : 0;
|
||||||
|
|
||||||
@ -852,8 +849,8 @@ static void dm9000_timeout(struct net_device *dev)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* Save previous register address */
|
/* Save previous register address */
|
||||||
reg_save = readb(db->io_addr);
|
|
||||||
spin_lock_irqsave(&db->lock, flags);
|
spin_lock_irqsave(&db->lock, flags);
|
||||||
|
reg_save = readb(db->io_addr);
|
||||||
|
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
dm9000_reset(db);
|
dm9000_reset(db);
|
||||||
@ -1194,6 +1191,10 @@ dm9000_open(struct net_device *dev)
|
|||||||
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
|
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
|
/* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */
|
||||||
|
iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
|
||||||
|
mdelay(1); /* delay needs by DM9000B */
|
||||||
|
|
||||||
/* Initialize DM9000 board */
|
/* Initialize DM9000 board */
|
||||||
dm9000_reset(db);
|
dm9000_reset(db);
|
||||||
dm9000_init_dm9000(dev);
|
dm9000_init_dm9000(dev);
|
||||||
|
@ -617,8 +617,9 @@ static void ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg, u32 data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl8168_oob_notify(void __iomem *ioaddr, u8 cmd)
|
static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
|
||||||
{
|
{
|
||||||
|
void __iomem *ioaddr = tp->mmio_addr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
RTL_W8(ERIDR, cmd);
|
RTL_W8(ERIDR, cmd);
|
||||||
@ -630,7 +631,7 @@ static void rtl8168_oob_notify(void __iomem *ioaddr, u8 cmd)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ocp_write(ioaddr, 0x1, 0x30, 0x00000001);
|
ocp_write(tp, 0x1, 0x30, 0x00000001);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OOB_CMD_RESET 0x00
|
#define OOB_CMD_RESET 0x00
|
||||||
@ -2868,8 +2869,11 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
|
|||||||
{
|
{
|
||||||
void __iomem *ioaddr = tp->mmio_addr;
|
void __iomem *ioaddr = tp->mmio_addr;
|
||||||
|
|
||||||
if (tp->mac_version == RTL_GIGA_MAC_VER_27)
|
if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_28)) &&
|
||||||
|
(ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (((tp->mac_version == RTL_GIGA_MAC_VER_23) ||
|
if (((tp->mac_version == RTL_GIGA_MAC_VER_23) ||
|
||||||
(tp->mac_version == RTL_GIGA_MAC_VER_24)) &&
|
(tp->mac_version == RTL_GIGA_MAC_VER_24)) &&
|
||||||
@ -2891,6 +2895,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
|
|||||||
switch (tp->mac_version) {
|
switch (tp->mac_version) {
|
||||||
case RTL_GIGA_MAC_VER_25:
|
case RTL_GIGA_MAC_VER_25:
|
||||||
case RTL_GIGA_MAC_VER_26:
|
case RTL_GIGA_MAC_VER_26:
|
||||||
|
case RTL_GIGA_MAC_VER_27:
|
||||||
|
case RTL_GIGA_MAC_VER_28:
|
||||||
RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
|
RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2900,12 +2906,17 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
|
|||||||
{
|
{
|
||||||
void __iomem *ioaddr = tp->mmio_addr;
|
void __iomem *ioaddr = tp->mmio_addr;
|
||||||
|
|
||||||
if (tp->mac_version == RTL_GIGA_MAC_VER_27)
|
if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
|
||||||
|
(tp->mac_version == RTL_GIGA_MAC_VER_28)) &&
|
||||||
|
(ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (tp->mac_version) {
|
switch (tp->mac_version) {
|
||||||
case RTL_GIGA_MAC_VER_25:
|
case RTL_GIGA_MAC_VER_25:
|
||||||
case RTL_GIGA_MAC_VER_26:
|
case RTL_GIGA_MAC_VER_26:
|
||||||
|
case RTL_GIGA_MAC_VER_27:
|
||||||
|
case RTL_GIGA_MAC_VER_28:
|
||||||
RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
|
RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3042,7 +3053,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
goto err_out_mwi_2;
|
goto err_out_mwi_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
tp->cp_cmd = PCIMulRW | RxChkSum;
|
tp->cp_cmd = RxChkSum;
|
||||||
|
|
||||||
if ((sizeof(dma_addr_t) > 4) &&
|
if ((sizeof(dma_addr_t) > 4) &&
|
||||||
!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
|
!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
|
||||||
@ -3318,7 +3329,8 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
|
|||||||
/* Disable interrupts */
|
/* Disable interrupts */
|
||||||
rtl8169_irq_mask_and_ack(ioaddr);
|
rtl8169_irq_mask_and_ack(ioaddr);
|
||||||
|
|
||||||
if (tp->mac_version == RTL_GIGA_MAC_VER_28) {
|
if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
|
||||||
|
tp->mac_version == RTL_GIGA_MAC_VER_28) {
|
||||||
while (RTL_R8(TxPoll) & NPQ)
|
while (RTL_R8(TxPoll) & NPQ)
|
||||||
udelay(20);
|
udelay(20);
|
||||||
|
|
||||||
@ -3847,8 +3859,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||||||
Cxpl_dbg_sel | \
|
Cxpl_dbg_sel | \
|
||||||
ASF | \
|
ASF | \
|
||||||
PktCntrDisable | \
|
PktCntrDisable | \
|
||||||
PCIDAC | \
|
Mac_dbgo_sel)
|
||||||
PCIMulRW)
|
|
||||||
|
|
||||||
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
|
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
@ -3878,8 +3889,6 @@ static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
|
|||||||
if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
|
if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
|
||||||
RTL_W8(Config1, cfg1 & ~LEDS0);
|
RTL_W8(Config1, cfg1 & ~LEDS0);
|
||||||
|
|
||||||
RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
|
|
||||||
|
|
||||||
rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
|
rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3891,8 +3900,6 @@ static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
|
|||||||
|
|
||||||
RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
|
RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
|
||||||
RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
|
RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
|
||||||
|
|
||||||
RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
|
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
|
||||||
@ -3918,6 +3925,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||||
|
|
||||||
switch (tp->mac_version) {
|
switch (tp->mac_version) {
|
||||||
case RTL_GIGA_MAC_VER_07:
|
case RTL_GIGA_MAC_VER_07:
|
||||||
rtl_hw_start_8102e_1(ioaddr, pdev);
|
rtl_hw_start_8102e_1(ioaddr, pdev);
|
||||||
@ -3932,14 +3941,13 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||||
|
|
||||||
RTL_W8(MaxTxPacketSize, TxPacketMax);
|
RTL_W8(MaxTxPacketSize, TxPacketMax);
|
||||||
|
|
||||||
rtl_set_rx_max_size(ioaddr, rx_buf_sz);
|
rtl_set_rx_max_size(ioaddr, rx_buf_sz);
|
||||||
|
|
||||||
tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
|
tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK;
|
||||||
|
|
||||||
RTL_W16(CPlusCmd, tp->cp_cmd);
|
RTL_W16(CPlusCmd, tp->cp_cmd);
|
||||||
|
|
||||||
RTL_W16(IntrMitigate, 0x0000);
|
RTL_W16(IntrMitigate, 0x0000);
|
||||||
@ -3949,14 +3957,10 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||||
rtl_set_rx_tx_config_registers(tp);
|
rtl_set_rx_tx_config_registers(tp);
|
||||||
|
|
||||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
|
||||||
|
|
||||||
RTL_R8(IntrMask);
|
RTL_R8(IntrMask);
|
||||||
|
|
||||||
rtl_set_rx_mode(dev);
|
rtl_set_rx_mode(dev);
|
||||||
|
|
||||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
|
||||||
|
|
||||||
RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
|
RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
|
||||||
|
|
||||||
RTL_W16(IntrMask, tp->intr_event);
|
RTL_W16(IntrMask, tp->intr_event);
|
||||||
|
@ -569,9 +569,14 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
|
|||||||
struct ethtool_test *test, u64 *data)
|
struct ethtool_test *test, u64 *data)
|
||||||
{
|
{
|
||||||
struct efx_nic *efx = netdev_priv(net_dev);
|
struct efx_nic *efx = netdev_priv(net_dev);
|
||||||
struct efx_self_tests efx_tests;
|
struct efx_self_tests *efx_tests;
|
||||||
int already_up;
|
int already_up;
|
||||||
int rc;
|
int rc = -ENOMEM;
|
||||||
|
|
||||||
|
efx_tests = kzalloc(sizeof(*efx_tests), GFP_KERNEL);
|
||||||
|
if (!efx_tests)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
|
||||||
ASSERT_RTNL();
|
ASSERT_RTNL();
|
||||||
if (efx->state != STATE_RUNNING) {
|
if (efx->state != STATE_RUNNING) {
|
||||||
@ -589,13 +594,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
|
|||||||
if (rc) {
|
if (rc) {
|
||||||
netif_err(efx, drv, efx->net_dev,
|
netif_err(efx, drv, efx->net_dev,
|
||||||
"failed opening device.\n");
|
"failed opening device.\n");
|
||||||
goto fail2;
|
goto fail1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&efx_tests, 0, sizeof(efx_tests));
|
rc = efx_selftest(efx, efx_tests, test->flags);
|
||||||
|
|
||||||
rc = efx_selftest(efx, &efx_tests, test->flags);
|
|
||||||
|
|
||||||
if (!already_up)
|
if (!already_up)
|
||||||
dev_close(efx->net_dev);
|
dev_close(efx->net_dev);
|
||||||
@ -604,10 +607,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
|
|||||||
rc == 0 ? "passed" : "failed",
|
rc == 0 ? "passed" : "failed",
|
||||||
(test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
|
(test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
|
||||||
|
|
||||||
fail2:
|
fail1:
|
||||||
fail1:
|
|
||||||
/* Fill ethtool results structures */
|
/* Fill ethtool results structures */
|
||||||
efx_ethtool_fill_self_tests(efx, &efx_tests, NULL, data);
|
efx_ethtool_fill_self_tests(efx, efx_tests, NULL, data);
|
||||||
|
kfree(efx_tests);
|
||||||
|
fail:
|
||||||
if (rc)
|
if (rc)
|
||||||
test->flags |= ETH_TEST_FL_FAILED;
|
test->flags |= ETH_TEST_FL_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -650,6 +650,10 @@ static const struct usb_device_id products[] = {
|
|||||||
USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */
|
USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */
|
||||||
.driver_info = (unsigned long)&dm9601_info,
|
.driver_info = (unsigned long)&dm9601_info,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
USB_DEVICE(0x0fe6, 0x9700), /* DM9601 USB to Fast Ethernet Adapter */
|
||||||
|
.driver_info = (unsigned long)&dm9601_info,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
USB_DEVICE(0x0a46, 0x9000), /* DM9000E */
|
USB_DEVICE(0x0a46, 0x9000), /* DM9000E */
|
||||||
.driver_info = (unsigned long)&dm9601_info,
|
.driver_info = (unsigned long)&dm9601_info,
|
||||||
|
@ -282,6 +282,34 @@ int ath5k_hw_phy_disable(struct ath5k_hw *ah)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for synth to settle
|
||||||
|
*/
|
||||||
|
static void ath5k_hw_wait_for_synth(struct ath5k_hw *ah,
|
||||||
|
struct ieee80211_channel *channel)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* On 5211+ read activation -> rx delay
|
||||||
|
* and use it (100ns steps).
|
||||||
|
*/
|
||||||
|
if (ah->ah_version != AR5K_AR5210) {
|
||||||
|
u32 delay;
|
||||||
|
delay = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) &
|
||||||
|
AR5K_PHY_RX_DELAY_M;
|
||||||
|
delay = (channel->hw_value & CHANNEL_CCK) ?
|
||||||
|
((delay << 2) / 22) : (delay / 10);
|
||||||
|
if (ah->ah_bwmode == AR5K_BWMODE_10MHZ)
|
||||||
|
delay = delay << 1;
|
||||||
|
if (ah->ah_bwmode == AR5K_BWMODE_5MHZ)
|
||||||
|
delay = delay << 2;
|
||||||
|
/* XXX: /2 on turbo ? Let's be safe
|
||||||
|
* for now */
|
||||||
|
udelay(100 + delay);
|
||||||
|
} else {
|
||||||
|
mdelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************\
|
/**********************\
|
||||||
* RF Gain optimization *
|
* RF Gain optimization *
|
||||||
@ -1253,6 +1281,7 @@ static int ath5k_hw_channel(struct ath5k_hw *ah,
|
|||||||
case AR5K_RF5111:
|
case AR5K_RF5111:
|
||||||
ret = ath5k_hw_rf5111_channel(ah, channel);
|
ret = ath5k_hw_rf5111_channel(ah, channel);
|
||||||
break;
|
break;
|
||||||
|
case AR5K_RF2317:
|
||||||
case AR5K_RF2425:
|
case AR5K_RF2425:
|
||||||
ret = ath5k_hw_rf2425_channel(ah, channel);
|
ret = ath5k_hw_rf2425_channel(ah, channel);
|
||||||
break;
|
break;
|
||||||
@ -3237,6 +3266,13 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||||||
/* Failed */
|
/* Failed */
|
||||||
if (i >= 100)
|
if (i >= 100)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
/* Set channel and wait for synth */
|
||||||
|
ret = ath5k_hw_channel(ah, channel);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ath5k_hw_wait_for_synth(ah, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3251,13 +3287,53 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* Write OFDM timings on 5212*/
|
||||||
|
if (ah->ah_version == AR5K_AR5212 &&
|
||||||
|
channel->hw_value & CHANNEL_OFDM) {
|
||||||
|
|
||||||
|
ret = ath5k_hw_write_ofdm_timings(ah, channel);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Spur info is available only from EEPROM versions
|
||||||
|
* greater than 5.3, but the EEPROM routines will use
|
||||||
|
* static values for older versions */
|
||||||
|
if (ah->ah_mac_srev >= AR5K_SREV_AR5424)
|
||||||
|
ath5k_hw_set_spur_mitigation_filter(ah,
|
||||||
|
channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we used fast channel switching
|
||||||
|
* we are done, release RF bus and
|
||||||
|
* fire up NF calibration.
|
||||||
|
*
|
||||||
|
* Note: Only NF calibration due to
|
||||||
|
* channel change, not AGC calibration
|
||||||
|
* since AGC is still running !
|
||||||
|
*/
|
||||||
|
if (fast) {
|
||||||
|
/*
|
||||||
|
* Release RF Bus grant
|
||||||
|
*/
|
||||||
|
AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_RFBUS_REQ,
|
||||||
|
AR5K_PHY_RFBUS_REQ_REQUEST);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start NF calibration
|
||||||
|
*/
|
||||||
|
AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL,
|
||||||
|
AR5K_PHY_AGCCTL_NF);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For 5210 we do all initialization using
|
* For 5210 we do all initialization using
|
||||||
* initvals, so we don't have to modify
|
* initvals, so we don't have to modify
|
||||||
* any settings (5210 also only supports
|
* any settings (5210 also only supports
|
||||||
* a/aturbo modes)
|
* a/aturbo modes)
|
||||||
*/
|
*/
|
||||||
if ((ah->ah_version != AR5K_AR5210) && !fast) {
|
if (ah->ah_version != AR5K_AR5210) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write initial RF gain settings
|
* Write initial RF gain settings
|
||||||
@ -3276,22 +3352,6 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Write OFDM timings on 5212*/
|
|
||||||
if (ah->ah_version == AR5K_AR5212 &&
|
|
||||||
channel->hw_value & CHANNEL_OFDM) {
|
|
||||||
|
|
||||||
ret = ath5k_hw_write_ofdm_timings(ah, channel);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Spur info is available only from EEPROM versions
|
|
||||||
* greater than 5.3, but the EEPROM routines will use
|
|
||||||
* static values for older versions */
|
|
||||||
if (ah->ah_mac_srev >= AR5K_SREV_AR5424)
|
|
||||||
ath5k_hw_set_spur_mitigation_filter(ah,
|
|
||||||
channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*Enable/disable 802.11b mode on 5111
|
/*Enable/disable 802.11b mode on 5111
|
||||||
(enable 2111 frequency converter + CCK)*/
|
(enable 2111 frequency converter + CCK)*/
|
||||||
if (ah->ah_radio == AR5K_RF5111) {
|
if (ah->ah_radio == AR5K_RF5111) {
|
||||||
@ -3322,47 +3382,20 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||||||
*/
|
*/
|
||||||
ath5k_hw_reg_write(ah, AR5K_PHY_ACT_ENABLE, AR5K_PHY_ACT);
|
ath5k_hw_reg_write(ah, AR5K_PHY_ACT_ENABLE, AR5K_PHY_ACT);
|
||||||
|
|
||||||
/*
|
ath5k_hw_wait_for_synth(ah, channel);
|
||||||
* On 5211+ read activation -> rx delay
|
|
||||||
* and use it.
|
|
||||||
*/
|
|
||||||
if (ah->ah_version != AR5K_AR5210) {
|
|
||||||
u32 delay;
|
|
||||||
delay = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) &
|
|
||||||
AR5K_PHY_RX_DELAY_M;
|
|
||||||
delay = (channel->hw_value & CHANNEL_CCK) ?
|
|
||||||
((delay << 2) / 22) : (delay / 10);
|
|
||||||
if (ah->ah_bwmode == AR5K_BWMODE_10MHZ)
|
|
||||||
delay = delay << 1;
|
|
||||||
if (ah->ah_bwmode == AR5K_BWMODE_5MHZ)
|
|
||||||
delay = delay << 2;
|
|
||||||
/* XXX: /2 on turbo ? Let's be safe
|
|
||||||
* for now */
|
|
||||||
udelay(100 + delay);
|
|
||||||
} else {
|
|
||||||
mdelay(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fast)
|
/*
|
||||||
/*
|
* Perform ADC test to see if baseband is ready
|
||||||
* Release RF Bus grant
|
* Set tx hold and check adc test register
|
||||||
*/
|
*/
|
||||||
AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_RFBUS_REQ,
|
phy_tst1 = ath5k_hw_reg_read(ah, AR5K_PHY_TST1);
|
||||||
AR5K_PHY_RFBUS_REQ_REQUEST);
|
ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1);
|
||||||
else {
|
for (i = 0; i <= 20; i++) {
|
||||||
/*
|
if (!(ath5k_hw_reg_read(ah, AR5K_PHY_ADC_TEST) & 0x10))
|
||||||
* Perform ADC test to see if baseband is ready
|
break;
|
||||||
* Set tx hold and check adc test register
|
udelay(200);
|
||||||
*/
|
|
||||||
phy_tst1 = ath5k_hw_reg_read(ah, AR5K_PHY_TST1);
|
|
||||||
ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1);
|
|
||||||
for (i = 0; i <= 20; i++) {
|
|
||||||
if (!(ath5k_hw_reg_read(ah, AR5K_PHY_ADC_TEST) & 0x10))
|
|
||||||
break;
|
|
||||||
udelay(200);
|
|
||||||
}
|
|
||||||
ath5k_hw_reg_write(ah, phy_tst1, AR5K_PHY_TST1);
|
|
||||||
}
|
}
|
||||||
|
ath5k_hw_reg_write(ah, phy_tst1, AR5K_PHY_TST1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start automatic gain control calibration
|
* Start automatic gain control calibration
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/pm_qos_params.h>
|
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
@ -57,8 +56,6 @@ struct ath_node;
|
|||||||
|
|
||||||
#define A_MAX(a, b) ((a) > (b) ? (a) : (b))
|
#define A_MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
#define ATH9K_PM_QOS_DEFAULT_VALUE 55
|
|
||||||
|
|
||||||
#define TSF_TO_TU(_h,_l) \
|
#define TSF_TO_TU(_h,_l) \
|
||||||
((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
|
((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
|
||||||
|
|
||||||
@ -633,8 +630,6 @@ struct ath_softc {
|
|||||||
struct ath_descdma txsdma;
|
struct ath_descdma txsdma;
|
||||||
|
|
||||||
struct ath_ant_comb ant_comb;
|
struct ath_ant_comb ant_comb;
|
||||||
|
|
||||||
struct pm_qos_request_list pm_qos_req;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath_wiphy {
|
struct ath_wiphy {
|
||||||
@ -666,7 +661,6 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz)
|
|||||||
extern struct ieee80211_ops ath9k_ops;
|
extern struct ieee80211_ops ath9k_ops;
|
||||||
extern int ath9k_modparam_nohwcrypt;
|
extern int ath9k_modparam_nohwcrypt;
|
||||||
extern int led_blink;
|
extern int led_blink;
|
||||||
extern int ath9k_pm_qos_value;
|
|
||||||
extern bool is_ath9k_unloaded;
|
extern bool is_ath9k_unloaded;
|
||||||
|
|
||||||
irqreturn_t ath_isr(int irq, void *dev);
|
irqreturn_t ath_isr(int irq, void *dev);
|
||||||
|
@ -41,10 +41,6 @@ static int ath9k_btcoex_enable;
|
|||||||
module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444);
|
module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444);
|
||||||
MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence");
|
MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence");
|
||||||
|
|
||||||
int ath9k_pm_qos_value = ATH9K_PM_QOS_DEFAULT_VALUE;
|
|
||||||
module_param_named(pmqos, ath9k_pm_qos_value, int, S_IRUSR | S_IRGRP | S_IROTH);
|
|
||||||
MODULE_PARM_DESC(pmqos, "User specified PM-QOS value");
|
|
||||||
|
|
||||||
bool is_ath9k_unloaded;
|
bool is_ath9k_unloaded;
|
||||||
/* We use the hw_value as an index into our private channel structure */
|
/* We use the hw_value as an index into our private channel structure */
|
||||||
|
|
||||||
@ -762,9 +758,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
|
|||||||
ath_init_leds(sc);
|
ath_init_leds(sc);
|
||||||
ath_start_rfkill_poll(sc);
|
ath_start_rfkill_poll(sc);
|
||||||
|
|
||||||
pm_qos_add_request(&sc->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
|
|
||||||
PM_QOS_DEFAULT_VALUE);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_world:
|
error_world:
|
||||||
@ -831,7 +824,6 @@ void ath9k_deinit_device(struct ath_softc *sc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ieee80211_unregister_hw(hw);
|
ieee80211_unregister_hw(hw);
|
||||||
pm_qos_remove_request(&sc->pm_qos_req);
|
|
||||||
ath_rx_cleanup(sc);
|
ath_rx_cleanup(sc);
|
||||||
ath_tx_cleanup(sc);
|
ath_tx_cleanup(sc);
|
||||||
ath9k_deinit_softc(sc);
|
ath9k_deinit_softc(sc);
|
||||||
|
@ -1173,12 +1173,6 @@ static int ath9k_start(struct ieee80211_hw *hw)
|
|||||||
ath9k_btcoex_timer_resume(sc);
|
ath9k_btcoex_timer_resume(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* User has the option to provide pm-qos value as a module
|
|
||||||
* parameter rather than using the default value of
|
|
||||||
* 'ATH9K_PM_QOS_DEFAULT_VALUE'.
|
|
||||||
*/
|
|
||||||
pm_qos_update_request(&sc->pm_qos_req, ath9k_pm_qos_value);
|
|
||||||
|
|
||||||
if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en)
|
if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en)
|
||||||
common->bus_ops->extn_synch_en(common);
|
common->bus_ops->extn_synch_en(common);
|
||||||
|
|
||||||
@ -1345,8 +1339,6 @@ static void ath9k_stop(struct ieee80211_hw *hw)
|
|||||||
|
|
||||||
sc->sc_flags |= SC_OP_INVALID;
|
sc->sc_flags |= SC_OP_INVALID;
|
||||||
|
|
||||||
pm_qos_update_request(&sc->pm_qos_req, PM_QOS_DEFAULT_VALUE);
|
|
||||||
|
|
||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
|
|
||||||
ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n");
|
ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n");
|
||||||
|
@ -199,6 +199,7 @@ static void p54p_check_rx_ring(struct ieee80211_hw *dev, u32 *index,
|
|||||||
while (i != idx) {
|
while (i != idx) {
|
||||||
u16 len;
|
u16 len;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
dma_addr_t dma_addr;
|
||||||
desc = &ring[i];
|
desc = &ring[i];
|
||||||
len = le16_to_cpu(desc->len);
|
len = le16_to_cpu(desc->len);
|
||||||
skb = rx_buf[i];
|
skb = rx_buf[i];
|
||||||
@ -216,17 +217,20 @@ static void p54p_check_rx_ring(struct ieee80211_hw *dev, u32 *index,
|
|||||||
|
|
||||||
len = priv->common.rx_mtu;
|
len = priv->common.rx_mtu;
|
||||||
}
|
}
|
||||||
|
dma_addr = le32_to_cpu(desc->host_addr);
|
||||||
|
pci_dma_sync_single_for_cpu(priv->pdev, dma_addr,
|
||||||
|
priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE);
|
||||||
skb_put(skb, len);
|
skb_put(skb, len);
|
||||||
|
|
||||||
if (p54_rx(dev, skb)) {
|
if (p54_rx(dev, skb)) {
|
||||||
pci_unmap_single(priv->pdev,
|
pci_unmap_single(priv->pdev, dma_addr,
|
||||||
le32_to_cpu(desc->host_addr),
|
priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE);
|
||||||
priv->common.rx_mtu + 32,
|
|
||||||
PCI_DMA_FROMDEVICE);
|
|
||||||
rx_buf[i] = NULL;
|
rx_buf[i] = NULL;
|
||||||
desc->host_addr = 0;
|
desc->host_addr = cpu_to_le32(0);
|
||||||
} else {
|
} else {
|
||||||
skb_trim(skb, 0);
|
skb_trim(skb, 0);
|
||||||
|
pci_dma_sync_single_for_device(priv->pdev, dma_addr,
|
||||||
|
priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE);
|
||||||
desc->len = cpu_to_le16(priv->common.rx_mtu + 32);
|
desc->len = cpu_to_le16(priv->common.rx_mtu + 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -652,6 +652,12 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry,
|
|||||||
*/
|
*/
|
||||||
rxdesc->flags |= RX_FLAG_IV_STRIPPED;
|
rxdesc->flags |= RX_FLAG_IV_STRIPPED;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The hardware has already checked the Michael Mic and has
|
||||||
|
* stripped it from the frame. Signal this to mac80211.
|
||||||
|
*/
|
||||||
|
rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
|
||||||
|
|
||||||
if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
|
if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
|
||||||
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
||||||
else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
|
else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
|
||||||
@ -1065,6 +1071,8 @@ static DEFINE_PCI_DEVICE_TABLE(rt2800pci_device_table) = {
|
|||||||
{ PCI_DEVICE(0x1814, 0x3390), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
{ PCI_DEVICE(0x1814, 0x3390), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_RT2800PCI_RT35XX
|
#ifdef CONFIG_RT2800PCI_RT35XX
|
||||||
|
{ PCI_DEVICE(0x1432, 0x7711), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
|
{ PCI_DEVICE(0x1432, 0x7722), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
{ PCI_DEVICE(0x1814, 0x3060), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
{ PCI_DEVICE(0x1814, 0x3060), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
{ PCI_DEVICE(0x1814, 0x3062), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
{ PCI_DEVICE(0x1814, 0x3062), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
{ PCI_DEVICE(0x1814, 0x3562), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
{ PCI_DEVICE(0x1814, 0x3562), PCI_DEVICE_DATA(&rt2800pci_ops) },
|
||||||
|
@ -486,6 +486,12 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
|
|||||||
*/
|
*/
|
||||||
rxdesc->flags |= RX_FLAG_IV_STRIPPED;
|
rxdesc->flags |= RX_FLAG_IV_STRIPPED;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The hardware has already checked the Michael Mic and has
|
||||||
|
* stripped it from the frame. Signal this to mac80211.
|
||||||
|
*/
|
||||||
|
rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
|
||||||
|
|
||||||
if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
|
if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
|
||||||
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
||||||
else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
|
else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
menuconfig NFC_DEVICES
|
menuconfig NFC_DEVICES
|
||||||
bool "NFC devices"
|
bool "Near Field Communication (NFC) devices"
|
||||||
default n
|
default n
|
||||||
---help---
|
---help---
|
||||||
You'll have to say Y if your computer contains an NFC device that
|
You'll have to say Y if your computer contains an NFC device that
|
||||||
|
@ -60,7 +60,7 @@ enum pn544_irq {
|
|||||||
struct pn544_info {
|
struct pn544_info {
|
||||||
struct miscdevice miscdev;
|
struct miscdevice miscdev;
|
||||||
struct i2c_client *i2c_dev;
|
struct i2c_client *i2c_dev;
|
||||||
struct regulator_bulk_data regs[2];
|
struct regulator_bulk_data regs[3];
|
||||||
|
|
||||||
enum pn544_state state;
|
enum pn544_state state;
|
||||||
wait_queue_head_t read_wait;
|
wait_queue_head_t read_wait;
|
||||||
@ -74,6 +74,7 @@ struct pn544_info {
|
|||||||
|
|
||||||
static const char reg_vdd_io[] = "Vdd_IO";
|
static const char reg_vdd_io[] = "Vdd_IO";
|
||||||
static const char reg_vbat[] = "VBat";
|
static const char reg_vbat[] = "VBat";
|
||||||
|
static const char reg_vsim[] = "VSim";
|
||||||
|
|
||||||
/* sysfs interface */
|
/* sysfs interface */
|
||||||
static ssize_t pn544_test(struct device *dev,
|
static ssize_t pn544_test(struct device *dev,
|
||||||
@ -740,6 +741,7 @@ static int __devinit pn544_probe(struct i2c_client *client,
|
|||||||
|
|
||||||
info->regs[0].supply = reg_vdd_io;
|
info->regs[0].supply = reg_vdd_io;
|
||||||
info->regs[1].supply = reg_vbat;
|
info->regs[1].supply = reg_vbat;
|
||||||
|
info->regs[2].supply = reg_vsim;
|
||||||
r = regulator_bulk_get(&client->dev, ARRAY_SIZE(info->regs),
|
r = regulator_bulk_get(&client->dev, ARRAY_SIZE(info->regs),
|
||||||
info->regs);
|
info->regs);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -518,6 +518,8 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev)
|
|||||||
flags |= CONF_ENABLE_IOCARD;
|
flags |= CONF_ENABLE_IOCARD;
|
||||||
if (flags & CONF_ENABLE_IOCARD)
|
if (flags & CONF_ENABLE_IOCARD)
|
||||||
s->socket.flags |= SS_IOCARD;
|
s->socket.flags |= SS_IOCARD;
|
||||||
|
if (flags & CONF_ENABLE_ZVCARD)
|
||||||
|
s->socket.flags |= SS_ZVCARD | SS_IOCARD;
|
||||||
if (flags & CONF_ENABLE_SPKR) {
|
if (flags & CONF_ENABLE_SPKR) {
|
||||||
s->socket.flags |= SS_SPKR_ENA;
|
s->socket.flags |= SS_SPKR_ENA;
|
||||||
status = CCSR_AUDIO_ENA;
|
status = CCSR_AUDIO_ENA;
|
||||||
|
@ -215,7 +215,7 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void pxa2xx_configure_sockets(struct device *dev)
|
void pxa2xx_configure_sockets(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_low_level *ops = dev->platform_data;
|
struct pcmcia_low_level *ops = dev->platform_data;
|
||||||
/*
|
/*
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||||
void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
|
void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
|
||||||
|
void pxa2xx_configure_sockets(struct device *dev);
|
||||||
|
|
||||||
|
@ -226,6 +226,7 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)
|
|||||||
lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
|
lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
|
||||||
|
|
||||||
pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
|
pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
|
||||||
|
pxa2xx_configure_sockets(&sadev->dev);
|
||||||
ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
|
ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
|
||||||
pxa2xx_drv_pcmcia_add_one);
|
pxa2xx_drv_pcmcia_add_one);
|
||||||
}
|
}
|
||||||
|
@ -168,7 +168,7 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event,
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int captured = 0;
|
int captured = 0;
|
||||||
struct pps_ktime ts_real;
|
struct pps_ktime ts_real = { .sec = 0, .nsec = 0, .flags = 0 };
|
||||||
|
|
||||||
/* check event type */
|
/* check event type */
|
||||||
BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0);
|
BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0);
|
||||||
|
@ -77,9 +77,9 @@ rio_read_config(struct file *filp, struct kobject *kobj,
|
|||||||
|
|
||||||
/* Several chips lock up trying to read undefined config space */
|
/* Several chips lock up trying to read undefined config space */
|
||||||
if (capable(CAP_SYS_ADMIN))
|
if (capable(CAP_SYS_ADMIN))
|
||||||
size = 0x200000;
|
size = RIO_MAINT_SPACE_SZ;
|
||||||
|
|
||||||
if (off > size)
|
if (off >= size)
|
||||||
return 0;
|
return 0;
|
||||||
if (off + count > size) {
|
if (off + count > size) {
|
||||||
size -= off;
|
size -= off;
|
||||||
@ -147,10 +147,10 @@ rio_write_config(struct file *filp, struct kobject *kobj,
|
|||||||
loff_t init_off = off;
|
loff_t init_off = off;
|
||||||
u8 *data = (u8 *) buf;
|
u8 *data = (u8 *) buf;
|
||||||
|
|
||||||
if (off > 0x200000)
|
if (off >= RIO_MAINT_SPACE_SZ)
|
||||||
return 0;
|
return 0;
|
||||||
if (off + count > 0x200000) {
|
if (off + count > RIO_MAINT_SPACE_SZ) {
|
||||||
size = 0x200000 - off;
|
size = RIO_MAINT_SPACE_SZ - off;
|
||||||
count = size;
|
count = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,7 +200,7 @@ static struct bin_attribute rio_config_attr = {
|
|||||||
.name = "config",
|
.name = "config",
|
||||||
.mode = S_IRUGO | S_IWUSR,
|
.mode = S_IRUGO | S_IWUSR,
|
||||||
},
|
},
|
||||||
.size = 0x200000,
|
.size = RIO_MAINT_SPACE_SZ,
|
||||||
.read = rio_read_config,
|
.read = rio_read_config,
|
||||||
.write = rio_write_config,
|
.write = rio_write_config,
|
||||||
};
|
};
|
||||||
|
@ -174,7 +174,7 @@ static int mc13xxx_regulator_get_voltage(struct regulator_dev *rdev)
|
|||||||
|
|
||||||
dev_dbg(rdev_get_dev(rdev), "%s id: %d val: %d\n", __func__, id, val);
|
dev_dbg(rdev_get_dev(rdev), "%s id: %d val: %d\n", __func__, id, val);
|
||||||
|
|
||||||
BUG_ON(val < 0 || val > mc13xxx_regulators[id].desc.n_voltages);
|
BUG_ON(val > mc13xxx_regulators[id].desc.n_voltages);
|
||||||
|
|
||||||
return mc13xxx_regulators[id].voltages[val];
|
return mc13xxx_regulators[id].voltages[val];
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,7 @@ static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
|
|||||||
return REGULATOR_MODE_IDLE;
|
return REGULATOR_MODE_IDLE;
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ static const struct rtc_class_ops at91_rtc_ops = {
|
|||||||
.read_alarm = at91_rtc_readalarm,
|
.read_alarm = at91_rtc_readalarm,
|
||||||
.set_alarm = at91_rtc_setalarm,
|
.set_alarm = at91_rtc_setalarm,
|
||||||
.proc = at91_rtc_proc,
|
.proc = at91_rtc_proc,
|
||||||
.alarm_irq_enabled = at91_rtc_alarm_irq_enable,
|
.alarm_irq_enable = at91_rtc_alarm_irq_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* RTC client/driver for the Maxim/Dallas DS3232 Real-Time Clock over I2C
|
* RTC client/driver for the Maxim/Dallas DS3232 Real-Time Clock over I2C
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009-2010 Freescale Semiconductor.
|
* Copyright (C) 2009-2011 Freescale Semiconductor.
|
||||||
* Author: Jack Lan <jack.lan@freescale.com>
|
* Author: Jack Lan <jack.lan@freescale.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@ -141,9 +141,11 @@ static int ds3232_read_time(struct device *dev, struct rtc_time *time)
|
|||||||
time->tm_hour = bcd2bin(hour);
|
time->tm_hour = bcd2bin(hour);
|
||||||
}
|
}
|
||||||
|
|
||||||
time->tm_wday = bcd2bin(week);
|
/* Day of the week in linux range is 0~6 while 1~7 in RTC chip */
|
||||||
|
time->tm_wday = bcd2bin(week) - 1;
|
||||||
time->tm_mday = bcd2bin(day);
|
time->tm_mday = bcd2bin(day);
|
||||||
time->tm_mon = bcd2bin(month & 0x7F);
|
/* linux tm_mon range:0~11, while month range is 1~12 in RTC chip */
|
||||||
|
time->tm_mon = bcd2bin(month & 0x7F) - 1;
|
||||||
if (century)
|
if (century)
|
||||||
add_century = 100;
|
add_century = 100;
|
||||||
|
|
||||||
@ -162,9 +164,11 @@ static int ds3232_set_time(struct device *dev, struct rtc_time *time)
|
|||||||
buf[0] = bin2bcd(time->tm_sec);
|
buf[0] = bin2bcd(time->tm_sec);
|
||||||
buf[1] = bin2bcd(time->tm_min);
|
buf[1] = bin2bcd(time->tm_min);
|
||||||
buf[2] = bin2bcd(time->tm_hour);
|
buf[2] = bin2bcd(time->tm_hour);
|
||||||
buf[3] = bin2bcd(time->tm_wday); /* Day of the week */
|
/* Day of the week in linux range is 0~6 while 1~7 in RTC chip */
|
||||||
|
buf[3] = bin2bcd(time->tm_wday + 1);
|
||||||
buf[4] = bin2bcd(time->tm_mday); /* Date */
|
buf[4] = bin2bcd(time->tm_mday); /* Date */
|
||||||
buf[5] = bin2bcd(time->tm_mon);
|
/* linux tm_mon range:0~11, while month range is 1~12 in RTC chip */
|
||||||
|
buf[5] = bin2bcd(time->tm_mon + 1);
|
||||||
if (time->tm_year >= 100) {
|
if (time->tm_year >= 100) {
|
||||||
buf[5] |= 0x80;
|
buf[5] |= 0x80;
|
||||||
buf[6] = bin2bcd(time->tm_year - 100);
|
buf[6] = bin2bcd(time->tm_year - 100);
|
||||||
|
@ -443,7 +443,7 @@ static void scsi_run_queue(struct request_queue *q)
|
|||||||
&sdev->request_queue->queue_flags);
|
&sdev->request_queue->queue_flags);
|
||||||
if (flagset)
|
if (flagset)
|
||||||
queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue);
|
queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||||
__blk_run_queue(sdev->request_queue);
|
__blk_run_queue(sdev->request_queue, false);
|
||||||
if (flagset)
|
if (flagset)
|
||||||
queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);
|
queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||||
spin_unlock(sdev->request_queue->queue_lock);
|
spin_unlock(sdev->request_queue->queue_lock);
|
||||||
|
@ -3829,7 +3829,7 @@ fc_bsg_goose_queue(struct fc_rport *rport)
|
|||||||
!test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags);
|
!test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags);
|
||||||
if (flagset)
|
if (flagset)
|
||||||
queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q);
|
queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q);
|
||||||
__blk_run_queue(rport->rqst_q);
|
__blk_run_queue(rport->rqst_q, false);
|
||||||
if (flagset)
|
if (flagset)
|
||||||
queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q);
|
queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q);
|
||||||
spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags);
|
spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags);
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
menuconfig THERMAL
|
menuconfig THERMAL
|
||||||
tristate "Generic Thermal sysfs driver"
|
tristate "Generic Thermal sysfs driver"
|
||||||
depends on NET
|
|
||||||
help
|
help
|
||||||
Generic Thermal Sysfs driver offers a generic mechanism for
|
Generic Thermal Sysfs driver offers a generic mechanism for
|
||||||
thermal management. Usually it's made up of one or more thermal
|
thermal management. Usually it's made up of one or more thermal
|
||||||
|
@ -62,20 +62,6 @@ static DEFINE_MUTEX(thermal_list_lock);
|
|||||||
|
|
||||||
static unsigned int thermal_event_seqnum;
|
static unsigned int thermal_event_seqnum;
|
||||||
|
|
||||||
static struct genl_family thermal_event_genl_family = {
|
|
||||||
.id = GENL_ID_GENERATE,
|
|
||||||
.name = THERMAL_GENL_FAMILY_NAME,
|
|
||||||
.version = THERMAL_GENL_VERSION,
|
|
||||||
.maxattr = THERMAL_GENL_ATTR_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct genl_multicast_group thermal_event_mcgrp = {
|
|
||||||
.name = THERMAL_GENL_MCAST_GROUP_NAME,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int genetlink_init(void);
|
|
||||||
static void genetlink_exit(void);
|
|
||||||
|
|
||||||
static int get_idr(struct idr *idr, struct mutex *lock, int *id)
|
static int get_idr(struct idr *idr, struct mutex *lock, int *id)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -1225,6 +1211,18 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
|
|||||||
|
|
||||||
EXPORT_SYMBOL(thermal_zone_device_unregister);
|
EXPORT_SYMBOL(thermal_zone_device_unregister);
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET
|
||||||
|
static struct genl_family thermal_event_genl_family = {
|
||||||
|
.id = GENL_ID_GENERATE,
|
||||||
|
.name = THERMAL_GENL_FAMILY_NAME,
|
||||||
|
.version = THERMAL_GENL_VERSION,
|
||||||
|
.maxattr = THERMAL_GENL_ATTR_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct genl_multicast_group thermal_event_mcgrp = {
|
||||||
|
.name = THERMAL_GENL_MCAST_GROUP_NAME,
|
||||||
|
};
|
||||||
|
|
||||||
int generate_netlink_event(u32 orig, enum events event)
|
int generate_netlink_event(u32 orig, enum events event)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
@ -1301,6 +1299,15 @@ static int genetlink_init(void)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void genetlink_exit(void)
|
||||||
|
{
|
||||||
|
genl_unregister_family(&thermal_event_genl_family);
|
||||||
|
}
|
||||||
|
#else /* !CONFIG_NET */
|
||||||
|
static inline int genetlink_init(void) { return 0; }
|
||||||
|
static inline void genetlink_exit(void) {}
|
||||||
|
#endif /* !CONFIG_NET */
|
||||||
|
|
||||||
static int __init thermal_init(void)
|
static int __init thermal_init(void)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
@ -1316,11 +1323,6 @@ static int __init thermal_init(void)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void genetlink_exit(void)
|
|
||||||
{
|
|
||||||
genl_unregister_family(&thermal_event_genl_family);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit thermal_exit(void)
|
static void __exit thermal_exit(void)
|
||||||
{
|
{
|
||||||
class_unregister(&thermal_class);
|
class_unregister(&thermal_class);
|
||||||
|
@ -2681,17 +2681,13 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|||||||
|
|
||||||
mutex_lock(&usb_address0_mutex);
|
mutex_lock(&usb_address0_mutex);
|
||||||
|
|
||||||
if (!udev->config && oldspeed == USB_SPEED_SUPER) {
|
/* Reset the device; full speed may morph to high speed */
|
||||||
/* Don't reset USB 3.0 devices during an initial setup */
|
/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
|
||||||
usb_set_device_state(udev, USB_STATE_DEFAULT);
|
retval = hub_port_reset(hub, port1, udev, delay);
|
||||||
} else {
|
if (retval < 0) /* error or disconnect */
|
||||||
/* Reset the device; full speed may morph to high speed */
|
goto fail;
|
||||||
/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
|
/* success, speed is known */
|
||||||
retval = hub_port_reset(hub, port1, udev, delay);
|
|
||||||
if (retval < 0) /* error or disconnect */
|
|
||||||
goto fail;
|
|
||||||
/* success, speed is known */
|
|
||||||
}
|
|
||||||
retval = -ENODEV;
|
retval = -ENODEV;
|
||||||
|
|
||||||
if (oldspeed != USB_SPEED_UNKNOWN && oldspeed != udev->speed) {
|
if (oldspeed != USB_SPEED_UNKNOWN && oldspeed != udev->speed) {
|
||||||
|
@ -48,6 +48,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||||||
{ USB_DEVICE(0x04b4, 0x0526), .driver_info =
|
{ USB_DEVICE(0x04b4, 0x0526), .driver_info =
|
||||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||||
|
|
||||||
|
/* Samsung Android phone modem - ID conflict with SPH-I500 */
|
||||||
|
{ USB_DEVICE(0x04e8, 0x6601), .driver_info =
|
||||||
|
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||||
|
|
||||||
/* Roland SC-8820 */
|
/* Roland SC-8820 */
|
||||||
{ USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
|
{ USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||||
|
|
||||||
@ -68,6 +72,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||||||
/* M-Systems Flash Disk Pioneers */
|
/* M-Systems Flash Disk Pioneers */
|
||||||
{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
|
{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||||
|
|
||||||
|
/* Keytouch QWERTY Panel keyboard */
|
||||||
|
{ USB_DEVICE(0x0926, 0x3333), .driver_info =
|
||||||
|
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||||
|
|
||||||
/* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
|
/* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
|
||||||
{ USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
|
{ USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
|
||||||
|
|
||||||
|
@ -169,9 +169,10 @@ static void xhci_print_ports(struct xhci_hcd *xhci)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num)
|
void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num)
|
||||||
{
|
{
|
||||||
void *addr;
|
struct xhci_intr_reg __iomem *ir_set = &xhci->run_regs->ir_set[set_num];
|
||||||
|
void __iomem *addr;
|
||||||
u32 temp;
|
u32 temp;
|
||||||
u64 temp_64;
|
u64 temp_64;
|
||||||
|
|
||||||
@ -449,7 +450,7 @@ char *xhci_get_slot_state(struct xhci_hcd *xhci,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)
|
static void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)
|
||||||
{
|
{
|
||||||
/* Fields are 32 bits wide, DMA addresses are in bytes */
|
/* Fields are 32 bits wide, DMA addresses are in bytes */
|
||||||
int field_size = 32 / 8;
|
int field_size = 32 / 8;
|
||||||
@ -488,7 +489,7 @@ void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx)
|
|||||||
dbg_rsvd64(xhci, (u64 *)slot_ctx, dma);
|
dbg_rsvd64(xhci, (u64 *)slot_ctx, dma);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,
|
static void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,
|
||||||
struct xhci_container_ctx *ctx,
|
struct xhci_container_ctx *ctx,
|
||||||
unsigned int last_ep)
|
unsigned int last_ep)
|
||||||
{
|
{
|
||||||
|
@ -307,7 +307,7 @@ struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci,
|
|||||||
|
|
||||||
/***************** Streams structures manipulation *************************/
|
/***************** Streams structures manipulation *************************/
|
||||||
|
|
||||||
void xhci_free_stream_ctx(struct xhci_hcd *xhci,
|
static void xhci_free_stream_ctx(struct xhci_hcd *xhci,
|
||||||
unsigned int num_stream_ctxs,
|
unsigned int num_stream_ctxs,
|
||||||
struct xhci_stream_ctx *stream_ctx, dma_addr_t dma)
|
struct xhci_stream_ctx *stream_ctx, dma_addr_t dma)
|
||||||
{
|
{
|
||||||
@ -335,7 +335,7 @@ void xhci_free_stream_ctx(struct xhci_hcd *xhci,
|
|||||||
* The stream context array must be a power of 2, and can be as small as
|
* The stream context array must be a power of 2, and can be as small as
|
||||||
* 64 bytes or as large as 1MB.
|
* 64 bytes or as large as 1MB.
|
||||||
*/
|
*/
|
||||||
struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci,
|
static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci,
|
||||||
unsigned int num_stream_ctxs, dma_addr_t *dma,
|
unsigned int num_stream_ctxs, dma_addr_t *dma,
|
||||||
gfp_t mem_flags)
|
gfp_t mem_flags)
|
||||||
{
|
{
|
||||||
@ -1900,11 +1900,11 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||||||
val &= DBOFF_MASK;
|
val &= DBOFF_MASK;
|
||||||
xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x"
|
xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x"
|
||||||
" from cap regs base addr\n", val);
|
" from cap regs base addr\n", val);
|
||||||
xhci->dba = (void *) xhci->cap_regs + val;
|
xhci->dba = (void __iomem *) xhci->cap_regs + val;
|
||||||
xhci_dbg_regs(xhci);
|
xhci_dbg_regs(xhci);
|
||||||
xhci_print_run_regs(xhci);
|
xhci_print_run_regs(xhci);
|
||||||
/* Set ir_set to interrupt register set 0 */
|
/* Set ir_set to interrupt register set 0 */
|
||||||
xhci->ir_set = (void *) xhci->run_regs->ir_set;
|
xhci->ir_set = &xhci->run_regs->ir_set[0];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Event ring setup: Allocate a normal ring, but also setup
|
* Event ring setup: Allocate a normal ring, but also setup
|
||||||
@ -1961,7 +1961,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||||||
/* Set the event ring dequeue address */
|
/* Set the event ring dequeue address */
|
||||||
xhci_set_hc_event_deq(xhci);
|
xhci_set_hc_event_deq(xhci);
|
||||||
xhci_dbg(xhci, "Wrote ERST address to ir_set 0.\n");
|
xhci_dbg(xhci, "Wrote ERST address to ir_set 0.\n");
|
||||||
xhci_print_ir_set(xhci, xhci->ir_set, 0);
|
xhci_print_ir_set(xhci, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX: Might need to set the Interrupter Moderation Register to
|
* XXX: Might need to set the Interrupter Moderation Register to
|
||||||
|
@ -474,8 +474,11 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
|
|||||||
state->new_deq_seg = find_trb_seg(cur_td->start_seg,
|
state->new_deq_seg = find_trb_seg(cur_td->start_seg,
|
||||||
dev->eps[ep_index].stopped_trb,
|
dev->eps[ep_index].stopped_trb,
|
||||||
&state->new_cycle_state);
|
&state->new_cycle_state);
|
||||||
if (!state->new_deq_seg)
|
if (!state->new_deq_seg) {
|
||||||
BUG();
|
WARN_ON(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Dig out the cycle state saved by the xHC during the stop ep cmd */
|
/* Dig out the cycle state saved by the xHC during the stop ep cmd */
|
||||||
xhci_dbg(xhci, "Finding endpoint context\n");
|
xhci_dbg(xhci, "Finding endpoint context\n");
|
||||||
ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index);
|
ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index);
|
||||||
@ -486,8 +489,10 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
|
|||||||
state->new_deq_seg = find_trb_seg(state->new_deq_seg,
|
state->new_deq_seg = find_trb_seg(state->new_deq_seg,
|
||||||
state->new_deq_ptr,
|
state->new_deq_ptr,
|
||||||
&state->new_cycle_state);
|
&state->new_cycle_state);
|
||||||
if (!state->new_deq_seg)
|
if (!state->new_deq_seg) {
|
||||||
BUG();
|
WARN_ON(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
trb = &state->new_deq_ptr->generic;
|
trb = &state->new_deq_ptr->generic;
|
||||||
if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) &&
|
if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) &&
|
||||||
@ -2363,12 +2368,13 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)
|
|||||||
|
|
||||||
/* Scatter gather list entries may cross 64KB boundaries */
|
/* Scatter gather list entries may cross 64KB boundaries */
|
||||||
running_total = TRB_MAX_BUFF_SIZE -
|
running_total = TRB_MAX_BUFF_SIZE -
|
||||||
(sg_dma_address(sg) & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
(sg_dma_address(sg) & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
|
running_total &= TRB_MAX_BUFF_SIZE - 1;
|
||||||
if (running_total != 0)
|
if (running_total != 0)
|
||||||
num_trbs++;
|
num_trbs++;
|
||||||
|
|
||||||
/* How many more 64KB chunks to transfer, how many more TRBs? */
|
/* How many more 64KB chunks to transfer, how many more TRBs? */
|
||||||
while (running_total < sg_dma_len(sg)) {
|
while (running_total < sg_dma_len(sg) && running_total < temp) {
|
||||||
num_trbs++;
|
num_trbs++;
|
||||||
running_total += TRB_MAX_BUFF_SIZE;
|
running_total += TRB_MAX_BUFF_SIZE;
|
||||||
}
|
}
|
||||||
@ -2394,11 +2400,11 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb)
|
|||||||
static void check_trb_math(struct urb *urb, int num_trbs, int running_total)
|
static void check_trb_math(struct urb *urb, int num_trbs, int running_total)
|
||||||
{
|
{
|
||||||
if (num_trbs != 0)
|
if (num_trbs != 0)
|
||||||
dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated number of "
|
dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated number of "
|
||||||
"TRBs, %d left\n", __func__,
|
"TRBs, %d left\n", __func__,
|
||||||
urb->ep->desc.bEndpointAddress, num_trbs);
|
urb->ep->desc.bEndpointAddress, num_trbs);
|
||||||
if (running_total != urb->transfer_buffer_length)
|
if (running_total != urb->transfer_buffer_length)
|
||||||
dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, "
|
dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, "
|
||||||
"queued %#x (%d), asked for %#x (%d)\n",
|
"queued %#x (%d), asked for %#x (%d)\n",
|
||||||
__func__,
|
__func__,
|
||||||
urb->ep->desc.bEndpointAddress,
|
urb->ep->desc.bEndpointAddress,
|
||||||
@ -2533,8 +2539,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||||||
sg = urb->sg;
|
sg = urb->sg;
|
||||||
addr = (u64) sg_dma_address(sg);
|
addr = (u64) sg_dma_address(sg);
|
||||||
this_sg_len = sg_dma_len(sg);
|
this_sg_len = sg_dma_len(sg);
|
||||||
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
trb_buff_len = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
|
||||||
trb_buff_len = min_t(int, trb_buff_len, this_sg_len);
|
trb_buff_len = min_t(int, trb_buff_len, this_sg_len);
|
||||||
if (trb_buff_len > urb->transfer_buffer_length)
|
if (trb_buff_len > urb->transfer_buffer_length)
|
||||||
trb_buff_len = urb->transfer_buffer_length;
|
trb_buff_len = urb->transfer_buffer_length;
|
||||||
@ -2572,7 +2577,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||||||
(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),
|
(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),
|
||||||
(unsigned int) addr + trb_buff_len);
|
(unsigned int) addr + trb_buff_len);
|
||||||
if (TRB_MAX_BUFF_SIZE -
|
if (TRB_MAX_BUFF_SIZE -
|
||||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)) < trb_buff_len) {
|
(addr & (TRB_MAX_BUFF_SIZE - 1)) < trb_buff_len) {
|
||||||
xhci_warn(xhci, "WARN: sg dma xfer crosses 64KB boundaries!\n");
|
xhci_warn(xhci, "WARN: sg dma xfer crosses 64KB boundaries!\n");
|
||||||
xhci_dbg(xhci, "Next boundary at %#x, end dma = %#x\n",
|
xhci_dbg(xhci, "Next boundary at %#x, end dma = %#x\n",
|
||||||
(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),
|
(unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),
|
||||||
@ -2616,7 +2621,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
||||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
(addr & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
trb_buff_len = min_t(int, trb_buff_len, this_sg_len);
|
trb_buff_len = min_t(int, trb_buff_len, this_sg_len);
|
||||||
if (running_total + trb_buff_len > urb->transfer_buffer_length)
|
if (running_total + trb_buff_len > urb->transfer_buffer_length)
|
||||||
trb_buff_len =
|
trb_buff_len =
|
||||||
@ -2656,7 +2661,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||||||
num_trbs = 0;
|
num_trbs = 0;
|
||||||
/* How much data is (potentially) left before the 64KB boundary? */
|
/* How much data is (potentially) left before the 64KB boundary? */
|
||||||
running_total = TRB_MAX_BUFF_SIZE -
|
running_total = TRB_MAX_BUFF_SIZE -
|
||||||
(urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
(urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
|
running_total &= TRB_MAX_BUFF_SIZE - 1;
|
||||||
|
|
||||||
/* If there's some data on this 64KB chunk, or we have to send a
|
/* If there's some data on this 64KB chunk, or we have to send a
|
||||||
* zero-length transfer, we need at least one TRB
|
* zero-length transfer, we need at least one TRB
|
||||||
@ -2700,8 +2706,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||||||
/* How much data is in the first TRB? */
|
/* How much data is in the first TRB? */
|
||||||
addr = (u64) urb->transfer_dma;
|
addr = (u64) urb->transfer_dma;
|
||||||
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
||||||
(urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
(urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
if (urb->transfer_buffer_length < trb_buff_len)
|
if (trb_buff_len > urb->transfer_buffer_length)
|
||||||
trb_buff_len = urb->transfer_buffer_length;
|
trb_buff_len = urb->transfer_buffer_length;
|
||||||
|
|
||||||
first_trb = true;
|
first_trb = true;
|
||||||
@ -2879,8 +2885,8 @@ static int count_isoc_trbs_needed(struct xhci_hcd *xhci,
|
|||||||
addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset);
|
addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset);
|
||||||
td_len = urb->iso_frame_desc[i].length;
|
td_len = urb->iso_frame_desc[i].length;
|
||||||
|
|
||||||
running_total = TRB_MAX_BUFF_SIZE -
|
running_total = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1));
|
||||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
running_total &= TRB_MAX_BUFF_SIZE - 1;
|
||||||
if (running_total != 0)
|
if (running_total != 0)
|
||||||
num_trbs++;
|
num_trbs++;
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ int xhci_halt(struct xhci_hcd *xhci)
|
|||||||
/*
|
/*
|
||||||
* Set the run bit and wait for the host to be running.
|
* Set the run bit and wait for the host to be running.
|
||||||
*/
|
*/
|
||||||
int xhci_start(struct xhci_hcd *xhci)
|
static int xhci_start(struct xhci_hcd *xhci)
|
||||||
{
|
{
|
||||||
u32 temp;
|
u32 temp;
|
||||||
int ret;
|
int ret;
|
||||||
@ -329,7 +329,7 @@ int xhci_init(struct usb_hcd *hcd)
|
|||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_USB_XHCI_HCD_DEBUGGING
|
#ifdef CONFIG_USB_XHCI_HCD_DEBUGGING
|
||||||
void xhci_event_ring_work(unsigned long arg)
|
static void xhci_event_ring_work(unsigned long arg)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int temp;
|
int temp;
|
||||||
@ -473,7 +473,7 @@ int xhci_run(struct usb_hcd *hcd)
|
|||||||
xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp));
|
xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp));
|
||||||
xhci_writel(xhci, ER_IRQ_ENABLE(temp),
|
xhci_writel(xhci, ER_IRQ_ENABLE(temp),
|
||||||
&xhci->ir_set->irq_pending);
|
&xhci->ir_set->irq_pending);
|
||||||
xhci_print_ir_set(xhci, xhci->ir_set, 0);
|
xhci_print_ir_set(xhci, 0);
|
||||||
|
|
||||||
if (NUM_TEST_NOOPS > 0)
|
if (NUM_TEST_NOOPS > 0)
|
||||||
doorbell = xhci_setup_one_noop(xhci);
|
doorbell = xhci_setup_one_noop(xhci);
|
||||||
@ -528,7 +528,7 @@ void xhci_stop(struct usb_hcd *hcd)
|
|||||||
temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
||||||
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
||||||
&xhci->ir_set->irq_pending);
|
&xhci->ir_set->irq_pending);
|
||||||
xhci_print_ir_set(xhci, xhci->ir_set, 0);
|
xhci_print_ir_set(xhci, 0);
|
||||||
|
|
||||||
xhci_dbg(xhci, "cleaning up memory\n");
|
xhci_dbg(xhci, "cleaning up memory\n");
|
||||||
xhci_mem_cleanup(xhci);
|
xhci_mem_cleanup(xhci);
|
||||||
@ -755,7 +755,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||||||
temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
temp = xhci_readl(xhci, &xhci->ir_set->irq_pending);
|
||||||
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
||||||
&xhci->ir_set->irq_pending);
|
&xhci->ir_set->irq_pending);
|
||||||
xhci_print_ir_set(xhci, xhci->ir_set, 0);
|
xhci_print_ir_set(xhci, 0);
|
||||||
|
|
||||||
xhci_dbg(xhci, "cleaning up memory\n");
|
xhci_dbg(xhci, "cleaning up memory\n");
|
||||||
xhci_mem_cleanup(xhci);
|
xhci_mem_cleanup(xhci);
|
||||||
@ -857,7 +857,7 @@ unsigned int xhci_last_valid_endpoint(u32 added_ctxs)
|
|||||||
/* Returns 1 if the arguments are OK;
|
/* Returns 1 if the arguments are OK;
|
||||||
* returns 0 this is a root hub; returns -EINVAL for NULL pointers.
|
* returns 0 this is a root hub; returns -EINVAL for NULL pointers.
|
||||||
*/
|
*/
|
||||||
int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,
|
static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,
|
||||||
struct usb_host_endpoint *ep, int check_ep, bool check_virt_dev,
|
struct usb_host_endpoint *ep, int check_ep, bool check_virt_dev,
|
||||||
const char *func) {
|
const char *func) {
|
||||||
struct xhci_hcd *xhci;
|
struct xhci_hcd *xhci;
|
||||||
@ -1693,7 +1693,7 @@ static void xhci_setup_input_ctx_for_config_ep(struct xhci_hcd *xhci,
|
|||||||
xhci_dbg_ctx(xhci, in_ctx, xhci_last_valid_endpoint(add_flags));
|
xhci_dbg_ctx(xhci, in_ctx, xhci_last_valid_endpoint(add_flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci,
|
static void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci,
|
||||||
unsigned int slot_id, unsigned int ep_index,
|
unsigned int slot_id, unsigned int ep_index,
|
||||||
struct xhci_dequeue_state *deq_state)
|
struct xhci_dequeue_state *deq_state)
|
||||||
{
|
{
|
||||||
|
@ -1348,7 +1348,7 @@ static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* xHCI debugging */
|
/* xHCI debugging */
|
||||||
void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num);
|
void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num);
|
||||||
void xhci_print_registers(struct xhci_hcd *xhci);
|
void xhci_print_registers(struct xhci_hcd *xhci);
|
||||||
void xhci_dbg_regs(struct xhci_hcd *xhci);
|
void xhci_dbg_regs(struct xhci_hcd *xhci);
|
||||||
void xhci_print_run_regs(struct xhci_hcd *xhci);
|
void xhci_print_run_regs(struct xhci_hcd *xhci);
|
||||||
|
@ -1864,6 +1864,7 @@ allocate_instance(struct device *dev,
|
|||||||
INIT_LIST_HEAD(&musb->out_bulk);
|
INIT_LIST_HEAD(&musb->out_bulk);
|
||||||
|
|
||||||
hcd->uses_new_polling = 1;
|
hcd->uses_new_polling = 1;
|
||||||
|
hcd->has_tt = 1;
|
||||||
|
|
||||||
musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
|
musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
|
||||||
musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON;
|
musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON;
|
||||||
|
@ -488,6 +488,15 @@ struct musb {
|
|||||||
unsigned set_address:1;
|
unsigned set_address:1;
|
||||||
unsigned test_mode:1;
|
unsigned test_mode:1;
|
||||||
unsigned softconnect:1;
|
unsigned softconnect:1;
|
||||||
|
|
||||||
|
u8 address;
|
||||||
|
u8 test_mode_nr;
|
||||||
|
u16 ackpend; /* ep0 */
|
||||||
|
enum musb_g_ep0_state ep0_state;
|
||||||
|
struct usb_gadget g; /* the gadget */
|
||||||
|
struct usb_gadget_driver *gadget_driver; /* its driver */
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Remove this flag.
|
* FIXME: Remove this flag.
|
||||||
*
|
*
|
||||||
@ -501,14 +510,6 @@ struct musb {
|
|||||||
*/
|
*/
|
||||||
unsigned double_buffer_not_ok:1 __deprecated;
|
unsigned double_buffer_not_ok:1 __deprecated;
|
||||||
|
|
||||||
u8 address;
|
|
||||||
u8 test_mode_nr;
|
|
||||||
u16 ackpend; /* ep0 */
|
|
||||||
enum musb_g_ep0_state ep0_state;
|
|
||||||
struct usb_gadget g; /* the gadget */
|
|
||||||
struct usb_gadget_driver *gadget_driver; /* its driver */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct musb_hdrc_config *config;
|
struct musb_hdrc_config *config;
|
||||||
|
|
||||||
#ifdef MUSB_CONFIG_PROC_FS
|
#ifdef MUSB_CONFIG_PROC_FS
|
||||||
|
@ -362,6 +362,7 @@ static int omap2430_musb_init(struct musb *musb)
|
|||||||
|
|
||||||
static int omap2430_musb_exit(struct musb *musb)
|
static int omap2430_musb_exit(struct musb *musb)
|
||||||
{
|
{
|
||||||
|
del_timer_sync(&musb_idle_timer);
|
||||||
|
|
||||||
omap2430_low_level_exit(musb);
|
omap2430_low_level_exit(musb);
|
||||||
otg_put_transceiver(musb->xceiv);
|
otg_put_transceiver(musb->xceiv);
|
||||||
|
@ -301,6 +301,9 @@ static const struct usb_device_id id_table[] = {
|
|||||||
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
|
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
|
||||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||||
},
|
},
|
||||||
|
{ USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */
|
||||||
|
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||||
|
},
|
||||||
{ USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */
|
{ USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */
|
||||||
|
|
||||||
{ }
|
{ }
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user