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
209 changed files with 1842 additions and 735 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -28,6 +28,7 @@ modules.builtin
|
|||
*.gz
|
||||
*.bz2
|
||||
*.lzma
|
||||
*.xz
|
||||
*.lzo
|
||||
*.patch
|
||||
*.gcno
|
||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -1692,6 +1692,13 @@ M: Andy Whitcroft <apw@canonical.com>
|
|||
S: Supported
|
||||
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
|
||||
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
||||
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||
|
@ -5266,7 +5273,7 @@ S: Maintained
|
|||
F: drivers/net/wireless/rtl818x/rtl8180/
|
||||
|
||||
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: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
@ -6104,7 +6111,7 @@ S: Maintained
|
|||
F: security/tomoyo/
|
||||
|
||||
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
|
||||
S: Maintained
|
||||
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;
|
||||
|
||||
/* 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) {
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
#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) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
(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);
|
||||
(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);
|
||||
(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_init_done = 1;
|
||||
|
||||
|
|
|
@ -38,8 +38,8 @@
|
|||
#define OMAP4430_PRCM_MPU_CPU1_INST 0x0800
|
||||
|
||||
/* PRCM_MPU clockdomain register offsets (from instance start) */
|
||||
#define OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS 0x0000
|
||||
#define OMAP4430_PRCM_MPU_CPU1_MPU_CDOFFS 0x0000
|
||||
#define OMAP4430_PRCM_MPU_CPU0_MPU_CDOFFS 0x0018
|
||||
#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);
|
||||
}
|
||||
|
||||
(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) debugfs_create_x32("errweight", S_IRUGO, dbg_dir,
|
||||
&sr_info->err_weight);
|
||||
|
@ -939,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
strcpy(name, "volt_");
|
||||
sprintf(volt_name, "%d", volt_data[i].volt_nominal);
|
||||
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));
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <asm/mach/time.h>
|
||||
#include <plat/dmtimer.h>
|
||||
#include <asm/localtimer.h>
|
||||
#include <asm/sched_clock.h>
|
||||
|
||||
#include "timer-gp.h"
|
||||
|
||||
|
@ -190,6 +191,7 @@ static void __init omap2_gp_clocksource_init(void)
|
|||
/*
|
||||
* clocksource
|
||||
*/
|
||||
static DEFINE_CLOCK_DATA(cd);
|
||||
static struct omap_dm_timer *gpt_clocksource;
|
||||
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
||||
{
|
||||
|
@ -204,6 +206,15 @@ static struct clocksource clocksource_gpt = {
|
|||
.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 */
|
||||
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);
|
||||
|
||||
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, tick_rate);
|
||||
|
||||
if (clocksource_register_hz(&clocksource_gpt, tick_rate))
|
||||
printk(err2, clocksource_gpt.name);
|
||||
}
|
||||
|
|
|
@ -57,5 +57,6 @@ struct tegra_kbc_platform_data {
|
|||
const struct matrix_keymap_data *keymap_data;
|
||||
|
||||
bool wakeup;
|
||||
bool use_fn_map;
|
||||
};
|
||||
#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 *mbox;
|
||||
int ret;
|
||||
struct omap_mbox *_mbox, *mbox = NULL;
|
||||
int i, ret;
|
||||
|
||||
if (!mboxes)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
for (mbox = *mboxes; mbox; mbox++)
|
||||
if (!strcmp(mbox->name, name))
|
||||
for (i = 0; (_mbox = mboxes[i]); i++) {
|
||||
if (!strcmp(_mbox->name, name)) {
|
||||
mbox = _mbox;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mbox)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
|
|
@ -72,11 +72,6 @@ SECTIONS
|
|||
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||
.init.data : { INIT_DATA }
|
||||
.init.setup : { INIT_SETUP(16) }
|
||||
#ifdef CONFIG_ETRAX_ARCH_V32
|
||||
__start___param = .;
|
||||
__param : { *(__param) }
|
||||
__stop___param = .;
|
||||
#endif
|
||||
.initcall.init : {
|
||||
INIT_CALLS
|
||||
}
|
||||
|
|
|
@ -88,6 +88,7 @@ extern int acpi_disabled;
|
|||
extern int acpi_pci_disabled;
|
||||
extern int acpi_skip_timer_override;
|
||||
extern int acpi_use_timer_override;
|
||||
extern int acpi_fix_pin2_polarity;
|
||||
|
||||
extern u8 acpi_sci_flags;
|
||||
extern int acpi_sci_override_gsi;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
#define ARCH_P4_CNTRVAL_BITS (40)
|
||||
#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_SHIFT 25
|
||||
|
|
|
@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
|||
*/
|
||||
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)
|
||||
|
|
|
@ -72,6 +72,7 @@ u8 acpi_sci_flags __initdata;
|
|||
int acpi_sci_override_gsi __initdata;
|
||||
int acpi_skip_timer_override __initdata;
|
||||
int acpi_use_timer_override __initdata;
|
||||
int acpi_fix_pin2_polarity __initdata;
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
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;
|
||||
}
|
||||
|
||||
if (acpi_skip_timer_override &&
|
||||
intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
||||
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
||||
return 0;
|
||||
if (intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
||||
if (acpi_skip_timer_override) {
|
||||
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
||||
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,
|
||||
|
|
|
@ -284,7 +284,7 @@ static int __init apbt_clockevent_register(void)
|
|||
memcpy(&adev->evt, &apbt_clockevent, sizeof(struct clock_event_device));
|
||||
|
||||
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;
|
||||
printk(KERN_DEBUG "%s clockevent registered as global\n",
|
||||
global_clock_event->name);
|
||||
|
|
|
@ -770,9 +770,14 @@ static inline int p4_pmu_clear_cccr_ovf(struct hw_perf_event *hwc)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* it might be unflagged overflow */
|
||||
rdmsrl(hwc->event_base + hwc->idx, v);
|
||||
if (!(v & ARCH_P4_CNTRVAL_MASK))
|
||||
/*
|
||||
* In some circumstances the overflow might issue an NMI but did
|
||||
* 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 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)
|
||||
{
|
||||
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 &= 0xff;
|
||||
write_pci_config(num, slot, func, 0x70, old);
|
||||
|
||||
return d;
|
||||
}
|
||||
|
@ -160,11 +155,14 @@ static void __init ati_bugs_contd(int num, int slot, int func)
|
|||
{
|
||||
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;
|
||||
|
||||
rev = ati_sbx00_rev(num, slot, func);
|
||||
if (rev > 0x13)
|
||||
if (acpi_use_timer_override)
|
||||
return;
|
||||
|
||||
/* check for IRQ0 interrupt swap */
|
||||
|
|
|
@ -285,6 +285,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||
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);
|
||||
}
|
||||
|
||||
skip_emulated_instruction(&svm->vcpu);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -342,7 +342,7 @@ void blk_start_queue(struct request_queue *q)
|
|||
WARN_ON(!irqs_disabled());
|
||||
|
||||
queue_flag_clear(QUEUE_FLAG_STOPPED, q);
|
||||
__blk_run_queue(q);
|
||||
__blk_run_queue(q, false);
|
||||
}
|
||||
EXPORT_SYMBOL(blk_start_queue);
|
||||
|
||||
|
@ -396,13 +396,14 @@ EXPORT_SYMBOL(blk_sync_queue);
|
|||
/**
|
||||
* __blk_run_queue - run a single device queue
|
||||
* @q: The queue to run
|
||||
* @force_kblockd: Don't run @q->request_fn directly. Use kblockd.
|
||||
*
|
||||
* Description:
|
||||
* See @blk_run_queue. This variant must be called with the queue lock
|
||||
* 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);
|
||||
|
||||
|
@ -416,7 +417,7 @@ void __blk_run_queue(struct request_queue *q)
|
|||
* Only recurse once to avoid overrunning the stack, let the unplug
|
||||
* 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);
|
||||
queue_flag_clear(QUEUE_FLAG_REENTER, q);
|
||||
} else {
|
||||
|
@ -439,7 +440,7 @@ void blk_run_queue(struct request_queue *q)
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
__blk_run_queue(q);
|
||||
__blk_run_queue(q, false);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
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);
|
||||
__elv_add_request(q, rq, where, 0);
|
||||
__blk_run_queue(q);
|
||||
__blk_run_queue(q, false);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
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);
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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)
|
||||
__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_pending_idx ^= 1;
|
||||
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_FRONT);
|
||||
elv_insert(q, &q->flush_rq, ELEVATOR_INSERT_REQUEUE);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -266,9 +271,12 @@ static void flush_data_end_io(struct request *rq, int error)
|
|||
struct request_queue *q = rq->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)
|
||||
__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
|
||||
* @sector: start sector
|
||||
* @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 */
|
||||
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 rb_root rb;
|
||||
struct rb_node *left;
|
||||
|
@ -345,10 +350,9 @@ static void throtl_schedule_next_dispatch(struct throtl_data *td)
|
|||
update_min_dispatch_time(st);
|
||||
|
||||
if (time_before_eq(st->min_disptime, jiffies))
|
||||
throtl_schedule_delayed_work(td->queue, 0);
|
||||
throtl_schedule_delayed_work(td, 0);
|
||||
else
|
||||
throtl_schedule_delayed_work(td->queue,
|
||||
(st->min_disptime - jiffies));
|
||||
throtl_schedule_delayed_work(td, (st->min_disptime - jiffies));
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -815,10 +819,10 @@ void blk_throtl_work(struct work_struct *work)
|
|||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
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_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",
|
||||
delay, jiffies);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(throtl_schedule_delayed_work);
|
||||
|
||||
static void
|
||||
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();
|
||||
|
||||
/* 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,
|
||||
|
@ -934,7 +937,7 @@ static void throtl_update_blkio_group_write_bps(void *key,
|
|||
smp_mb__before_atomic_inc();
|
||||
atomic_inc(&td->limits_changed);
|
||||
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,
|
||||
|
@ -948,7 +951,7 @@ static void throtl_update_blkio_group_read_iops(void *key,
|
|||
smp_mb__before_atomic_inc();
|
||||
atomic_inc(&td->limits_changed);
|
||||
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,
|
||||
|
@ -962,7 +965,7 @@ static void throtl_update_blkio_group_write_iops(void *key,
|
|||
smp_mb__before_atomic_inc();
|
||||
atomic_inc(&td->limits_changed);
|
||||
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)
|
||||
|
@ -1135,6 +1138,10 @@ void blk_throtl_exit(struct request_queue *q)
|
|||
|
||||
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);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -3324,7 +3324,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||
cfqd->busy_queues > 1) {
|
||||
cfq_del_timer(cfqd, cfqq);
|
||||
cfq_clear_cfqq_wait_request(cfqq);
|
||||
__blk_run_queue(cfqd->queue);
|
||||
__blk_run_queue(cfqd->queue, false);
|
||||
} else {
|
||||
cfq_blkiocg_update_idle_time_stats(
|
||||
&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
|
||||
*/
|
||||
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;
|
||||
|
||||
spin_lock_irq(q->queue_lock);
|
||||
__blk_run_queue(cfqd->queue);
|
||||
__blk_run_queue(cfqd->queue, false);
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
}
|
||||
|
||||
|
|
|
@ -602,7 +602,7 @@ void elv_quiesce_start(struct request_queue *q)
|
|||
*/
|
||||
elv_drain_elevator(q);
|
||||
while (q->rq.elvpriv) {
|
||||
__blk_run_queue(q);
|
||||
__blk_run_queue(q, false);
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
msleep(10);
|
||||
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
|
||||
* processing.
|
||||
*/
|
||||
__blk_run_queue(q);
|
||||
__blk_run_queue(q, false);
|
||||
break;
|
||||
|
||||
case ELEVATOR_INSERT_SORT:
|
||||
|
|
|
@ -1355,7 +1355,7 @@ int invalidate_partition(struct gendisk *disk, int partno)
|
|||
struct block_device *bdev = bdget_disk(disk, partno);
|
||||
if (bdev) {
|
||||
fsync_bdev(bdev);
|
||||
res = __invalidate_device(bdev);
|
||||
res = __invalidate_device(bdev, true);
|
||||
bdput(bdev);
|
||||
}
|
||||
return res;
|
||||
|
|
|
@ -294,9 +294,11 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
|
|||
return -EINVAL;
|
||||
if (get_user(n, (int __user *) arg))
|
||||
return -EFAULT;
|
||||
if (!(mode & FMODE_EXCL) &&
|
||||
blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
|
||||
return -EBUSY;
|
||||
if (!(mode & FMODE_EXCL)) {
|
||||
bdgrab(bdev);
|
||||
if (blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
|
||||
return -EBUSY;
|
||||
}
|
||||
ret = set_blocksize(bdev, n);
|
||||
if (!(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];
|
||||
if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
|
||||
continue;
|
||||
__invalidate_device(bdev);
|
||||
__invalidate_device(bdev, true);
|
||||
}
|
||||
mutex_unlock(&open_lock);
|
||||
} else {
|
||||
|
|
|
@ -78,7 +78,6 @@
|
|||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
static DEFINE_MUTEX(loop_mutex);
|
||||
static LIST_HEAD(loop_devices);
|
||||
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;
|
||||
|
||||
mutex_lock(&loop_mutex);
|
||||
mutex_lock(&lo->lo_ctl_mutex);
|
||||
lo->lo_refcnt++;
|
||||
mutex_unlock(&lo->lo_ctl_mutex);
|
||||
mutex_unlock(&loop_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1515,7 +1512,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
|
|||
struct loop_device *lo = disk->private_data;
|
||||
int err;
|
||||
|
||||
mutex_lock(&loop_mutex);
|
||||
mutex_lock(&lo->lo_ctl_mutex);
|
||||
|
||||
if (--lo->lo_refcnt)
|
||||
|
@ -1540,7 +1536,6 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
|
|||
out:
|
||||
mutex_unlock(&lo->lo_ctl_mutex);
|
||||
out_unlocked:
|
||||
mutex_unlock(&loop_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,6 +41,9 @@ static struct usb_device_id ath3k_table[] = {
|
|||
|
||||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03F0, 0x311D) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
@ -105,6 +105,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||
/* Atheros AR9285 Malbec with sflash firmware */
|
||||
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Broadcom BCM2035 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .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 (!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) {
|
||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
||||
usb_kill_anchored_urbs(&data->isoc_anchor);
|
||||
|
@ -858,7 +861,7 @@ static void btusb_work(struct work_struct *work)
|
|||
|
||||
__set_isoc_interface(hdev, 0);
|
||||
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_enable_autosuspend(interface_to_usbdev(intf));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -773,18 +773,23 @@ int __init agp_amd64_init(void)
|
|||
#else
|
||||
printk(KERN_INFO PFX "You can boot with agp=try_unsupported\n");
|
||||
#endif
|
||||
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* Look for any AGP bridge */
|
||||
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
||||
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;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -130,6 +130,7 @@
|
|||
#define INTEL_GMCH_GMS_STOLEN_352M (0xd << 4)
|
||||
|
||||
#define I915_IFPADDR 0x60
|
||||
#define I830_HIC 0x70
|
||||
|
||||
/* Intel 965G registers */
|
||||
#define I965_MSAC 0x62
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/agp_backend.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/smp.h>
|
||||
#include "agp.h"
|
||||
#include "intel-agp.h"
|
||||
|
@ -70,12 +71,8 @@ static struct _intel_private {
|
|||
u32 __iomem *gtt; /* I915G */
|
||||
bool clear_fake_agp; /* on first access via agp, fill with scratch */
|
||||
int num_dcache_entries;
|
||||
union {
|
||||
void __iomem *i9xx_flush_page;
|
||||
void *i8xx_flush_page;
|
||||
};
|
||||
void __iomem *i9xx_flush_page;
|
||||
char *i81x_gtt_table;
|
||||
struct page *i8xx_page;
|
||||
struct resource ifp_resource;
|
||||
int resource_valid;
|
||||
struct page *scratch_page;
|
||||
|
@ -722,28 +719,6 @@ static int intel_fake_agp_fetch_size(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
|
||||
|
@ -758,14 +733,27 @@ static void intel_i830_setup_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)
|
||||
clflush_cache_range(pg, 1024);
|
||||
else if (wbinvd_on_all_cpus() != 0)
|
||||
printk(KERN_ERR "Timed out waiting for cache flush.\n");
|
||||
/* Now we've only seen documents for this magic bit on 855GM,
|
||||
* we hope it exists for the other gen2 chipsets...
|
||||
*
|
||||
* 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,
|
||||
|
@ -849,8 +837,6 @@ static int i830_setup(void)
|
|||
|
||||
intel_private.gtt_bus_addr = reg_addr + I810_PTE_BASE;
|
||||
|
||||
intel_i830_setup_flush();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -830,8 +830,7 @@ static void monitor_card(unsigned long p)
|
|||
test_bit(IS_ANY_T1, &dev->flags))) {
|
||||
DEBUGP(4, dev, "Perform AUTOPPS\n");
|
||||
set_bit(IS_AUTOPPS_ACT, &dev->flags);
|
||||
ptsreq.protocol = ptsreq.protocol =
|
||||
(0x01 << dev->proto);
|
||||
ptsreq.protocol = (0x01 << dev->proto);
|
||||
ptsreq.flags = 0x01;
|
||||
ptsreq.pts1 = 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)
|
||||
{
|
||||
struct ipw_dev *ipw = priv_data;
|
||||
struct resource *io_resource;
|
||||
int ret;
|
||||
|
||||
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)
|
||||
return ret;
|
||||
|
||||
io_resource = request_region(p_dev->resource[0]->start,
|
||||
resource_size(p_dev->resource[0]),
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
if (!request_region(p_dev->resource[0]->start,
|
||||
resource_size(p_dev->resource[0]),
|
||||
IPWIRELESS_PCCARD_NAME)) {
|
||||
ret = -EBUSY;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
p_dev->resource[2]->flags |=
|
||||
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);
|
||||
if (ret != 0)
|
||||
goto exit2;
|
||||
goto exit1;
|
||||
|
||||
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]));
|
||||
request_mem_region(p_dev->resource[2]->start,
|
||||
resource_size(p_dev->resource[2]),
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
if (!request_mem_region(p_dev->resource[2]->start,
|
||||
resource_size(p_dev->resource[2]),
|
||||
IPWIRELESS_PCCARD_NAME)) {
|
||||
ret = -EBUSY;
|
||||
goto exit2;
|
||||
}
|
||||
|
||||
p_dev->resource[3]->flags |= WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM |
|
||||
WIN_ENABLE;
|
||||
p_dev->resource[3]->end = 0; /* this used to be 0x1000 */
|
||||
ret = pcmcia_request_window(p_dev, p_dev->resource[3], 0);
|
||||
if (ret != 0)
|
||||
goto exit2;
|
||||
goto exit3;
|
||||
|
||||
ret = pcmcia_map_mem_page(p_dev, p_dev->resource[3], 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,
|
||||
resource_size(p_dev->resource[3]));
|
||||
request_mem_region(p_dev->resource[3]->start,
|
||||
resource_size(p_dev->resource[3]),
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
if (!request_mem_region(p_dev->resource[3]->start,
|
||||
resource_size(p_dev->resource[3]),
|
||||
IPWIRELESS_PCCARD_NAME)) {
|
||||
ret = -EBUSY;
|
||||
goto exit4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
exit4:
|
||||
iounmap(ipw->attr_memory);
|
||||
exit3:
|
||||
release_mem_region(p_dev->resource[2]->start,
|
||||
resource_size(p_dev->resource[2]));
|
||||
exit2:
|
||||
if (ipw->common_memory) {
|
||||
release_mem_region(p_dev->resource[2]->start,
|
||||
resource_size(p_dev->resource[2]));
|
||||
iounmap(ipw->common_memory);
|
||||
}
|
||||
iounmap(ipw->common_memory);
|
||||
exit1:
|
||||
release_resource(io_resource);
|
||||
release_region(p_dev->resource[0]->start,
|
||||
resource_size(p_dev->resource[0]));
|
||||
exit:
|
||||
pcmcia_disable_device(p_dev);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int config_ipwireless(struct ipw_dev *ipw)
|
||||
|
@ -219,6 +229,8 @@ static int config_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) {
|
||||
release_mem_region(ipw->link->resource[2]->start,
|
||||
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
|
||||
* hope for the best.
|
||||
*/
|
||||
if ((vblrc > 0) && (abs(diff_ns) > 1000000))
|
||||
if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
|
||||
atomic_inc(&dev->_vblank_count[crtc]);
|
||||
smp_mb__after_atomic_inc();
|
||||
}
|
||||
|
||||
/* Invalidate all timestamps while vblank irq's are off. */
|
||||
clear_vblank_timestamps(dev, crtc);
|
||||
|
@ -491,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc)
|
|||
/* Dot clock in Hz: */
|
||||
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? */
|
||||
if (dotclock > 0) {
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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.
|
||||
* Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
|
||||
* 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) {
|
||||
tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
|
||||
vblanktimestamp(dev, crtc, tslot) = t_vblank;
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
smp_mb__before_atomic_inc();
|
||||
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_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 (!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
|
||||
* 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. */
|
||||
vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
|
||||
smp_wmb();
|
||||
|
||||
/* Increment cooked vblank count. This also atomically commits
|
||||
* the timestamp computed above.
|
||||
*/
|
||||
smp_mb__before_atomic_inc();
|
||||
atomic_inc(&dev->_vblank_count[crtc]);
|
||||
smp_mb__after_atomic_inc();
|
||||
} else {
|
||||
DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
|
||||
crtc, (int) diff_ns);
|
||||
|
|
|
@ -184,7 +184,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
|
|||
static bool
|
||||
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 */
|
||||
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 */
|
||||
if (INTEL_INFO(dev)->gen >= 4) {
|
||||
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 intel_encoder *encoder;
|
||||
|
||||
DRM_DEBUG_KMS("running encoder hotplug functions\n");
|
||||
|
||||
list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
|
||||
if (encoder->hot_plug)
|
||||
encoder->hot_plug(encoder);
|
||||
|
@ -1649,9 +1651,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
|||
} else {
|
||||
hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
||||
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
||||
hotplug_mask |= SDE_AUX_MASK | SDE_FDI_MASK | SDE_TRANS_MASK;
|
||||
I915_WRITE(FDI_RXA_IMR, 0);
|
||||
I915_WRITE(FDI_RXB_IMR, 0);
|
||||
hotplug_mask |= SDE_AUX_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;
|
||||
|
||||
wait_event(dev_priv->pending_flip_queue,
|
||||
atomic_read(&dev_priv->mm.wedged) ||
|
||||
atomic_read(&obj->pending_flip) == 0);
|
||||
|
||||
/* Big Hammer, we also need to ensure that any pending
|
||||
* MI_WAIT_FOR_EVENT inside a user batch buffer on the
|
||||
* current scanout is retired before unpinning the old
|
||||
* framebuffer.
|
||||
*
|
||||
* This should only fail upon a hung GPU, in which case we
|
||||
* can safely continue.
|
||||
*/
|
||||
ret = i915_gem_object_flush_gpu(obj, false);
|
||||
if (ret) {
|
||||
i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return ret;
|
||||
}
|
||||
(void) ret;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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 plane = intel_crtc->plane;
|
||||
u32 reg, temp;
|
||||
bool is_pch_port = false;
|
||||
|
||||
if (intel_crtc->active)
|
||||
return;
|
||||
|
@ -2066,7 +2092,56 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||
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 */
|
||||
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);
|
||||
}
|
||||
|
||||
/* Skip the PCH stuff if possible */
|
||||
if (!is_pch_port)
|
||||
goto done;
|
||||
|
||||
/* For PCH output, training FDI link */
|
||||
if (IS_GEN6(dev))
|
||||
gen6_fdi_link_train(crtc);
|
||||
|
@ -2184,7 +2263,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
|||
I915_WRITE(reg, temp | TRANS_ENABLE);
|
||||
if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
|
||||
DRM_ERROR("failed to enable transcoder %d\n", pipe);
|
||||
|
||||
done:
|
||||
intel_crtc_load_lut(crtc);
|
||||
intel_update_fbc(dev);
|
||||
intel_crtc_update_cursor(crtc, true);
|
||||
|
@ -6496,7 +6575,7 @@ static void ironlake_disable_rc6(struct drm_device *dev)
|
|||
POSTING_READ(RSTDBYCTL);
|
||||
}
|
||||
|
||||
ironlake_disable_rc6(dev);
|
||||
ironlake_teardown_rc6(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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -3490,7 +3490,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
|
|||
track->num_texture = 16;
|
||||
track->maxy = 4096;
|
||||
track->separate_cube = 0;
|
||||
track->aaresolve = true;
|
||||
track->aaresolve = false;
|
||||
track->aa.robj = NULL;
|
||||
}
|
||||
|
||||
|
@ -3801,8 +3801,6 @@ static int r100_startup(struct radeon_device *rdev)
|
|||
r100_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
r100_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
// r100_gpu_init(rdev);
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
int ret;
|
||||
int aligned_size, size;
|
||||
int height = mode_cmd->height;
|
||||
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
ret = radeon_gem_object_create(rdev, aligned_size, 0,
|
||||
RADEON_GEM_DOMAIN_VRAM,
|
||||
|
|
|
@ -242,6 +242,7 @@ static const struct i2c_device_id ad7414_id[] = {
|
|||
{ "ad7414", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ad7414_id);
|
||||
|
||||
static struct i2c_driver ad7414_driver = {
|
||||
.driver = {
|
||||
|
|
|
@ -334,6 +334,7 @@ static const struct i2c_device_id adt7411_id[] = {
|
|||
{ "adt7411", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, adt7411_id);
|
||||
|
||||
static struct i2c_driver adt7411_driver = {
|
||||
.driver = {
|
||||
|
|
|
@ -847,11 +847,15 @@ omap_i2c_isr(int this_irq, void *dev_id)
|
|||
dev_err(dev->dev, "Arbitration lost\n");
|
||||
err |= OMAP_I2C_STAT_AL;
|
||||
}
|
||||
/*
|
||||
* ProDB0017052: Clear ARDY bit twice
|
||||
*/
|
||||
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
||||
OMAP_I2C_STAT_AL)) {
|
||||
omap_i2c_ack_stat(dev, stat &
|
||||
(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);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -1137,12 +1141,41 @@ omap_i2c_remove(struct platform_device *pdev)
|
|||
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 = {
|
||||
.probe = omap_i2c_probe,
|
||||
.remove = omap_i2c_remove,
|
||||
.driver = {
|
||||
.name = "omap_i2c",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = OMAP_I2C_PM_OPS,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -942,7 +942,7 @@ stu300_probe(struct platform_device *pdev)
|
|||
adap->owner = THIS_MODULE;
|
||||
/* DDC class but actually often used for more generic I2C */
|
||||
adap->class = I2C_CLASS_DDC;
|
||||
strncpy(adap->name, "ST Microelectronics DDC I2C adapter",
|
||||
strlcpy(adap->name, "ST Microelectronics DDC I2C adapter",
|
||||
sizeof(adap->name));
|
||||
adap->nr = bus_nr;
|
||||
adap->algo = &stu300_algo;
|
||||
|
|
|
@ -360,7 +360,7 @@ static int gameport_queue_event(void *object, struct module *owner,
|
|||
event->owner = owner;
|
||||
|
||||
list_add_tail(&event->node, &gameport_event_list);
|
||||
schedule_work(&gameport_event_work);
|
||||
queue_work(system_long_wq, &gameport_event_work);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&gameport_event_lock, flags);
|
||||
|
|
|
@ -71,8 +71,9 @@ struct tegra_kbc {
|
|||
spinlock_t lock;
|
||||
unsigned int repoll_dly;
|
||||
unsigned long cp_dly_jiffies;
|
||||
bool use_fn_map;
|
||||
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 int num_pressed_keys;
|
||||
struct timer_list timer;
|
||||
|
@ -178,6 +179,40 @@ static const u32 tegra_kbc_default_keymap[] = {
|
|||
KEY(15, 5, KEY_F2),
|
||||
KEY(15, 6, KEY_CAPSLOCK),
|
||||
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 = {
|
||||
|
@ -224,6 +259,7 @@ static void tegra_kbc_report_keys(struct tegra_kbc *kbc)
|
|||
unsigned int i;
|
||||
unsigned int num_down = 0;
|
||||
unsigned long flags;
|
||||
bool fn_keypress = false;
|
||||
|
||||
spin_lock_irqsave(&kbc->lock, flags);
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
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->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;
|
||||
matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
|
||||
input_dev->keycode, input_dev->keybit);
|
||||
|
|
|
@ -51,6 +51,29 @@
|
|||
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||
#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_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
||||
#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;
|
||||
|
||||
list_add_tail(&event->node, &serio_event_list);
|
||||
schedule_work(&serio_event_work);
|
||||
queue_work(system_long_wq, &serio_event_work);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&serio_event_lock, flags);
|
||||
|
|
|
@ -216,7 +216,6 @@ static int linear_run (mddev_t *mddev)
|
|||
|
||||
if (md_check_no_bitmap(mddev))
|
||||
return -EINVAL;
|
||||
mddev->queue->queue_lock = &mddev->queue->__queue_lock;
|
||||
conf = linear_conf(mddev, mddev->raid_disks);
|
||||
|
||||
if (!conf)
|
||||
|
|
|
@ -553,6 +553,9 @@ static mddev_t * mddev_find(dev_t unit)
|
|||
{
|
||||
mddev_t *mddev, *new = NULL;
|
||||
|
||||
if (unit && MAJOR(unit) != MD_MAJOR)
|
||||
unit &= ~((1<<MdpMinorShift)-1);
|
||||
|
||||
retry:
|
||||
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;
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
if (mddev->pers)
|
||||
if (mddev->pers) {
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
revalidate_disk(mddev->gendisk);
|
||||
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -4624,6 +4627,7 @@ static int do_md_run(mddev_t *mddev)
|
|||
}
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
revalidate_disk(mddev->gendisk);
|
||||
mddev->changed = 1;
|
||||
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
|
||||
out:
|
||||
return err;
|
||||
|
@ -4712,6 +4716,7 @@ static void md_clean(mddev_t *mddev)
|
|||
mddev->sync_speed_min = mddev->sync_speed_max = 0;
|
||||
mddev->recovery = 0;
|
||||
mddev->in_sync = 0;
|
||||
mddev->changed = 0;
|
||||
mddev->degraded = 0;
|
||||
mddev->safemode = 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);
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
mddev->changed = 1;
|
||||
revalidate_disk(disk);
|
||||
|
||||
if (mddev->ro)
|
||||
|
@ -6011,7 +6017,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
|
|||
atomic_inc(&mddev->openers);
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
|
||||
check_disk_size_change(mddev->gendisk, bdev);
|
||||
check_disk_change(bdev);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
@ -6026,6 +6032,21 @@ static int md_release(struct gendisk *disk, fmode_t mode)
|
|||
|
||||
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 =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -6036,6 +6057,8 @@ static const struct block_device_operations md_fops =
|
|||
.compat_ioctl = md_compat_ioctl,
|
||||
#endif
|
||||
.getgeo = md_getgeo,
|
||||
.media_changed = md_media_changed,
|
||||
.revalidate_disk= md_revalidate,
|
||||
};
|
||||
|
||||
static int md_thread(void * arg)
|
||||
|
|
|
@ -274,6 +274,8 @@ struct mddev_s
|
|||
atomic_t active; /* general refcount */
|
||||
atomic_t openers; /* number of active opens */
|
||||
|
||||
int changed; /* True if we might need to
|
||||
* reread partition info */
|
||||
int degraded; /* whether md should consider
|
||||
* adding a spare
|
||||
*/
|
||||
|
|
|
@ -435,7 +435,6 @@ static int multipath_run (mddev_t *mddev)
|
|||
* bookkeeping area. [whatever we allocate in multipath_run(),
|
||||
* should be freed in multipath_stop()]
|
||||
*/
|
||||
mddev->queue->queue_lock = &mddev->queue->__queue_lock;
|
||||
|
||||
conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL);
|
||||
mddev->private = conf;
|
||||
|
|
|
@ -361,7 +361,6 @@ static int raid0_run(mddev_t *mddev)
|
|||
if (md_check_no_bitmap(mddev))
|
||||
return -EINVAL;
|
||||
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 (mddev->private == NULL) {
|
||||
|
@ -670,6 +669,7 @@ static void *raid0_takeover_raid1(mddev_t *mddev)
|
|||
mddev->new_layout = 0;
|
||||
mddev->new_chunk_sectors = 128; /* by default set chunk size to 64k */
|
||||
mddev->delta_disks = 1 - mddev->raid_disks;
|
||||
mddev->raid_disks = 1;
|
||||
/* make sure it will be not marked as dirty */
|
||||
mddev->recovery_cp = MaxSector;
|
||||
|
||||
|
|
|
@ -593,7 +593,10 @@ static int flush_pending_writes(conf_t *conf)
|
|||
if (conf->pending_bio_list.head) {
|
||||
struct bio *bio;
|
||||
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);
|
||||
spin_unlock(conf->mddev->queue->queue_lock);
|
||||
spin_unlock_irq(&conf->device_lock);
|
||||
/* flush any pending bitmap writes to
|
||||
* 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);
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
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);
|
||||
}
|
||||
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))
|
||||
return PTR_ERR(conf);
|
||||
|
||||
mddev->queue->queue_lock = &conf->device_lock;
|
||||
list_for_each_entry(rdev, &mddev->disks, same_set) {
|
||||
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
||||
rdev->data_offset << 9);
|
||||
|
|
|
@ -662,7 +662,10 @@ static int flush_pending_writes(conf_t *conf)
|
|||
if (conf->pending_bio_list.head) {
|
||||
struct bio *bio;
|
||||
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);
|
||||
spin_unlock(conf->mddev->queue->queue_lock);
|
||||
spin_unlock_irq(&conf->device_lock);
|
||||
/* flush any pending bitmap writes to disk
|
||||
* before proceeding w/ I/O */
|
||||
|
@ -971,7 +974,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
|
|||
atomic_inc(&r10_bio->remaining);
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -2304,8 +2307,6 @@ static int run(mddev_t *mddev)
|
|||
if (!conf)
|
||||
goto out;
|
||||
|
||||
mddev->queue->queue_lock = &conf->device_lock;
|
||||
|
||||
mddev->thread = conf->thread;
|
||||
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_fn = raid5_congested;
|
||||
mddev->queue->queue_lock = &conf->device_lock;
|
||||
mddev->queue->unplug_fn = raid5_unplug_queue;
|
||||
|
||||
chunk_size = mddev->chunk_sectors << 9;
|
||||
|
|
|
@ -802,10 +802,7 @@ dm9000_init_dm9000(struct net_device *dev)
|
|||
/* Checksum mode */
|
||||
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_GPR, 0); /* Enable PHY */
|
||||
|
||||
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;
|
||||
|
||||
/* Save previous register address */
|
||||
reg_save = readb(db->io_addr);
|
||||
spin_lock_irqsave(&db->lock, flags);
|
||||
reg_save = readb(db->io_addr);
|
||||
|
||||
netif_stop_queue(dev);
|
||||
dm9000_reset(db);
|
||||
|
@ -1194,6 +1191,10 @@ dm9000_open(struct net_device *dev)
|
|||
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
|
||||
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 */
|
||||
dm9000_reset(db);
|
||||
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;
|
||||
|
||||
RTL_W8(ERIDR, cmd);
|
||||
|
@ -630,7 +631,7 @@ static void rtl8168_oob_notify(void __iomem *ioaddr, u8 cmd)
|
|||
break;
|
||||
}
|
||||
|
||||
ocp_write(ioaddr, 0x1, 0x30, 0x00000001);
|
||||
ocp_write(tp, 0x1, 0x30, 0x00000001);
|
||||
}
|
||||
|
||||
#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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (((tp->mac_version == RTL_GIGA_MAC_VER_23) ||
|
||||
(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) {
|
||||
case RTL_GIGA_MAC_VER_25:
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -2900,12 +2906,17 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
|
|||
{
|
||||
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;
|
||||
}
|
||||
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_25:
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -3042,7 +3053,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
goto err_out_mwi_2;
|
||||
}
|
||||
|
||||
tp->cp_cmd = PCIMulRW | RxChkSum;
|
||||
tp->cp_cmd = RxChkSum;
|
||||
|
||||
if ((sizeof(dma_addr_t) > 4) &&
|
||||
!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 */
|
||||
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)
|
||||
udelay(20);
|
||||
|
||||
|
@ -3847,8 +3859,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||
Cxpl_dbg_sel | \
|
||||
ASF | \
|
||||
PktCntrDisable | \
|
||||
PCIDAC | \
|
||||
PCIMulRW)
|
||||
Mac_dbgo_sel)
|
||||
|
||||
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))
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -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(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)
|
||||
|
@ -3918,6 +3925,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
|
||||
switch (tp->mac_version) {
|
||||
case RTL_GIGA_MAC_VER_07:
|
||||
rtl_hw_start_8102e_1(ioaddr, pdev);
|
||||
|
@ -3932,14 +3941,13 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||
break;
|
||||
}
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
|
||||
RTL_W8(MaxTxPacketSize, TxPacketMax);
|
||||
|
||||
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(IntrMitigate, 0x0000);
|
||||
|
@ -3949,14 +3957,10 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||
rtl_set_rx_tx_config_registers(tp);
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
|
||||
RTL_R8(IntrMask);
|
||||
|
||||
rtl_set_rx_mode(dev);
|
||||
|
||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||
|
||||
RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
|
||||
|
||||
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 efx_nic *efx = netdev_priv(net_dev);
|
||||
struct efx_self_tests efx_tests;
|
||||
struct efx_self_tests *efx_tests;
|
||||
int already_up;
|
||||
int rc;
|
||||
int rc = -ENOMEM;
|
||||
|
||||
efx_tests = kzalloc(sizeof(*efx_tests), GFP_KERNEL);
|
||||
if (!efx_tests)
|
||||
goto fail;
|
||||
|
||||
|
||||
ASSERT_RTNL();
|
||||
if (efx->state != STATE_RUNNING) {
|
||||
|
@ -589,13 +594,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
|
|||
if (rc) {
|
||||
netif_err(efx, drv, efx->net_dev,
|
||||
"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)
|
||||
dev_close(efx->net_dev);
|
||||
|
@ -604,10 +607,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
|
|||
rc == 0 ? "passed" : "failed",
|
||||
(test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
|
||||
|
||||
fail2:
|
||||
fail1:
|
||||
fail1:
|
||||
/* 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)
|
||||
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 */
|
||||
.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 */
|
||||
.driver_info = (unsigned long)&dm9601_info,
|
||||
|
|
|
@ -282,6 +282,34 @@ int ath5k_hw_phy_disable(struct ath5k_hw *ah)
|
|||
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 *
|
||||
|
@ -1253,6 +1281,7 @@ static int ath5k_hw_channel(struct ath5k_hw *ah,
|
|||
case AR5K_RF5111:
|
||||
ret = ath5k_hw_rf5111_channel(ah, channel);
|
||||
break;
|
||||
case AR5K_RF2317:
|
||||
case AR5K_RF2425:
|
||||
ret = ath5k_hw_rf2425_channel(ah, channel);
|
||||
break;
|
||||
|
@ -3237,6 +3266,13 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||
/* Failed */
|
||||
if (i >= 100)
|
||||
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)
|
||||
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
|
||||
* initvals, so we don't have to modify
|
||||
* any settings (5210 also only supports
|
||||
* a/aturbo modes)
|
||||
*/
|
||||
if ((ah->ah_version != AR5K_AR5210) && !fast) {
|
||||
if (ah->ah_version != AR5K_AR5210) {
|
||||
|
||||
/*
|
||||
* Write initial RF gain settings
|
||||
|
@ -3276,22 +3352,6 @@ int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
|
|||
if (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 2111 frequency converter + CCK)*/
|
||||
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);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
ath5k_hw_wait_for_synth(ah, channel);
|
||||
|
||||
if (fast)
|
||||
/*
|
||||
* Release RF Bus grant
|
||||
*/
|
||||
AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_RFBUS_REQ,
|
||||
AR5K_PHY_RFBUS_REQ_REQUEST);
|
||||
else {
|
||||
/*
|
||||
* Perform ADC test to see if baseband is ready
|
||||
* Set tx hold and check adc test register
|
||||
*/
|
||||
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);
|
||||
/*
|
||||
* Perform ADC test to see if baseband is ready
|
||||
* Set tx hold and check adc test register
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
* Start automatic gain control calibration
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/pm_qos_params.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "common.h"
|
||||
|
@ -57,8 +56,6 @@ struct ath_node;
|
|||
|
||||
#define A_MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
|
||||
#define ATH9K_PM_QOS_DEFAULT_VALUE 55
|
||||
|
||||
#define TSF_TO_TU(_h,_l) \
|
||||
((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
|
||||
|
||||
|
@ -633,8 +630,6 @@ struct ath_softc {
|
|||
struct ath_descdma txsdma;
|
||||
|
||||
struct ath_ant_comb ant_comb;
|
||||
|
||||
struct pm_qos_request_list pm_qos_req;
|
||||
};
|
||||
|
||||
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 int ath9k_modparam_nohwcrypt;
|
||||
extern int led_blink;
|
||||
extern int ath9k_pm_qos_value;
|
||||
extern bool is_ath9k_unloaded;
|
||||
|
||||
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_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;
|
||||
/* 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_start_rfkill_poll(sc);
|
||||
|
||||
pm_qos_add_request(&sc->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
|
||||
return 0;
|
||||
|
||||
error_world:
|
||||
|
@ -831,7 +824,6 @@ void ath9k_deinit_device(struct ath_softc *sc)
|
|||
}
|
||||
|
||||
ieee80211_unregister_hw(hw);
|
||||
pm_qos_remove_request(&sc->pm_qos_req);
|
||||
ath_rx_cleanup(sc);
|
||||
ath_tx_cleanup(sc);
|
||||
ath9k_deinit_softc(sc);
|
||||
|
|
|
@ -1173,12 +1173,6 @@ static int ath9k_start(struct ieee80211_hw *hw)
|
|||
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)
|
||||
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;
|
||||
|
||||
pm_qos_update_request(&sc->pm_qos_req, PM_QOS_DEFAULT_VALUE);
|
||||
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
||||
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) {
|
||||
u16 len;
|
||||
struct sk_buff *skb;
|
||||
dma_addr_t dma_addr;
|
||||
desc = &ring[i];
|
||||
len = le16_to_cpu(desc->len);
|
||||
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;
|
||||
}
|
||||
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);
|
||||
|
||||
if (p54_rx(dev, skb)) {
|
||||
pci_unmap_single(priv->pdev,
|
||||
le32_to_cpu(desc->host_addr),
|
||||
priv->common.rx_mtu + 32,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pci_unmap_single(priv->pdev, dma_addr,
|
||||
priv->common.rx_mtu + 32, PCI_DMA_FROMDEVICE);
|
||||
rx_buf[i] = NULL;
|
||||
desc->host_addr = 0;
|
||||
desc->host_addr = cpu_to_le32(0);
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -652,6 +652,12 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry,
|
|||
*/
|
||||
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)
|
||||
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
||||
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) },
|
||||
#endif
|
||||
#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, 0x3062), 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;
|
||||
|
||||
/*
|
||||
* 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)
|
||||
rxdesc->flags |= RX_FLAG_DECRYPTED;
|
||||
else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
menuconfig NFC_DEVICES
|
||||
bool "NFC devices"
|
||||
bool "Near Field Communication (NFC) devices"
|
||||
default n
|
||||
---help---
|
||||
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 miscdevice miscdev;
|
||||
struct i2c_client *i2c_dev;
|
||||
struct regulator_bulk_data regs[2];
|
||||
struct regulator_bulk_data regs[3];
|
||||
|
||||
enum pn544_state state;
|
||||
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_vbat[] = "VBat";
|
||||
static const char reg_vsim[] = "VSim";
|
||||
|
||||
/* sysfs interface */
|
||||
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[1].supply = reg_vbat;
|
||||
info->regs[2].supply = reg_vsim;
|
||||
r = regulator_bulk_get(&client->dev, ARRAY_SIZE(info->regs),
|
||||
info->regs);
|
||||
if (r < 0)
|
||||
|
|
|
@ -518,6 +518,8 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev)
|
|||
flags |= CONF_ENABLE_IOCARD;
|
||||
if (flags & CONF_ENABLE_IOCARD)
|
||||
s->socket.flags |= SS_IOCARD;
|
||||
if (flags & CONF_ENABLE_ZVCARD)
|
||||
s->socket.flags |= SS_ZVCARD | SS_IOCARD;
|
||||
if (flags & CONF_ENABLE_SPKR) {
|
||||
s->socket.flags |= SS_SPKR_ENA;
|
||||
status = CCSR_AUDIO_ENA;
|
||||
|
|
|
@ -215,7 +215,7 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
|
|||
}
|
||||
#endif
|
||||
|
||||
static void pxa2xx_configure_sockets(struct device *dev)
|
||||
void pxa2xx_configure_sockets(struct device *dev)
|
||||
{
|
||||
struct pcmcia_low_level *ops = dev->platform_data;
|
||||
/*
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||
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);
|
||||
|
||||
pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
|
||||
pxa2xx_configure_sockets(&sadev->dev);
|
||||
ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
|
||||
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;
|
||||
int captured = 0;
|
||||
struct pps_ktime ts_real;
|
||||
struct pps_ktime ts_real = { .sec = 0, .nsec = 0, .flags = 0 };
|
||||
|
||||
/* check event type */
|
||||
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 */
|
||||
if (capable(CAP_SYS_ADMIN))
|
||||
size = 0x200000;
|
||||
size = RIO_MAINT_SPACE_SZ;
|
||||
|
||||
if (off > size)
|
||||
if (off >= size)
|
||||
return 0;
|
||||
if (off + count > size) {
|
||||
size -= off;
|
||||
|
@ -147,10 +147,10 @@ rio_write_config(struct file *filp, struct kobject *kobj,
|
|||
loff_t init_off = off;
|
||||
u8 *data = (u8 *) buf;
|
||||
|
||||
if (off > 0x200000)
|
||||
if (off >= RIO_MAINT_SPACE_SZ)
|
||||
return 0;
|
||||
if (off + count > 0x200000) {
|
||||
size = 0x200000 - off;
|
||||
if (off + count > RIO_MAINT_SPACE_SZ) {
|
||||
size = RIO_MAINT_SPACE_SZ - off;
|
||||
count = size;
|
||||
}
|
||||
|
||||
|
@ -200,7 +200,7 @@ static struct bin_attribute rio_config_attr = {
|
|||
.name = "config",
|
||||
.mode = S_IRUGO | S_IWUSR,
|
||||
},
|
||||
.size = 0x200000,
|
||||
.size = RIO_MAINT_SPACE_SZ,
|
||||
.read = rio_read_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);
|
||||
|
||||
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];
|
||||
}
|
||||
|
|
|
@ -120,6 +120,7 @@ static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
|
|||
return REGULATOR_MODE_IDLE;
|
||||
default:
|
||||
BUG();
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -309,7 +309,7 @@ static const struct rtc_class_ops at91_rtc_ops = {
|
|||
.read_alarm = at91_rtc_readalarm,
|
||||
.set_alarm = at91_rtc_setalarm,
|
||||
.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
|
||||
*
|
||||
* Copyright (C) 2009-2010 Freescale Semiconductor.
|
||||
* Copyright (C) 2009-2011 Freescale Semiconductor.
|
||||
* Author: Jack Lan <jack.lan@freescale.com>
|
||||
*
|
||||
* 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_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_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)
|
||||
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[1] = bin2bcd(time->tm_min);
|
||||
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[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) {
|
||||
buf[5] |= 0x80;
|
||||
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);
|
||||
if (flagset)
|
||||
queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||
__blk_run_queue(sdev->request_queue);
|
||||
__blk_run_queue(sdev->request_queue, false);
|
||||
if (flagset)
|
||||
queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||
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);
|
||||
if (flagset)
|
||||
queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q);
|
||||
__blk_run_queue(rport->rqst_q);
|
||||
__blk_run_queue(rport->rqst_q, false);
|
||||
if (flagset)
|
||||
queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q);
|
||||
spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags);
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
menuconfig THERMAL
|
||||
tristate "Generic Thermal sysfs driver"
|
||||
depends on NET
|
||||
help
|
||||
Generic Thermal Sysfs driver offers a generic mechanism for
|
||||
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 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)
|
||||
{
|
||||
int err;
|
||||
|
@ -1225,6 +1211,18 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
|
|||
|
||||
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)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
@ -1301,6 +1299,15 @@ static int genetlink_init(void)
|
|||
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)
|
||||
{
|
||||
int result = 0;
|
||||
|
@ -1316,11 +1323,6 @@ static int __init thermal_init(void)
|
|||
return result;
|
||||
}
|
||||
|
||||
static void genetlink_exit(void)
|
||||
{
|
||||
genl_unregister_family(&thermal_event_genl_family);
|
||||
}
|
||||
|
||||
static void __exit thermal_exit(void)
|
||||
{
|
||||
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);
|
||||
|
||||
if (!udev->config && oldspeed == USB_SPEED_SUPER) {
|
||||
/* Don't reset USB 3.0 devices during an initial setup */
|
||||
usb_set_device_state(udev, USB_STATE_DEFAULT);
|
||||
} else {
|
||||
/* Reset the device; full speed may morph to high speed */
|
||||
/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
|
||||
retval = hub_port_reset(hub, port1, udev, delay);
|
||||
if (retval < 0) /* error or disconnect */
|
||||
goto fail;
|
||||
/* success, speed is known */
|
||||
}
|
||||
/* Reset the device; full speed may morph to high speed */
|
||||
/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
|
||||
retval = hub_port_reset(hub, port1, udev, delay);
|
||||
if (retval < 0) /* error or disconnect */
|
||||
goto fail;
|
||||
/* success, speed is known */
|
||||
|
||||
retval = -ENODEV;
|
||||
|
||||
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_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 */
|
||||
{ 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 */
|
||||
{ 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 */
|
||||
{ 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;
|
||||
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 */
|
||||
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);
|
||||
}
|
||||
|
||||
void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,
|
||||
static void xhci_dbg_ep_ctx(struct xhci_hcd *xhci,
|
||||
struct xhci_container_ctx *ctx,
|
||||
unsigned int last_ep)
|
||||
{
|
||||
|
|
|
@ -307,7 +307,7 @@ struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci,
|
|||
|
||||
/***************** 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,
|
||||
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
|
||||
* 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,
|
||||
gfp_t mem_flags)
|
||||
{
|
||||
|
@ -1900,11 +1900,11 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
val &= DBOFF_MASK;
|
||||
xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x"
|
||||
" 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_print_run_regs(xhci);
|
||||
/* 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
|
||||
|
@ -1961,7 +1961,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
/* Set the event ring dequeue address */
|
||||
xhci_set_hc_event_deq(xhci);
|
||||
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
|
||||
|
|
|
@ -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,
|
||||
dev->eps[ep_index].stopped_trb,
|
||||
&state->new_cycle_state);
|
||||
if (!state->new_deq_seg)
|
||||
BUG();
|
||||
if (!state->new_deq_seg) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Dig out the cycle state saved by the xHC during the stop ep cmd */
|
||||
xhci_dbg(xhci, "Finding endpoint context\n");
|
||||
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_ptr,
|
||||
&state->new_cycle_state);
|
||||
if (!state->new_deq_seg)
|
||||
BUG();
|
||||
if (!state->new_deq_seg) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
trb = &state->new_deq_ptr->generic;
|
||||
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 */
|
||||
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)
|
||||
num_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++;
|
||||
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)
|
||||
{
|
||||
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__,
|
||||
urb->ep->desc.bEndpointAddress, num_trbs);
|
||||
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",
|
||||
__func__,
|
||||
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;
|
||||
addr = (u64) sg_dma_address(sg);
|
||||
this_sg_len = sg_dma_len(sg);
|
||||
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
||||
trb_buff_len = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1));
|
||||
trb_buff_len = min_t(int, trb_buff_len, this_sg_len);
|
||||
if (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_buff_len);
|
||||
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_dbg(xhci, "Next boundary at %#x, end dma = %#x\n",
|
||||
(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 -
|
||||
(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);
|
||||
if (running_total + trb_buff_len > urb->transfer_buffer_length)
|
||||
trb_buff_len =
|
||||
|
@ -2656,7 +2661,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
|||
num_trbs = 0;
|
||||
/* How much data is (potentially) left before the 64KB boundary? */
|
||||
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
|
||||
* 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? */
|
||||
addr = (u64) urb->transfer_dma;
|
||||
trb_buff_len = TRB_MAX_BUFF_SIZE -
|
||||
(urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
||||
if (urb->transfer_buffer_length < trb_buff_len)
|
||||
(urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1));
|
||||
if (trb_buff_len > urb->transfer_buffer_length)
|
||||
trb_buff_len = urb->transfer_buffer_length;
|
||||
|
||||
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);
|
||||
td_len = urb->iso_frame_desc[i].length;
|
||||
|
||||
running_total = TRB_MAX_BUFF_SIZE -
|
||||
(addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1));
|
||||
running_total = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1));
|
||||
running_total &= TRB_MAX_BUFF_SIZE - 1;
|
||||
if (running_total != 0)
|
||||
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.
|
||||
*/
|
||||
int xhci_start(struct xhci_hcd *xhci)
|
||||
static int xhci_start(struct xhci_hcd *xhci)
|
||||
{
|
||||
u32 temp;
|
||||
int ret;
|
||||
|
@ -329,7 +329,7 @@ int xhci_init(struct usb_hcd *hcd)
|
|||
|
||||
|
||||
#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;
|
||||
int temp;
|
||||
|
@ -473,7 +473,7 @@ int xhci_run(struct usb_hcd *hcd)
|
|||
xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp));
|
||||
xhci_writel(xhci, ER_IRQ_ENABLE(temp),
|
||||
&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)
|
||||
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);
|
||||
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
||||
&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_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);
|
||||
xhci_writel(xhci, ER_IRQ_DISABLE(temp),
|
||||
&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_mem_cleanup(xhci);
|
||||
|
@ -857,7 +857,7 @@ unsigned int xhci_last_valid_endpoint(u32 added_ctxs)
|
|||
/* Returns 1 if the arguments are OK;
|
||||
* 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,
|
||||
const char *func) {
|
||||
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));
|
||||
}
|
||||
|
||||
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,
|
||||
struct xhci_dequeue_state *deq_state)
|
||||
{
|
||||
|
|
|
@ -1348,7 +1348,7 @@ static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)
|
|||
}
|
||||
|
||||
/* 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_dbg_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);
|
||||
|
||||
hcd->uses_new_polling = 1;
|
||||
hcd->has_tt = 1;
|
||||
|
||||
musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
|
||||
musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON;
|
||||
|
|
|
@ -488,6 +488,15 @@ struct musb {
|
|||
unsigned set_address:1;
|
||||
unsigned test_mode: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.
|
||||
*
|
||||
|
@ -501,14 +510,6 @@ struct musb {
|
|||
*/
|
||||
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;
|
||||
|
||||
#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)
|
||||
{
|
||||
del_timer_sync(&musb_idle_timer);
|
||||
|
||||
omap2430_low_level_exit(musb);
|
||||
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 */
|
||||
.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 */
|
||||
|
||||
{ }
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue