mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge branch 'linux-3.8.y' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroid-3.8.y-mdrjr
This commit is contained in:
@@ -11,6 +11,9 @@ Required properties:
|
||||
- "nvidia,tegra20-uart"
|
||||
- "nxp,lpc3220-uart"
|
||||
- "ibm,qpace-nwp-serial"
|
||||
- "altr,16550-FIFO32"
|
||||
- "altr,16550-FIFO64"
|
||||
- "altr,16550-FIFO128"
|
||||
- "serial" if the port type is unknown.
|
||||
- reg : offset and length of the register set for the device.
|
||||
- interrupts : should contain uart interrupt.
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 3
|
||||
SUBLEVEL = 4
|
||||
EXTRAVERSION =
|
||||
NAME = Unicycling Gorilla
|
||||
|
||||
|
||||
@@ -176,6 +176,7 @@ static struct w1_gpio_platform_data w1_gpio_pdata = {
|
||||
/* If you choose to use a pin other than PB16 it needs to be 3.3V */
|
||||
.pin = AT91_PIN_PB16,
|
||||
.is_open_drain = 1,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device w1_device = {
|
||||
|
||||
@@ -188,6 +188,7 @@ static struct spi_board_info portuxg20_spi_devices[] = {
|
||||
static struct w1_gpio_platform_data w1_gpio_pdata = {
|
||||
.pin = AT91_PIN_PA29,
|
||||
.is_open_drain = 1,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device w1_device = {
|
||||
|
||||
@@ -743,6 +743,9 @@ EXPORT_SYMBOL(edma_free_channel);
|
||||
*/
|
||||
int edma_alloc_slot(unsigned ctlr, int slot)
|
||||
{
|
||||
if (!edma_cc[ctlr])
|
||||
return -EINVAL;
|
||||
|
||||
if (slot >= 0)
|
||||
slot = EDMA_CHAN_SLOT(slot);
|
||||
|
||||
|
||||
@@ -163,6 +163,7 @@ static struct platform_device vulcan_max6369 = {
|
||||
|
||||
static struct w1_gpio_platform_data vulcan_w1_gpio_pdata = {
|
||||
.pin = 14,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device vulcan_w1_gpio = {
|
||||
|
||||
@@ -41,16 +41,12 @@ static void __init kirkwood_legacy_clk_init(void)
|
||||
|
||||
struct device_node *np = of_find_compatible_node(
|
||||
NULL, NULL, "marvell,kirkwood-gating-clock");
|
||||
|
||||
struct of_phandle_args clkspec;
|
||||
struct clk *clk;
|
||||
|
||||
clkspec.np = np;
|
||||
clkspec.args_count = 1;
|
||||
|
||||
clkspec.args[0] = CGC_BIT_GE0;
|
||||
orion_clkdev_add(NULL, "mv643xx_eth_port.0",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_PEX0;
|
||||
orion_clkdev_add("0", "pcie",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
@@ -63,14 +59,24 @@ static void __init kirkwood_legacy_clk_init(void)
|
||||
orion_clkdev_add("1", "pcie",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_GE1;
|
||||
orion_clkdev_add(NULL, "mv643xx_eth_port.1",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_SDIO;
|
||||
orion_clkdev_add(NULL, "mvsdio",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
/*
|
||||
* The ethernet interfaces forget the MAC address assigned by
|
||||
* u-boot if the clocks are turned off. Until proper DT support
|
||||
* is available we always enable them for now.
|
||||
*/
|
||||
clkspec.args[0] = CGC_BIT_GE0;
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
orion_clkdev_add(NULL, "mv643xx_eth_port.0", clk);
|
||||
clk_prepare_enable(clk);
|
||||
|
||||
clkspec.args[0] = CGC_BIT_GE1;
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
orion_clkdev_add(NULL, "mv643xx_eth_port.1", clk);
|
||||
clk_prepare_enable(clk);
|
||||
}
|
||||
|
||||
static void __init kirkwood_of_clk_init(void)
|
||||
|
||||
@@ -505,6 +505,7 @@ static struct w1_gpio_platform_data w1_gpio_platform_data = {
|
||||
.pin = GPIO_ONE_WIRE,
|
||||
.is_open_drain = 0,
|
||||
.enable_external_pullup = w1_enable_external_pullup,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
struct platform_device raumfeld_w1_gpio_device = {
|
||||
|
||||
@@ -343,17 +343,16 @@ extern void slb_set_size(u16 size);
|
||||
/*
|
||||
* VSID allocation (256MB segment)
|
||||
*
|
||||
* We first generate a 38-bit "proto-VSID". For kernel addresses this
|
||||
* is equal to the ESID | 1 << 37, for user addresses it is:
|
||||
* (context << USER_ESID_BITS) | (esid & ((1U << USER_ESID_BITS) - 1)
|
||||
* We first generate a 37-bit "proto-VSID". Proto-VSIDs are generated
|
||||
* from mmu context id and effective segment id of the address.
|
||||
*
|
||||
* This splits the proto-VSID into the below range
|
||||
* 0 - (2^(CONTEXT_BITS + USER_ESID_BITS) - 1) : User proto-VSID range
|
||||
* 2^(CONTEXT_BITS + USER_ESID_BITS) - 2^(VSID_BITS) : Kernel proto-VSID range
|
||||
*
|
||||
* We also have CONTEXT_BITS + USER_ESID_BITS = VSID_BITS - 1
|
||||
* That is, we assign half of the space to user processes and half
|
||||
* to the kernel.
|
||||
* For user processes max context id is limited to ((1ul << 19) - 5)
|
||||
* for kernel space, we use the top 4 context ids to map address as below
|
||||
* NOTE: each context only support 64TB now.
|
||||
* 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ]
|
||||
* 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ]
|
||||
* 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ]
|
||||
* 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ]
|
||||
*
|
||||
* The proto-VSIDs are then scrambled into real VSIDs with the
|
||||
* multiplicative hash:
|
||||
@@ -363,41 +362,49 @@ extern void slb_set_size(u16 size);
|
||||
* VSID_MULTIPLIER is prime, so in particular it is
|
||||
* co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
|
||||
* Because the modulus is 2^n-1 we can compute it efficiently without
|
||||
* a divide or extra multiply (see below).
|
||||
* a divide or extra multiply (see below). The scramble function gives
|
||||
* robust scattering in the hash table (at least based on some initial
|
||||
* results).
|
||||
*
|
||||
* This scheme has several advantages over older methods:
|
||||
* We also consider VSID 0 special. We use VSID 0 for slb entries mapping
|
||||
* bad address. This enables us to consolidate bad address handling in
|
||||
* hash_page.
|
||||
*
|
||||
* - We have VSIDs allocated for every kernel address
|
||||
* (i.e. everything above 0xC000000000000000), except the very top
|
||||
* segment, which simplifies several things.
|
||||
*
|
||||
* - We allow for USER_ESID_BITS significant bits of ESID and
|
||||
* CONTEXT_BITS bits of context for user addresses.
|
||||
* i.e. 64T (46 bits) of address space for up to half a million contexts.
|
||||
*
|
||||
* - The scramble function gives robust scattering in the hash
|
||||
* table (at least based on some initial results). The previous
|
||||
* method was more susceptible to pathological cases giving excessive
|
||||
* hash collisions.
|
||||
* We also need to avoid the last segment of the last context, because that
|
||||
* would give a protovsid of 0x1fffffffff. That will result in a VSID 0
|
||||
* because of the modulo operation in vsid scramble. But the vmemmap
|
||||
* (which is what uses region 0xf) will never be close to 64TB in size
|
||||
* (it's 56 bytes per page of system memory).
|
||||
*/
|
||||
|
||||
#define CONTEXT_BITS 19
|
||||
#define ESID_BITS 18
|
||||
#define ESID_BITS_1T 6
|
||||
|
||||
/*
|
||||
* 256MB segment
|
||||
* The proto-VSID space has 2^(CONTEX_BITS + ESID_BITS) - 1 segments
|
||||
* available for user + kernel mapping. The top 4 contexts are used for
|
||||
* kernel mapping. Each segment contains 2^28 bytes. Each
|
||||
* context maps 2^46 bytes (64TB) so we can support 2^19-1 contexts
|
||||
* (19 == 37 + 28 - 46).
|
||||
*/
|
||||
#define MAX_USER_CONTEXT ((ASM_CONST(1) << CONTEXT_BITS) - 5)
|
||||
|
||||
/*
|
||||
* This should be computed such that protovosid * vsid_mulitplier
|
||||
* doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
|
||||
*/
|
||||
#define VSID_MULTIPLIER_256M ASM_CONST(12538073) /* 24-bit prime */
|
||||
#define VSID_BITS_256M 38
|
||||
#define VSID_BITS_256M (CONTEXT_BITS + ESID_BITS)
|
||||
#define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1)
|
||||
|
||||
#define VSID_MULTIPLIER_1T ASM_CONST(12538073) /* 24-bit prime */
|
||||
#define VSID_BITS_1T 26
|
||||
#define VSID_BITS_1T (CONTEXT_BITS + ESID_BITS_1T)
|
||||
#define VSID_MODULUS_1T ((1UL<<VSID_BITS_1T)-1)
|
||||
|
||||
#define CONTEXT_BITS 19
|
||||
#define USER_ESID_BITS 18
|
||||
#define USER_ESID_BITS_1T 6
|
||||
|
||||
#define USER_VSID_RANGE (1UL << (USER_ESID_BITS + SID_SHIFT))
|
||||
#define USER_VSID_RANGE (1UL << (ESID_BITS + SID_SHIFT))
|
||||
|
||||
/*
|
||||
* This macro generates asm code to compute the VSID scramble
|
||||
@@ -421,7 +428,8 @@ extern void slb_set_size(u16 size);
|
||||
srdi rx,rt,VSID_BITS_##size; \
|
||||
clrldi rt,rt,(64-VSID_BITS_##size); \
|
||||
add rt,rt,rx; /* add high and low bits */ \
|
||||
/* Now, r3 == VSID (mod 2^36-1), and lies between 0 and \
|
||||
/* NOTE: explanation based on VSID_BITS_##size = 36 \
|
||||
* Now, r3 == VSID (mod 2^36-1), and lies between 0 and \
|
||||
* 2^36-1+2^28-1. That in particular means that if r3 >= \
|
||||
* 2^36-1, then r3+1 has the 2^36 bit set. So, if r3+1 has \
|
||||
* the bit clear, r3 already has the answer we want, if it \
|
||||
@@ -513,34 +521,6 @@ typedef struct {
|
||||
})
|
||||
#endif /* 1 */
|
||||
|
||||
/*
|
||||
* This is only valid for addresses >= PAGE_OFFSET
|
||||
* The proto-VSID space is divided into two class
|
||||
* User: 0 to 2^(CONTEXT_BITS + USER_ESID_BITS) -1
|
||||
* kernel: 2^(CONTEXT_BITS + USER_ESID_BITS) to 2^(VSID_BITS) - 1
|
||||
*
|
||||
* With KERNEL_START at 0xc000000000000000, the proto vsid for
|
||||
* the kernel ends up with 0xc00000000 (36 bits). With 64TB
|
||||
* support we need to have kernel proto-VSID in the
|
||||
* [2^37 to 2^38 - 1] range due to the increased USER_ESID_BITS.
|
||||
*/
|
||||
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
|
||||
{
|
||||
unsigned long proto_vsid;
|
||||
/*
|
||||
* We need to make sure proto_vsid for the kernel is
|
||||
* >= 2^(CONTEXT_BITS + USER_ESID_BITS[_1T])
|
||||
*/
|
||||
if (ssize == MMU_SEGSIZE_256M) {
|
||||
proto_vsid = ea >> SID_SHIFT;
|
||||
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS));
|
||||
return vsid_scramble(proto_vsid, 256M);
|
||||
}
|
||||
proto_vsid = ea >> SID_SHIFT_1T;
|
||||
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS_1T));
|
||||
return vsid_scramble(proto_vsid, 1T);
|
||||
}
|
||||
|
||||
/* Returns the segment size indicator for a user address */
|
||||
static inline int user_segment_size(unsigned long addr)
|
||||
{
|
||||
@@ -550,17 +530,41 @@ static inline int user_segment_size(unsigned long addr)
|
||||
return MMU_SEGSIZE_256M;
|
||||
}
|
||||
|
||||
/* This is only valid for user addresses (which are below 2^44) */
|
||||
static inline unsigned long get_vsid(unsigned long context, unsigned long ea,
|
||||
int ssize)
|
||||
{
|
||||
/*
|
||||
* Bad address. We return VSID 0 for that
|
||||
*/
|
||||
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE)
|
||||
return 0;
|
||||
|
||||
if (ssize == MMU_SEGSIZE_256M)
|
||||
return vsid_scramble((context << USER_ESID_BITS)
|
||||
return vsid_scramble((context << ESID_BITS)
|
||||
| (ea >> SID_SHIFT), 256M);
|
||||
return vsid_scramble((context << USER_ESID_BITS_1T)
|
||||
return vsid_scramble((context << ESID_BITS_1T)
|
||||
| (ea >> SID_SHIFT_1T), 1T);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is only valid for addresses >= PAGE_OFFSET
|
||||
*
|
||||
* For kernel space, we use the top 4 context ids to map address as below
|
||||
* 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ]
|
||||
* 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ]
|
||||
* 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ]
|
||||
* 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ]
|
||||
*/
|
||||
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
|
||||
{
|
||||
unsigned long context;
|
||||
|
||||
/*
|
||||
* kernel take the top 4 context from the available range
|
||||
*/
|
||||
context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1;
|
||||
return get_vsid(context, ea, ssize);
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_MMU_HASH64_H_ */
|
||||
|
||||
@@ -275,7 +275,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.cpu_features = CPU_FTRS_PPC970,
|
||||
.cpu_user_features = COMMON_USER_POWER4 |
|
||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||
.mmu_features = MMU_FTR_HPTE_TABLE,
|
||||
.mmu_features = MMU_FTRS_PPC970,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
|
||||
@@ -1268,20 +1268,36 @@ do_ste_alloc:
|
||||
_GLOBAL(do_stab_bolted)
|
||||
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
||||
std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */
|
||||
mfspr r11,SPRN_DAR /* ea */
|
||||
|
||||
/*
|
||||
* check for bad kernel/user address
|
||||
* (ea & ~REGION_MASK) >= PGTABLE_RANGE
|
||||
*/
|
||||
rldicr. r9,r11,4,(63 - 46 - 4)
|
||||
li r9,0 /* VSID = 0 for bad address */
|
||||
bne- 0f
|
||||
|
||||
/*
|
||||
* Calculate VSID:
|
||||
* This is the kernel vsid, we take the top for context from
|
||||
* the range. context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* Here we know that (ea >> 60) == 0xc
|
||||
*/
|
||||
lis r9,(MAX_USER_CONTEXT + 1)@ha
|
||||
addi r9,r9,(MAX_USER_CONTEXT + 1)@l
|
||||
|
||||
srdi r10,r11,SID_SHIFT
|
||||
rldimi r10,r9,ESID_BITS,0 /* proto vsid */
|
||||
ASM_VSID_SCRAMBLE(r10, r9, 256M)
|
||||
rldic r9,r10,12,16 /* r9 = vsid << 12 */
|
||||
|
||||
0:
|
||||
/* Hash to the primary group */
|
||||
ld r10,PACASTABVIRT(r13)
|
||||
mfspr r11,SPRN_DAR
|
||||
srdi r11,r11,28
|
||||
srdi r11,r11,SID_SHIFT
|
||||
rldimi r10,r11,7,52 /* r10 = first ste of the group */
|
||||
|
||||
/* Calculate VSID */
|
||||
/* This is a kernel address, so protovsid = ESID | 1 << 37 */
|
||||
li r9,0x1
|
||||
rldimi r11,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
||||
ASM_VSID_SCRAMBLE(r11, r9, 256M)
|
||||
rldic r9,r11,12,16 /* r9 = vsid << 12 */
|
||||
|
||||
/* Search the primary group for a free entry */
|
||||
1: ld r11,0(r10) /* Test valid bit of the current ste */
|
||||
andi. r11,r11,0x80
|
||||
|
||||
@@ -326,8 +326,8 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
|
||||
vcpu3s->context_id[0] = err;
|
||||
|
||||
vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
|
||||
<< USER_ESID_BITS) - 1;
|
||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
|
||||
<< ESID_BITS) - 1;
|
||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << ESID_BITS;
|
||||
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
|
||||
|
||||
kvmppc_mmu_hpte_init(vcpu);
|
||||
|
||||
@@ -194,6 +194,11 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||
unsigned long vpn = hpt_vpn(vaddr, vsid, ssize);
|
||||
unsigned long tprot = prot;
|
||||
|
||||
/*
|
||||
* If we hit a bad address return error.
|
||||
*/
|
||||
if (!vsid)
|
||||
return -1;
|
||||
/* Make kernel text executable */
|
||||
if (overlaps_kernel_text(vaddr, vaddr + step))
|
||||
tprot &= ~HPTE_R_N;
|
||||
@@ -758,6 +763,8 @@ void __init early_init_mmu(void)
|
||||
/* Initialize stab / SLB management */
|
||||
if (mmu_has_feature(MMU_FTR_SLB))
|
||||
slb_initialize();
|
||||
else
|
||||
stab_initialize(get_paca()->stab_real);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -921,11 +928,6 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
||||
DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n",
|
||||
ea, access, trap);
|
||||
|
||||
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE) {
|
||||
DBG_LOW(" out of pgtable range !\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Get region & vsid */
|
||||
switch (REGION_ID(ea)) {
|
||||
case USER_REGION_ID:
|
||||
@@ -956,6 +958,11 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
||||
}
|
||||
DBG_LOW(" mm=%p, mm->pgdir=%p, vsid=%016lx\n", mm, mm->pgd, vsid);
|
||||
|
||||
/* Bad address. */
|
||||
if (!vsid) {
|
||||
DBG_LOW("Bad address!\n");
|
||||
return 1;
|
||||
}
|
||||
/* Get pgdir */
|
||||
pgdir = mm->pgd;
|
||||
if (pgdir == NULL)
|
||||
@@ -1125,6 +1132,8 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
||||
/* Get VSID */
|
||||
ssize = user_segment_size(ea);
|
||||
vsid = get_vsid(mm->context.id, ea, ssize);
|
||||
if (!vsid)
|
||||
return;
|
||||
|
||||
/* Hash doesn't like irqs */
|
||||
local_irq_save(flags);
|
||||
@@ -1217,6 +1226,9 @@ static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
|
||||
hash = hpt_hash(vpn, PAGE_SHIFT, mmu_kernel_ssize);
|
||||
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
||||
|
||||
/* Don't create HPTE entries for bad address */
|
||||
if (!vsid)
|
||||
return;
|
||||
ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr),
|
||||
mode, HPTE_V_BOLTED,
|
||||
mmu_linear_psize, mmu_kernel_ssize);
|
||||
|
||||
@@ -29,15 +29,6 @@
|
||||
static DEFINE_SPINLOCK(mmu_context_lock);
|
||||
static DEFINE_IDA(mmu_context_ida);
|
||||
|
||||
/*
|
||||
* 256MB segment
|
||||
* The proto-VSID space has 2^(CONTEX_BITS + USER_ESID_BITS) - 1 segments
|
||||
* available for user mappings. Each segment contains 2^28 bytes. Each
|
||||
* context maps 2^46 bytes (64TB) so we can support 2^19-1 contexts
|
||||
* (19 == 37 + 28 - 46).
|
||||
*/
|
||||
#define MAX_CONTEXT ((1UL << CONTEXT_BITS) - 1)
|
||||
|
||||
int __init_new_context(void)
|
||||
{
|
||||
int index;
|
||||
@@ -56,7 +47,7 @@ again:
|
||||
else if (err)
|
||||
return err;
|
||||
|
||||
if (index > MAX_CONTEXT) {
|
||||
if (index > MAX_USER_CONTEXT) {
|
||||
spin_lock(&mmu_context_lock);
|
||||
ida_remove(&mmu_context_ida, index);
|
||||
spin_unlock(&mmu_context_lock);
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
#if TASK_SIZE_USER64 > (1UL << (USER_ESID_BITS + SID_SHIFT))
|
||||
#if TASK_SIZE_USER64 > (1UL << (ESID_BITS + SID_SHIFT))
|
||||
#error TASK_SIZE_USER64 exceeds user VSID range
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -31,10 +31,15 @@
|
||||
* No other registers are examined or changed.
|
||||
*/
|
||||
_GLOBAL(slb_allocate_realmode)
|
||||
/* r3 = faulting address */
|
||||
/*
|
||||
* check for bad kernel/user address
|
||||
* (ea & ~REGION_MASK) >= PGTABLE_RANGE
|
||||
*/
|
||||
rldicr. r9,r3,4,(63 - 46 - 4)
|
||||
bne- 8f
|
||||
|
||||
srdi r9,r3,60 /* get region */
|
||||
srdi r10,r3,28 /* get esid */
|
||||
srdi r10,r3,SID_SHIFT /* get esid */
|
||||
cmpldi cr7,r9,0xc /* cmp PAGE_OFFSET for later use */
|
||||
|
||||
/* r3 = address, r10 = esid, cr7 = <> PAGE_OFFSET */
|
||||
@@ -56,12 +61,14 @@ _GLOBAL(slb_allocate_realmode)
|
||||
*/
|
||||
_GLOBAL(slb_miss_kernel_load_linear)
|
||||
li r11,0
|
||||
li r9,0x1
|
||||
/*
|
||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
||||
* the necessary adjustment
|
||||
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* r9 = region id.
|
||||
*/
|
||||
rldimi r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
||||
addis r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@ha
|
||||
addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l
|
||||
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
b slb_finish_load
|
||||
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||
@@ -91,24 +98,19 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
|
||||
_GLOBAL(slb_miss_kernel_load_io)
|
||||
li r11,0
|
||||
6:
|
||||
li r9,0x1
|
||||
/*
|
||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
||||
* the necessary adjustment
|
||||
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* r9 = region id.
|
||||
*/
|
||||
rldimi r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
||||
addis r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@ha
|
||||
addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
b slb_finish_load
|
||||
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||
b slb_finish_load_1T
|
||||
|
||||
0: /* user address: proto-VSID = context << 15 | ESID. First check
|
||||
* if the address is within the boundaries of the user region
|
||||
*/
|
||||
srdi. r9,r10,USER_ESID_BITS
|
||||
bne- 8f /* invalid ea bits set */
|
||||
|
||||
|
||||
0:
|
||||
/* when using slices, we extract the psize off the slice bitmaps
|
||||
* and then we need to get the sllp encoding off the mmu_psize_defs
|
||||
* array.
|
||||
@@ -164,15 +166,13 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||
ld r9,PACACONTEXTID(r13)
|
||||
BEGIN_FTR_SECTION
|
||||
cmpldi r10,0x1000
|
||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
||||
rldimi r10,r9,USER_ESID_BITS,0
|
||||
BEGIN_FTR_SECTION
|
||||
bge slb_finish_load_1T
|
||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
||||
b slb_finish_load
|
||||
|
||||
8: /* invalid EA */
|
||||
li r10,0 /* BAD_VSID */
|
||||
li r9,0 /* BAD_VSID */
|
||||
li r11,SLB_VSID_USER /* flags don't much matter */
|
||||
b slb_finish_load
|
||||
|
||||
@@ -221,8 +221,6 @@ _GLOBAL(slb_allocate_user)
|
||||
|
||||
/* get context to calculate proto-VSID */
|
||||
ld r9,PACACONTEXTID(r13)
|
||||
rldimi r10,r9,USER_ESID_BITS,0
|
||||
|
||||
/* fall through slb_finish_load */
|
||||
|
||||
#endif /* __DISABLED__ */
|
||||
@@ -231,9 +229,10 @@ _GLOBAL(slb_allocate_user)
|
||||
/*
|
||||
* Finish loading of an SLB entry and return
|
||||
*
|
||||
* r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET
|
||||
* r3 = EA, r9 = context, r10 = ESID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET
|
||||
*/
|
||||
slb_finish_load:
|
||||
rldimi r10,r9,ESID_BITS,0
|
||||
ASM_VSID_SCRAMBLE(r10,r9,256M)
|
||||
/*
|
||||
* bits above VSID_BITS_256M need to be ignored from r10
|
||||
@@ -298,10 +297,11 @@ _GLOBAL(slb_compare_rr_to_size)
|
||||
/*
|
||||
* Finish loading of a 1T SLB entry (for the kernel linear mapping) and return.
|
||||
*
|
||||
* r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9
|
||||
* r3 = EA, r9 = context, r10 = ESID(256MB), r11 = flags, clobbers r9
|
||||
*/
|
||||
slb_finish_load_1T:
|
||||
srdi r10,r10,40-28 /* get 1T ESID */
|
||||
srdi r10,r10,(SID_SHIFT_1T - SID_SHIFT) /* get 1T ESID */
|
||||
rldimi r10,r9,ESID_BITS_1T,0
|
||||
ASM_VSID_SCRAMBLE(r10,r9,1T)
|
||||
/*
|
||||
* bits above VSID_BITS_1T need to be ignored from r10
|
||||
|
||||
@@ -82,11 +82,11 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
|
||||
if (!is_kernel_addr(addr)) {
|
||||
ssize = user_segment_size(addr);
|
||||
vsid = get_vsid(mm->context.id, addr, ssize);
|
||||
WARN_ON(vsid == 0);
|
||||
} else {
|
||||
vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
|
||||
ssize = mmu_kernel_ssize;
|
||||
}
|
||||
WARN_ON(vsid == 0);
|
||||
vpn = hpt_vpn(addr, vsid, ssize);
|
||||
rpte = __real_pte(__pte(pte), ptep);
|
||||
|
||||
|
||||
@@ -74,8 +74,6 @@ static inline void __tlb_flush_idte(unsigned long asce)
|
||||
|
||||
static inline void __tlb_flush_mm(struct mm_struct * mm)
|
||||
{
|
||||
if (unlikely(cpumask_empty(mm_cpumask(mm))))
|
||||
return;
|
||||
/*
|
||||
* If the machine has IDTE we prefer to do a per mm flush
|
||||
* on all cpus instead of doing a local flush if the mm
|
||||
|
||||
@@ -636,7 +636,8 @@ ENTRY(mcck_int_handler)
|
||||
UPDATE_VTIME %r14,%r15,__LC_MCCK_ENTER_TIMER
|
||||
mcck_skip:
|
||||
SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+32,__LC_PANIC_STACK,PAGE_SHIFT
|
||||
mvc __PT_R0(64,%r11),__LC_GPREGS_SAVE_AREA
|
||||
stm %r0,%r7,__PT_R0(%r11)
|
||||
mvc __PT_R8(32,%r11),__LC_GPREGS_SAVE_AREA+32
|
||||
stm %r8,%r9,__PT_PSW(%r11)
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
|
||||
l %r1,BASED(.Ldo_machine_check)
|
||||
|
||||
@@ -678,8 +678,9 @@ ENTRY(mcck_int_handler)
|
||||
UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER
|
||||
LAST_BREAK %r14
|
||||
mcck_skip:
|
||||
lghi %r14,__LC_GPREGS_SAVE_AREA
|
||||
mvc __PT_R0(128,%r11),0(%r14)
|
||||
lghi %r14,__LC_GPREGS_SAVE_AREA+64
|
||||
stmg %r0,%r7,__PT_R0(%r11)
|
||||
mvc __PT_R8(64,%r11),0(%r14)
|
||||
stmg %r8,%r9,__PT_PSW(%r11)
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
lgr %r2,%r11 # pass pointer to pt_regs
|
||||
|
||||
@@ -729,3 +729,13 @@ void intel_ds_init(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void perf_restore_debug_store(void)
|
||||
{
|
||||
struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds);
|
||||
|
||||
if (!x86_pmu.bts && !x86_pmu.pebs)
|
||||
return;
|
||||
|
||||
wrmsrl(MSR_IA32_DS_AREA, (unsigned long)ds);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/proto.h>
|
||||
@@ -228,6 +229,7 @@ static void __restore_processor_state(struct saved_context *ctxt)
|
||||
do_fpu_end();
|
||||
x86_platform.restore_sched_clock_state();
|
||||
mtrr_bp_restore();
|
||||
perf_restore_debug_store();
|
||||
}
|
||||
|
||||
/* Needed by apm.c */
|
||||
|
||||
@@ -1285,11 +1285,9 @@ static int loop_set_capacity(struct loop_device *lo, struct block_device *bdev)
|
||||
/* the width of sector_t may be narrow for bit-shift */
|
||||
sz = sec;
|
||||
sz <<= 9;
|
||||
mutex_lock(&bdev->bd_mutex);
|
||||
bd_set_size(bdev, sz);
|
||||
/* let user-space know about the new size */
|
||||
kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
|
||||
mutex_unlock(&bdev->bd_mutex);
|
||||
|
||||
out:
|
||||
return err;
|
||||
@@ -1858,11 +1856,15 @@ static int __init loop_init(void)
|
||||
max_part = (1UL << part_shift) - 1;
|
||||
}
|
||||
|
||||
if ((1UL << part_shift) > DISK_MAX_PARTS)
|
||||
return -EINVAL;
|
||||
if ((1UL << part_shift) > DISK_MAX_PARTS) {
|
||||
err = -EINVAL;
|
||||
goto misc_out;
|
||||
}
|
||||
|
||||
if (max_loop > 1UL << (MINORBITS - part_shift))
|
||||
return -EINVAL;
|
||||
if (max_loop > 1UL << (MINORBITS - part_shift)) {
|
||||
err = -EINVAL;
|
||||
goto misc_out;
|
||||
}
|
||||
|
||||
/*
|
||||
* If max_loop is specified, create that many devices upfront.
|
||||
@@ -1880,8 +1882,10 @@ static int __init loop_init(void)
|
||||
range = 1UL << MINORBITS;
|
||||
}
|
||||
|
||||
if (register_blkdev(LOOP_MAJOR, "loop"))
|
||||
return -EIO;
|
||||
if (register_blkdev(LOOP_MAJOR, "loop")) {
|
||||
err = -EIO;
|
||||
goto misc_out;
|
||||
}
|
||||
|
||||
blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
|
||||
THIS_MODULE, loop_probe, NULL, NULL);
|
||||
@@ -1894,6 +1898,10 @@ static int __init loop_init(void)
|
||||
|
||||
printk(KERN_INFO "loop: module loaded\n");
|
||||
return 0;
|
||||
|
||||
misc_out:
|
||||
misc_deregister(&loop_misc);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int loop_exit_cb(int id, void *ptr, void *data)
|
||||
|
||||
@@ -92,14 +92,22 @@ static int probe_common(struct virtio_device *vdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (vq) {
|
||||
/* We only support one device for now */
|
||||
return -EBUSY;
|
||||
}
|
||||
/* We expect a single virtqueue. */
|
||||
vq = virtio_find_single_vq(vdev, random_recv_done, "input");
|
||||
if (IS_ERR(vq))
|
||||
return PTR_ERR(vq);
|
||||
if (IS_ERR(vq)) {
|
||||
err = PTR_ERR(vq);
|
||||
vq = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = hwrng_register(&virtio_hwrng);
|
||||
if (err) {
|
||||
vdev->config->del_vqs(vdev);
|
||||
vq = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -112,6 +120,7 @@ static void remove_common(struct virtio_device *vdev)
|
||||
busy = false;
|
||||
hwrng_unregister(&virtio_hwrng);
|
||||
vdev->config->del_vqs(vdev);
|
||||
vq = NULL;
|
||||
}
|
||||
|
||||
static int virtrng_probe(struct virtio_device *vdev)
|
||||
|
||||
@@ -1297,21 +1297,19 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
||||
if (ret)
|
||||
goto cleanup_vga_switcheroo;
|
||||
|
||||
ret = drm_irq_install(dev);
|
||||
if (ret)
|
||||
goto cleanup_gem_stolen;
|
||||
|
||||
/* Important: The output setup functions called by modeset_init need
|
||||
* working irqs for e.g. gmbus and dp aux transfers. */
|
||||
intel_modeset_init(dev);
|
||||
|
||||
ret = i915_gem_init(dev);
|
||||
if (ret)
|
||||
goto cleanup_irq;
|
||||
goto cleanup_gem_stolen;
|
||||
|
||||
intel_modeset_gem_init(dev);
|
||||
|
||||
INIT_WORK(&dev_priv->console_resume_work, intel_console_resume);
|
||||
|
||||
intel_modeset_gem_init(dev);
|
||||
ret = drm_irq_install(dev);
|
||||
if (ret)
|
||||
goto cleanup_gem;
|
||||
|
||||
/* Always safe in the mode setting case. */
|
||||
/* FIXME: do pre/post-mode set stuff in core KMS code */
|
||||
@@ -1319,10 +1317,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
||||
|
||||
ret = intel_fbdev_init(dev);
|
||||
if (ret)
|
||||
goto cleanup_gem;
|
||||
|
||||
/* Only enable hotplug handling once the fbdev is fully set up. */
|
||||
dev_priv->enable_hotplug_processing = true;
|
||||
goto cleanup_irq;
|
||||
|
||||
drm_kms_helper_poll_init(dev);
|
||||
|
||||
@@ -1331,13 +1326,13 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup_irq:
|
||||
drm_irq_uninstall(dev);
|
||||
cleanup_gem:
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
i915_gem_cleanup_ringbuffer(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
i915_gem_cleanup_aliasing_ppgtt(dev);
|
||||
cleanup_irq:
|
||||
drm_irq_uninstall(dev);
|
||||
cleanup_gem_stolen:
|
||||
i915_gem_cleanup_stolen(dev);
|
||||
cleanup_vga_switcheroo:
|
||||
|
||||
@@ -486,7 +486,6 @@ static int i915_drm_freeze(struct drm_device *dev)
|
||||
intel_modeset_disable(dev);
|
||||
|
||||
drm_irq_uninstall(dev);
|
||||
dev_priv->enable_hotplug_processing = false;
|
||||
}
|
||||
|
||||
i915_save_state(dev);
|
||||
@@ -563,19 +562,9 @@ static int __i915_drm_thaw(struct drm_device *dev)
|
||||
error = i915_gem_init_hw(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
/* We need working interrupts for modeset enabling ... */
|
||||
drm_irq_install(dev);
|
||||
|
||||
intel_modeset_init_hw(dev);
|
||||
intel_modeset_setup_hw_state(dev, false);
|
||||
|
||||
/*
|
||||
* ... but also need to make sure that hotplug processing
|
||||
* doesn't cause havoc. Like in the driver load code we don't
|
||||
* bother with the tiny race here where we might loose hotplug
|
||||
* notifications.
|
||||
* */
|
||||
dev_priv->enable_hotplug_processing = true;
|
||||
drm_irq_install(dev);
|
||||
}
|
||||
|
||||
intel_opregion_init(dev);
|
||||
|
||||
@@ -672,7 +672,6 @@ typedef struct drm_i915_private {
|
||||
|
||||
u32 hotplug_supported_mask;
|
||||
struct work_struct hotplug_work;
|
||||
bool enable_hotplug_processing;
|
||||
|
||||
int num_pipe;
|
||||
int num_pch_pll;
|
||||
|
||||
@@ -287,10 +287,6 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
/* HPD irq before everything is fully set up. */
|
||||
if (!dev_priv->enable_hotplug_processing)
|
||||
return;
|
||||
|
||||
mutex_lock(&mode_config->mutex);
|
||||
DRM_DEBUG_KMS("running encoder hotplug functions\n");
|
||||
|
||||
|
||||
@@ -422,6 +422,7 @@ static struct attribute *pem_input_attributes[] = {
|
||||
&sensor_dev_attr_in2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_curr1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_power1_input.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group pem_input_group = {
|
||||
@@ -432,6 +433,7 @@ static struct attribute *pem_fan_attributes[] = {
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_fan2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_fan3_input.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group pem_fan_group = {
|
||||
|
||||
@@ -59,7 +59,7 @@ enum chips { ltc2978, ltc3880 };
|
||||
struct ltc2978_data {
|
||||
enum chips id;
|
||||
int vin_min, vin_max;
|
||||
int temp_min, temp_max;
|
||||
int temp_min, temp_max[2];
|
||||
int vout_min[8], vout_max[8];
|
||||
int iout_max[2];
|
||||
int temp2_max;
|
||||
@@ -113,9 +113,10 @@ static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
|
||||
ret = pmbus_read_word_data(client, page,
|
||||
LTC2978_MFR_TEMPERATURE_PEAK);
|
||||
if (ret >= 0) {
|
||||
if (lin11_to_val(ret) > lin11_to_val(data->temp_max))
|
||||
data->temp_max = ret;
|
||||
ret = data->temp_max;
|
||||
if (lin11_to_val(ret)
|
||||
> lin11_to_val(data->temp_max[page]))
|
||||
data->temp_max[page] = ret;
|
||||
ret = data->temp_max[page];
|
||||
}
|
||||
break;
|
||||
case PMBUS_VIRT_RESET_VOUT_HISTORY:
|
||||
@@ -266,7 +267,7 @@ static int ltc2978_write_word_data(struct i2c_client *client, int page,
|
||||
break;
|
||||
case PMBUS_VIRT_RESET_TEMP_HISTORY:
|
||||
data->temp_min = 0x7bff;
|
||||
data->temp_max = 0x7c00;
|
||||
data->temp_max[page] = 0x7c00;
|
||||
ret = ltc2978_clear_peaks(client, page, data->id);
|
||||
break;
|
||||
default:
|
||||
@@ -323,7 +324,8 @@ static int ltc2978_probe(struct i2c_client *client,
|
||||
data->vin_min = 0x7bff;
|
||||
data->vin_max = 0x7c00;
|
||||
data->temp_min = 0x7bff;
|
||||
data->temp_max = 0x7c00;
|
||||
for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
|
||||
data->temp_max[i] = 0x7c00;
|
||||
data->temp2_max = 0x7c00;
|
||||
|
||||
switch (data->id) {
|
||||
|
||||
@@ -1527,6 +1527,14 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
|
||||
oobreadlen -= toread;
|
||||
}
|
||||
}
|
||||
|
||||
if (chip->options & NAND_NEED_READRDY) {
|
||||
/* Apply delay or wait for ready/busy pin */
|
||||
if (!chip->dev_ready)
|
||||
udelay(chip->chip_delay);
|
||||
else
|
||||
nand_wait_ready(mtd);
|
||||
}
|
||||
} else {
|
||||
memcpy(buf, chip->buffers->databuf + col, bytes);
|
||||
buf += bytes;
|
||||
@@ -1791,6 +1799,14 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
|
||||
len = min(len, readlen);
|
||||
buf = nand_transfer_oob(chip, buf, ops, len);
|
||||
|
||||
if (chip->options & NAND_NEED_READRDY) {
|
||||
/* Apply delay or wait for ready/busy pin */
|
||||
if (!chip->dev_ready)
|
||||
udelay(chip->chip_delay);
|
||||
else
|
||||
nand_wait_ready(mtd);
|
||||
}
|
||||
|
||||
readlen -= len;
|
||||
if (!readlen)
|
||||
break;
|
||||
|
||||
@@ -22,49 +22,51 @@
|
||||
* 512 512 Byte page size
|
||||
*/
|
||||
struct nand_flash_dev nand_flash_ids[] = {
|
||||
#define SP_OPTIONS NAND_NEED_READRDY
|
||||
#define SP_OPTIONS16 (SP_OPTIONS | NAND_BUSWIDTH_16)
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_MUSEUM_IDS
|
||||
{"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0},
|
||||
{"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0},
|
||||
{"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0},
|
||||
{"NAND 1MiB 3,3V 8-bit", 0xe8, 256, 1, 0x1000, 0},
|
||||
{"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, 0},
|
||||
{"NAND 2MiB 3,3V 8-bit", 0xea, 256, 2, 0x1000, 0},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xd5, 512, 4, 0x2000, 0},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xe3, 512, 4, 0x2000, 0},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xe5, 512, 4, 0x2000, 0},
|
||||
{"NAND 8MiB 3,3V 8-bit", 0xd6, 512, 8, 0x2000, 0},
|
||||
{"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, SP_OPTIONS},
|
||||
{"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, SP_OPTIONS},
|
||||
{"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, SP_OPTIONS},
|
||||
{"NAND 1MiB 3,3V 8-bit", 0xe8, 256, 1, 0x1000, SP_OPTIONS},
|
||||
{"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, SP_OPTIONS},
|
||||
{"NAND 2MiB 3,3V 8-bit", 0xea, 256, 2, 0x1000, SP_OPTIONS},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xd5, 512, 4, 0x2000, SP_OPTIONS},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xe3, 512, 4, 0x2000, SP_OPTIONS},
|
||||
{"NAND 4MiB 3,3V 8-bit", 0xe5, 512, 4, 0x2000, SP_OPTIONS},
|
||||
{"NAND 8MiB 3,3V 8-bit", 0xd6, 512, 8, 0x2000, SP_OPTIONS},
|
||||
|
||||
{"NAND 8MiB 1,8V 8-bit", 0x39, 512, 8, 0x2000, 0},
|
||||
{"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0},
|
||||
{"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16},
|
||||
{"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16},
|
||||
{"NAND 8MiB 1,8V 8-bit", 0x39, 512, 8, 0x2000, SP_OPTIONS},
|
||||
{"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, SP_OPTIONS},
|
||||
{"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, SP_OPTIONS16},
|
||||
{"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, SP_OPTIONS16},
|
||||
#endif
|
||||
|
||||
{"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0},
|
||||
{"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0},
|
||||
{"NAND 16MiB 1,8V 16-bit", 0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 16MiB 3,3V 16-bit", 0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, SP_OPTIONS},
|
||||
{"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, SP_OPTIONS},
|
||||
{"NAND 16MiB 1,8V 16-bit", 0x43, 512, 16, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 16MiB 3,3V 16-bit", 0x53, 512, 16, 0x4000, SP_OPTIONS16},
|
||||
|
||||
{"NAND 32MiB 1,8V 8-bit", 0x35, 512, 32, 0x4000, 0},
|
||||
{"NAND 32MiB 3,3V 8-bit", 0x75, 512, 32, 0x4000, 0},
|
||||
{"NAND 32MiB 1,8V 16-bit", 0x45, 512, 32, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 32MiB 3,3V 16-bit", 0x55, 512, 32, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 32MiB 1,8V 8-bit", 0x35, 512, 32, 0x4000, SP_OPTIONS},
|
||||
{"NAND 32MiB 3,3V 8-bit", 0x75, 512, 32, 0x4000, SP_OPTIONS},
|
||||
{"NAND 32MiB 1,8V 16-bit", 0x45, 512, 32, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 32MiB 3,3V 16-bit", 0x55, 512, 32, 0x4000, SP_OPTIONS16},
|
||||
|
||||
{"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, 0},
|
||||
{"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, 0},
|
||||
{"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, SP_OPTIONS},
|
||||
{"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, SP_OPTIONS},
|
||||
{"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, SP_OPTIONS16},
|
||||
|
||||
{"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, 0},
|
||||
{"NAND 128MiB 1,8V 8-bit", 0x39, 512, 128, 0x4000, 0},
|
||||
{"NAND 128MiB 3,3V 8-bit", 0x79, 512, 128, 0x4000, 0},
|
||||
{"NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 128MiB 1,8V 16-bit", 0x49, 512, 128, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 128MiB 3,3V 16-bit", 0x59, 512, 128, 0x4000, NAND_BUSWIDTH_16},
|
||||
{"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, SP_OPTIONS},
|
||||
{"NAND 128MiB 1,8V 8-bit", 0x39, 512, 128, 0x4000, SP_OPTIONS},
|
||||
{"NAND 128MiB 3,3V 8-bit", 0x79, 512, 128, 0x4000, SP_OPTIONS},
|
||||
{"NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 128MiB 1,8V 16-bit", 0x49, 512, 128, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, SP_OPTIONS16},
|
||||
{"NAND 128MiB 3,3V 16-bit", 0x59, 512, 128, 0x4000, SP_OPTIONS16},
|
||||
|
||||
{"NAND 256MiB 3,3V 8-bit", 0x71, 512, 256, 0x4000, 0},
|
||||
{"NAND 256MiB 3,3V 8-bit", 0x71, 512, 256, 0x4000, SP_OPTIONS},
|
||||
|
||||
/*
|
||||
* These are the new chips with large page size. The pagesize and the
|
||||
|
||||
@@ -1943,7 +1943,6 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
}
|
||||
|
||||
block_netpoll_tx();
|
||||
call_netdevice_notifiers(NETDEV_RELEASE, bond_dev);
|
||||
write_lock_bh(&bond->lock);
|
||||
|
||||
slave = bond_get_slave_by_dev(bond, slave_dev);
|
||||
@@ -2047,8 +2046,10 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
write_unlock_bh(&bond->lock);
|
||||
unblock_netpoll_tx();
|
||||
|
||||
if (bond->slave_cnt == 0)
|
||||
if (bond->slave_cnt == 0) {
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev);
|
||||
call_netdevice_notifiers(NETDEV_RELEASE, bond->dev);
|
||||
}
|
||||
|
||||
bond_compute_features(bond);
|
||||
if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) &&
|
||||
|
||||
@@ -2075,7 +2075,7 @@ static int atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
if (unlikely(pci_dma_mapping_error(adapter->pdev,
|
||||
buffer_info->dma)))
|
||||
goto err_dma;
|
||||
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
mapped_len += map_len;
|
||||
|
||||
@@ -1434,12 +1434,11 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->mdev->dev->caps.comp_pool);
|
||||
if (!priv->dev->rx_cpu_rmap)
|
||||
goto err;
|
||||
|
||||
INIT_LIST_HEAD(&priv->filters);
|
||||
spin_lock_init(&priv->filters_lock);
|
||||
if (priv->mdev->dev->caps.comp_pool) {
|
||||
priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->mdev->dev->caps.comp_pool);
|
||||
if (!priv->dev->rx_cpu_rmap)
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@@ -1634,6 +1633,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
INIT_LIST_HEAD(&priv->filters);
|
||||
spin_lock_init(&priv->filters_lock);
|
||||
#endif
|
||||
|
||||
/* Allocate page for receive rings */
|
||||
err = mlx4_alloc_hwq_res(mdev->dev, &priv->res,
|
||||
MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE);
|
||||
|
||||
@@ -628,6 +628,7 @@ void macvlan_common_setup(struct net_device *dev)
|
||||
ether_setup(dev);
|
||||
|
||||
dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
|
||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
dev->netdev_ops = &macvlan_netdev_ops;
|
||||
dev->destructor = free_netdev;
|
||||
dev->header_ops = &macvlan_hard_header_ops,
|
||||
|
||||
@@ -1139,6 +1139,8 @@ static int team_port_del(struct team *team, struct net_device *port_dev)
|
||||
netdev_set_master(port_dev, NULL);
|
||||
team_port_disable_netpoll(port);
|
||||
vlan_vids_del_by_dev(port_dev, dev);
|
||||
dev_uc_unsync(port_dev, dev);
|
||||
dev_mc_unsync(port_dev, dev);
|
||||
dev_close(port_dev);
|
||||
team_port_leave(team, port);
|
||||
team_port_set_orig_dev_addr(port);
|
||||
|
||||
@@ -748,6 +748,8 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
goto drop;
|
||||
skb_orphan(skb);
|
||||
|
||||
nf_reset(skb);
|
||||
|
||||
/* Enqueue packet */
|
||||
skb_queue_tail(&tfile->socket.sk->sk_receive_queue, skb);
|
||||
|
||||
|
||||
@@ -1491,6 +1491,15 @@ static __net_init int vxlan_init_net(struct net *net)
|
||||
static __net_exit void vxlan_exit_net(struct net *net)
|
||||
{
|
||||
struct vxlan_net *vn = net_generic(net, vxlan_net_id);
|
||||
struct vxlan_dev *vxlan;
|
||||
struct hlist_node *pos;
|
||||
unsigned h;
|
||||
|
||||
rtnl_lock();
|
||||
for (h = 0; h < VNI_HASH_SIZE; ++h)
|
||||
hlist_for_each_entry(vxlan, pos, &vn->vni_list[h], hlist)
|
||||
dev_close(vxlan->dev);
|
||||
rtnl_unlock();
|
||||
|
||||
if (vn->sock) {
|
||||
sk_release_kernel(vn->sock->sk);
|
||||
|
||||
@@ -948,12 +948,13 @@ static int dt9812_di_rinsn(struct comedi_device *dev,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct comedi_dt9812 *devpriv = dev->private;
|
||||
unsigned int channel = CR_CHAN(insn->chanspec);
|
||||
int n;
|
||||
u8 bits = 0;
|
||||
|
||||
dt9812_digital_in(devpriv->slot, &bits);
|
||||
for (n = 0; n < insn->n; n++)
|
||||
data[n] = ((1 << insn->chanspec) & bits) != 0;
|
||||
data[n] = ((1 << channel) & bits) != 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -962,12 +963,13 @@ static int dt9812_do_winsn(struct comedi_device *dev,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct comedi_dt9812 *devpriv = dev->private;
|
||||
unsigned int channel = CR_CHAN(insn->chanspec);
|
||||
int n;
|
||||
u8 bits = 0;
|
||||
|
||||
dt9812_digital_out_shadow(devpriv->slot, &bits);
|
||||
for (n = 0; n < insn->n; n++) {
|
||||
u8 mask = 1 << insn->chanspec;
|
||||
u8 mask = 1 << channel;
|
||||
|
||||
bits &= ~mask;
|
||||
if (data[n])
|
||||
@@ -982,13 +984,13 @@ static int dt9812_ai_rinsn(struct comedi_device *dev,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct comedi_dt9812 *devpriv = dev->private;
|
||||
unsigned int channel = CR_CHAN(insn->chanspec);
|
||||
int n;
|
||||
|
||||
for (n = 0; n < insn->n; n++) {
|
||||
u16 value = 0;
|
||||
|
||||
dt9812_analog_in(devpriv->slot, insn->chanspec, &value,
|
||||
DT9812_GAIN_1);
|
||||
dt9812_analog_in(devpriv->slot, channel, &value, DT9812_GAIN_1);
|
||||
data[n] = value;
|
||||
}
|
||||
return n;
|
||||
@@ -999,12 +1001,13 @@ static int dt9812_ao_rinsn(struct comedi_device *dev,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct comedi_dt9812 *devpriv = dev->private;
|
||||
unsigned int channel = CR_CHAN(insn->chanspec);
|
||||
int n;
|
||||
u16 value;
|
||||
|
||||
for (n = 0; n < insn->n; n++) {
|
||||
value = 0;
|
||||
dt9812_analog_out_shadow(devpriv->slot, insn->chanspec, &value);
|
||||
dt9812_analog_out_shadow(devpriv->slot, channel, &value);
|
||||
data[n] = value;
|
||||
}
|
||||
return n;
|
||||
@@ -1015,10 +1018,11 @@ static int dt9812_ao_winsn(struct comedi_device *dev,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct comedi_dt9812 *devpriv = dev->private;
|
||||
unsigned int channel = CR_CHAN(insn->chanspec);
|
||||
int n;
|
||||
|
||||
for (n = 0; n < insn->n; n++)
|
||||
dt9812_analog_out(devpriv->slot, insn->chanspec, data[n]);
|
||||
dt9812_analog_out(devpriv->slot, channel, data[n]);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
@@ -644,8 +644,6 @@ static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
if (device->flags & DEVICE_FLAGS_OPENED)
|
||||
device_close(device->dev);
|
||||
|
||||
usb_put_dev(interface_to_usbdev(intf));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -656,8 +654,6 @@ static int vt6656_resume(struct usb_interface *intf)
|
||||
if (!device || !device->dev)
|
||||
return -ENODEV;
|
||||
|
||||
usb_get_dev(interface_to_usbdev(intf));
|
||||
|
||||
if (!(device->flags & DEVICE_FLAGS_OPENED))
|
||||
device_open(device->dev);
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
|
||||
/* Review - krefs on tty_link ?? */
|
||||
if (!tty->link)
|
||||
return;
|
||||
tty->link->packet = 0;
|
||||
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
|
||||
wake_up_interruptible(&tty->link->read_wait);
|
||||
wake_up_interruptible(&tty->link->write_wait);
|
||||
|
||||
@@ -308,7 +308,28 @@ static const struct serial8250_config uart_config[] = {
|
||||
},
|
||||
[PORT_8250_CIR] = {
|
||||
.name = "CIR port"
|
||||
}
|
||||
},
|
||||
[PORT_ALTR_16550_F32] = {
|
||||
.name = "Altera 16550 FIFO32",
|
||||
.fifo_size = 32,
|
||||
.tx_loadsz = 32,
|
||||
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
|
||||
.flags = UART_CAP_FIFO | UART_CAP_AFE,
|
||||
},
|
||||
[PORT_ALTR_16550_F64] = {
|
||||
.name = "Altera 16550 FIFO64",
|
||||
.fifo_size = 64,
|
||||
.tx_loadsz = 64,
|
||||
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
|
||||
.flags = UART_CAP_FIFO | UART_CAP_AFE,
|
||||
},
|
||||
[PORT_ALTR_16550_F128] = {
|
||||
.name = "Altera 16550 FIFO128",
|
||||
.fifo_size = 128,
|
||||
.tx_loadsz = 128,
|
||||
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
|
||||
.flags = UART_CAP_FIFO | UART_CAP_AFE,
|
||||
},
|
||||
};
|
||||
|
||||
/* Uart divisor latch read */
|
||||
@@ -3430,3 +3451,32 @@ module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
|
||||
MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
|
||||
#endif
|
||||
MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);
|
||||
|
||||
#ifndef MODULE
|
||||
/* This module was renamed to 8250_core in 3.7. Keep the old "8250" name
|
||||
* working as well for the module options so we don't break people. We
|
||||
* need to keep the names identical and the convenient macros will happily
|
||||
* refuse to let us do that by failing the build with redefinition errors
|
||||
* of global variables. So we stick them inside a dummy function to avoid
|
||||
* those conflicts. The options still get parsed, and the redefined
|
||||
* MODULE_PARAM_PREFIX lets us keep the "8250." syntax alive.
|
||||
*
|
||||
* This is hacky. I'm sorry.
|
||||
*/
|
||||
static void __used s8250_options(void)
|
||||
{
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#define MODULE_PARAM_PREFIX "8250."
|
||||
|
||||
module_param_cb(share_irqs, ¶m_ops_uint, &share_irqs, 0644);
|
||||
module_param_cb(nr_uarts, ¶m_ops_uint, &nr_uarts, 0644);
|
||||
module_param_cb(skip_txen_test, ¶m_ops_uint, &skip_txen_test, 0644);
|
||||
#ifdef CONFIG_SERIAL_8250_RSA
|
||||
__module_param_call(MODULE_PARAM_PREFIX, probe_rsa,
|
||||
¶m_array_ops, .arr = &__param_arr_probe_rsa,
|
||||
0444, -1);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
MODULE_ALIAS("8250");
|
||||
#endif
|
||||
|
||||
@@ -1321,6 +1321,7 @@ pci_wch_ch353_setup(struct serial_private *priv,
|
||||
|
||||
/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
|
||||
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
|
||||
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
|
||||
|
||||
/*
|
||||
* Master list of serial port init/setup/exit quirks.
|
||||
@@ -1590,15 +1591,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
||||
.setup = pci_default_setup,
|
||||
.exit = pci_plx9050_exit,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_PLX,
|
||||
.device = PCI_DEVICE_ID_PLX_9050,
|
||||
.subvendor = PCI_VENDOR_ID_PLX,
|
||||
.subdevice = PCI_SUBDEVICE_ID_UNKNOWN_0x1584,
|
||||
.init = pci_plx9050_init,
|
||||
.setup = pci_default_setup,
|
||||
.exit = pci_plx9050_exit,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_PLX,
|
||||
.device = PCI_DEVICE_ID_PLX_ROMULUS,
|
||||
@@ -3456,7 +3448,12 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
|
||||
PCI_VENDOR_ID_PLX,
|
||||
PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
|
||||
pbn_b0_4_115200 },
|
||||
pbn_b2_4_115200 },
|
||||
/* Unknown card - subdevice 0x1588 */
|
||||
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
|
||||
PCI_VENDOR_ID_PLX,
|
||||
PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0,
|
||||
pbn_b2_8_115200 },
|
||||
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
|
||||
PCI_SUBVENDOR_ID_KEYSPAN,
|
||||
PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
|
||||
@@ -4449,6 +4446,10 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
PCI_VENDOR_ID_IBM, 0x0299,
|
||||
0, 0, pbn_b0_bt_2_115200 },
|
||||
|
||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
|
||||
0x1000, 0x0012,
|
||||
0, 0, pbn_b0_bt_2_115200 },
|
||||
|
||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901,
|
||||
0xA000, 0x1000,
|
||||
0, 0, pbn_b0_1_115200 },
|
||||
|
||||
@@ -429,6 +429,7 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
|
||||
{
|
||||
struct uart_8250_port uart;
|
||||
int ret, line, flags = dev_id->driver_data;
|
||||
struct resource *res = NULL;
|
||||
|
||||
if (flags & UNKNOWN_DEV) {
|
||||
ret = serial_pnp_guess_board(dev);
|
||||
@@ -439,11 +440,12 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
|
||||
memset(&uart, 0, sizeof(uart));
|
||||
if (pnp_irq_valid(dev, 0))
|
||||
uart.port.irq = pnp_irq(dev, 0);
|
||||
if ((flags & CIR_PORT) && pnp_port_valid(dev, 2)) {
|
||||
uart.port.iobase = pnp_port_start(dev, 2);
|
||||
uart.port.iotype = UPIO_PORT;
|
||||
} else if (pnp_port_valid(dev, 0)) {
|
||||
uart.port.iobase = pnp_port_start(dev, 0);
|
||||
if ((flags & CIR_PORT) && pnp_port_valid(dev, 2))
|
||||
res = pnp_get_resource(dev, IORESOURCE_IO, 2);
|
||||
else if (pnp_port_valid(dev, 0))
|
||||
res = pnp_get_resource(dev, IORESOURCE_IO, 0);
|
||||
if (pnp_resource_enabled(res)) {
|
||||
uart.port.iobase = res->start;
|
||||
uart.port.iotype = UPIO_PORT;
|
||||
} else if (pnp_mem_valid(dev, 0)) {
|
||||
uart.port.mapbase = pnp_mem_start(dev, 0);
|
||||
|
||||
@@ -209,14 +209,14 @@ config SERIAL_SAMSUNG
|
||||
config SERIAL_SAMSUNG_UARTS_4
|
||||
bool
|
||||
depends on PLAT_SAMSUNG
|
||||
default y if !(CPU_S3C2410 || SERIAL_S3C2412 || CPU_S3C2440 || CPU_S3C2442)
|
||||
default y if !(CPU_S3C2410 || CPU_S3C2412 || CPU_S3C2440 || CPU_S3C2442)
|
||||
help
|
||||
Internal node for the common case of 4 Samsung compatible UARTs
|
||||
|
||||
config SERIAL_SAMSUNG_UARTS
|
||||
int
|
||||
depends on PLAT_SAMSUNG
|
||||
default 6 if ARCH_S5P6450
|
||||
default 6 if CPU_S5P6450
|
||||
default 4 if SERIAL_SAMSUNG_UARTS_4 || CPU_S3C2416
|
||||
default 3
|
||||
help
|
||||
|
||||
@@ -240,6 +240,12 @@ static struct of_device_id of_platform_serial_table[] = {
|
||||
{ .compatible = "ns16850", .data = (void *)PORT_16850, },
|
||||
{ .compatible = "nvidia,tegra20-uart", .data = (void *)PORT_TEGRA, },
|
||||
{ .compatible = "nxp,lpc3220-uart", .data = (void *)PORT_LPC3220, },
|
||||
{ .compatible = "altr,16550-FIFO32",
|
||||
.data = (void *)PORT_ALTR_16550_F32, },
|
||||
{ .compatible = "altr,16550-FIFO64",
|
||||
.data = (void *)PORT_ALTR_16550_F64, },
|
||||
{ .compatible = "altr,16550-FIFO128",
|
||||
.data = (void *)PORT_ALTR_16550_F128, },
|
||||
#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL
|
||||
{ .compatible = "ibm,qpace-nwp-serial",
|
||||
.data = (void *)PORT_NWPSERIAL, },
|
||||
|
||||
@@ -473,7 +473,7 @@ static void flush_to_ldisc(struct work_struct *work)
|
||||
struct tty_ldisc *disc;
|
||||
|
||||
tty = port->itty;
|
||||
if (WARN_RATELIMIT(tty == NULL, "tty is NULL\n"))
|
||||
if (tty == NULL)
|
||||
return;
|
||||
|
||||
disc = tty_ldisc_ref(tty);
|
||||
|
||||
@@ -56,6 +56,7 @@ MODULE_DEVICE_TABLE (usb, wdm_ids);
|
||||
#define WDM_RESPONDING 7
|
||||
#define WDM_SUSPENDING 8
|
||||
#define WDM_RESETTING 9
|
||||
#define WDM_OVERFLOW 10
|
||||
|
||||
#define WDM_MAX 16
|
||||
|
||||
@@ -155,6 +156,7 @@ static void wdm_in_callback(struct urb *urb)
|
||||
{
|
||||
struct wdm_device *desc = urb->context;
|
||||
int status = urb->status;
|
||||
int length = urb->actual_length;
|
||||
|
||||
spin_lock(&desc->iuspin);
|
||||
clear_bit(WDM_RESPONDING, &desc->flags);
|
||||
@@ -185,9 +187,17 @@ static void wdm_in_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
desc->rerr = status;
|
||||
desc->reslength = urb->actual_length;
|
||||
memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
|
||||
desc->length += desc->reslength;
|
||||
if (length + desc->length > desc->wMaxCommand) {
|
||||
/* The buffer would overflow */
|
||||
set_bit(WDM_OVERFLOW, &desc->flags);
|
||||
} else {
|
||||
/* we may already be in overflow */
|
||||
if (!test_bit(WDM_OVERFLOW, &desc->flags)) {
|
||||
memmove(desc->ubuf + desc->length, desc->inbuf, length);
|
||||
desc->length += length;
|
||||
desc->reslength = length;
|
||||
}
|
||||
}
|
||||
skip_error:
|
||||
wake_up(&desc->wait);
|
||||
|
||||
@@ -435,6 +445,11 @@ retry:
|
||||
rv = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
if (test_bit(WDM_OVERFLOW, &desc->flags)) {
|
||||
clear_bit(WDM_OVERFLOW, &desc->flags);
|
||||
rv = -ENOBUFS;
|
||||
goto err;
|
||||
}
|
||||
i++;
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
if (!test_bit(WDM_READ, &desc->flags)) {
|
||||
@@ -478,6 +493,7 @@ retry:
|
||||
spin_unlock_irq(&desc->iuspin);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (!desc->reslength) { /* zero length read */
|
||||
dev_dbg(&desc->intf->dev, "%s: zero length - clearing WDM_READ\n", __func__);
|
||||
clear_bit(WDM_READ, &desc->flags);
|
||||
@@ -1004,6 +1020,7 @@ static int wdm_post_reset(struct usb_interface *intf)
|
||||
struct wdm_device *desc = wdm_find_device(intf);
|
||||
int rv;
|
||||
|
||||
clear_bit(WDM_OVERFLOW, &desc->flags);
|
||||
clear_bit(WDM_RESETTING, &desc->flags);
|
||||
rv = recover_from_urb_loss(desc);
|
||||
mutex_unlock(&desc->wlock);
|
||||
|
||||
@@ -575,6 +575,7 @@ static int dwc3_remove(struct platform_device *pdev)
|
||||
break;
|
||||
}
|
||||
|
||||
dwc3_free_event_buffers(dwc);
|
||||
dwc3_core_exit(dwc);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -135,7 +135,7 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
||||
* qtd is updated in qh_completions(). Update the QH
|
||||
* overlay here.
|
||||
*/
|
||||
if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) {
|
||||
if (qh->hw->hw_token & ACTIVE_BIT(ehci)) {
|
||||
qh->hw->hw_qtd_next = qtd->hw_next;
|
||||
qtd = NULL;
|
||||
}
|
||||
@@ -449,11 +449,19 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
||||
else if (last_status == -EINPROGRESS && !urb->unlinked)
|
||||
continue;
|
||||
|
||||
/* qh unlinked; token in overlay may be most current */
|
||||
if (state == QH_STATE_IDLE
|
||||
&& cpu_to_hc32(ehci, qtd->qtd_dma)
|
||||
== hw->hw_current) {
|
||||
/*
|
||||
* If this was the active qtd when the qh was unlinked
|
||||
* and the overlay's token is active, then the overlay
|
||||
* hasn't been written back to the qtd yet so use its
|
||||
* token instead of the qtd's. After the qtd is
|
||||
* processed and removed, the overlay won't be valid
|
||||
* any more.
|
||||
*/
|
||||
if (state == QH_STATE_IDLE &&
|
||||
qh->qtd_list.next == &qtd->qtd_list &&
|
||||
(hw->hw_token & ACTIVE_BIT(ehci))) {
|
||||
token = hc32_to_cpu(ehci, hw->hw_token);
|
||||
hw->hw_token &= ~ACTIVE_BIT(ehci);
|
||||
|
||||
/* An unlink may leave an incomplete
|
||||
* async transaction in the TT buffer.
|
||||
|
||||
@@ -85,6 +85,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */
|
||||
{ USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
|
||||
{ USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
|
||||
{ USB_DEVICE(0x2405, 0x0003) }, /* West Mountain Radio RIGblaster Advantage */
|
||||
{ USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */
|
||||
{ USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
|
||||
{ USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */
|
||||
@@ -150,6 +151,25 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */
|
||||
{ USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */
|
||||
{ USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */
|
||||
{ USB_DEVICE(0x1FB9, 0x0100) }, /* Lake Shore Model 121 Current Source */
|
||||
{ USB_DEVICE(0x1FB9, 0x0200) }, /* Lake Shore Model 218A Temperature Monitor */
|
||||
{ USB_DEVICE(0x1FB9, 0x0201) }, /* Lake Shore Model 219 Temperature Monitor */
|
||||
{ USB_DEVICE(0x1FB9, 0x0202) }, /* Lake Shore Model 233 Temperature Transmitter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0203) }, /* Lake Shore Model 235 Temperature Transmitter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0300) }, /* Lake Shore Model 335 Temperature Controller */
|
||||
{ USB_DEVICE(0x1FB9, 0x0301) }, /* Lake Shore Model 336 Temperature Controller */
|
||||
{ USB_DEVICE(0x1FB9, 0x0302) }, /* Lake Shore Model 350 Temperature Controller */
|
||||
{ USB_DEVICE(0x1FB9, 0x0303) }, /* Lake Shore Model 371 AC Bridge */
|
||||
{ USB_DEVICE(0x1FB9, 0x0400) }, /* Lake Shore Model 411 Handheld Gaussmeter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0401) }, /* Lake Shore Model 425 Gaussmeter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0402) }, /* Lake Shore Model 455A Gaussmeter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0403) }, /* Lake Shore Model 475A Gaussmeter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0404) }, /* Lake Shore Model 465 Three Axis Gaussmeter */
|
||||
{ USB_DEVICE(0x1FB9, 0x0600) }, /* Lake Shore Model 625A Superconducting MPS */
|
||||
{ USB_DEVICE(0x1FB9, 0x0601) }, /* Lake Shore Model 642A Magnet Power Supply */
|
||||
{ USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */
|
||||
{ USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */
|
||||
{ USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */
|
||||
{ USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
|
||||
{ USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
|
||||
{ USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */
|
||||
|
||||
@@ -341,6 +341,8 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define CINTERION_PRODUCT_EU3_E 0x0051
|
||||
#define CINTERION_PRODUCT_EU3_P 0x0052
|
||||
#define CINTERION_PRODUCT_PH8 0x0053
|
||||
#define CINTERION_PRODUCT_AH6 0x0055
|
||||
#define CINTERION_PRODUCT_PLS8 0x0060
|
||||
|
||||
/* Olivetti products */
|
||||
#define OLIVETTI_VENDOR_ID 0x0b3c
|
||||
@@ -579,6 +581,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(QUANTA_VENDOR_ID, 0xea42),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c05, USB_CLASS_COMM, 0x02, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c1f, USB_CLASS_COMM, 0x02, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
||||
@@ -1260,6 +1263,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AH6) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLS8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
|
||||
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
|
||||
|
||||
@@ -69,6 +69,7 @@ static struct usb_device_id id_table[] = {
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1fac, 0x0151, 0xff, 0xff, 0xff) },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
@@ -197,12 +197,15 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
|
||||
|
||||
if (is_gobi1k) {
|
||||
/* Gobi 1K USB layout:
|
||||
* 0: serial port (doesn't respond)
|
||||
* 0: DM/DIAG (use libqcdm from ModemManager for communication)
|
||||
* 1: serial port (doesn't respond)
|
||||
* 2: AT-capable modem port
|
||||
* 3: QMI/net
|
||||
*/
|
||||
if (ifnum == 2)
|
||||
if (ifnum == 0) {
|
||||
dev_dbg(dev, "Gobi 1K DM/DIAG interface found\n");
|
||||
altsetting = 1;
|
||||
} else if (ifnum == 2)
|
||||
dev_dbg(dev, "Modem port found\n");
|
||||
else
|
||||
altsetting = -1;
|
||||
|
||||
@@ -92,8 +92,8 @@ int usb_stor_ucr61s2b_init(struct us_data *us)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This places the HUAWEI usb dongles in multi-port mode */
|
||||
static int usb_stor_huawei_feature_init(struct us_data *us)
|
||||
/* This places the HUAWEI E220 devices in multi-port mode */
|
||||
int usb_stor_huawei_e220_init(struct us_data *us)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -104,75 +104,3 @@ static int usb_stor_huawei_feature_init(struct us_data *us)
|
||||
US_DEBUGP("Huawei mode set result is %d\n", result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* It will send a scsi switch command called rewind' to huawei dongle.
|
||||
* When the dongle receives this command at the first time,
|
||||
* it will reboot immediately. After rebooted, it will ignore this command.
|
||||
* So it is unnecessary to read its response.
|
||||
*/
|
||||
static int usb_stor_huawei_scsi_init(struct us_data *us)
|
||||
{
|
||||
int result = 0;
|
||||
int act_len = 0;
|
||||
struct bulk_cb_wrap *bcbw = (struct bulk_cb_wrap *) us->iobuf;
|
||||
char rewind_cmd[] = {0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x01, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
bcbw->Signature = cpu_to_le32(US_BULK_CB_SIGN);
|
||||
bcbw->Tag = 0;
|
||||
bcbw->DataTransferLength = 0;
|
||||
bcbw->Flags = bcbw->Lun = 0;
|
||||
bcbw->Length = sizeof(rewind_cmd);
|
||||
memset(bcbw->CDB, 0, sizeof(bcbw->CDB));
|
||||
memcpy(bcbw->CDB, rewind_cmd, sizeof(rewind_cmd));
|
||||
|
||||
result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcbw,
|
||||
US_BULK_CB_WRAP_LEN, &act_len);
|
||||
US_DEBUGP("transfer actual length=%d, result=%d\n", act_len, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* It tries to find the supported Huawei USB dongles.
|
||||
* In Huawei, they assign the following product IDs
|
||||
* for all of their mobile broadband dongles,
|
||||
* including the new dongles in the future.
|
||||
* So if the product ID is not included in this list,
|
||||
* it means it is not Huawei's mobile broadband dongles.
|
||||
*/
|
||||
static int usb_stor_huawei_dongles_pid(struct us_data *us)
|
||||
{
|
||||
struct usb_interface_descriptor *idesc;
|
||||
int idProduct;
|
||||
|
||||
idesc = &us->pusb_intf->cur_altsetting->desc;
|
||||
idProduct = le16_to_cpu(us->pusb_dev->descriptor.idProduct);
|
||||
/* The first port is CDROM,
|
||||
* means the dongle in the single port mode,
|
||||
* and a switch command is required to be sent. */
|
||||
if (idesc && idesc->bInterfaceNumber == 0) {
|
||||
if ((idProduct == 0x1001)
|
||||
|| (idProduct == 0x1003)
|
||||
|| (idProduct == 0x1004)
|
||||
|| (idProduct >= 0x1401 && idProduct <= 0x1500)
|
||||
|| (idProduct >= 0x1505 && idProduct <= 0x1600)
|
||||
|| (idProduct >= 0x1c02 && idProduct <= 0x2202)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usb_stor_huawei_init(struct us_data *us)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (usb_stor_huawei_dongles_pid(us)) {
|
||||
if (le16_to_cpu(us->pusb_dev->descriptor.idProduct) >= 0x1446)
|
||||
result = usb_stor_huawei_scsi_init(us);
|
||||
else
|
||||
result = usb_stor_huawei_feature_init(us);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -46,5 +46,5 @@ int usb_stor_euscsi_init(struct us_data *us);
|
||||
* flash reader */
|
||||
int usb_stor_ucr61s2b_init(struct us_data *us);
|
||||
|
||||
/* This places the HUAWEI usb dongles in multi-port mode */
|
||||
int usb_stor_huawei_init(struct us_data *us);
|
||||
/* This places the HUAWEI E220 devices in multi-port mode */
|
||||
int usb_stor_huawei_e220_init(struct us_data *us);
|
||||
|
||||
@@ -1527,10 +1527,335 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100,
|
||||
/* Reported by fangxiaozhi <huananhu@huawei.com>
|
||||
* This brings the HUAWEI data card devices into multi-port mode
|
||||
*/
|
||||
UNUSUAL_VENDOR_INTF(0x12d1, 0x08, 0x06, 0x50,
|
||||
UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_init,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000,
|
||||
"HUAWEI MOBILE",
|
||||
"Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init,
|
||||
0),
|
||||
|
||||
/* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */
|
||||
|
||||
@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
|
||||
= var->bits_per_pixel;
|
||||
break;
|
||||
case 16:
|
||||
/* Older SOCs use IBGR:555 rather than BGR:565. */
|
||||
if (sinfo->have_intensity_bit)
|
||||
var->green.length = 5;
|
||||
else
|
||||
var->green.length = 6;
|
||||
|
||||
if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) {
|
||||
/* RGB:565 mode */
|
||||
var->red.offset = 11;
|
||||
/* RGB:5X5 mode */
|
||||
var->red.offset = var->green.length + 5;
|
||||
var->blue.offset = 0;
|
||||
} else {
|
||||
/* BGR:565 mode */
|
||||
/* BGR:5X5 mode */
|
||||
var->red.offset = 0;
|
||||
var->blue.offset = 11;
|
||||
var->blue.offset = var->green.length + 5;
|
||||
}
|
||||
var->green.offset = 5;
|
||||
var->green.length = 6;
|
||||
var->red.length = var->blue.length = 5;
|
||||
break;
|
||||
case 32:
|
||||
@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,
|
||||
|
||||
case FB_VISUAL_PSEUDOCOLOR:
|
||||
if (regno < 256) {
|
||||
if (cpu_is_at91sam9261() || cpu_is_at91sam9263()
|
||||
|| cpu_is_at91sam9rl()) {
|
||||
if (sinfo->have_intensity_bit) {
|
||||
/* old style I+BGR:555 */
|
||||
val = ((red >> 11) & 0x001f);
|
||||
val |= ((green >> 6) & 0x03e0);
|
||||
@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
|
||||
}
|
||||
sinfo->info = info;
|
||||
sinfo->pdev = pdev;
|
||||
if (cpu_is_at91sam9261() || cpu_is_at91sam9263() ||
|
||||
cpu_is_at91sam9rl()) {
|
||||
sinfo->have_intensity_bit = true;
|
||||
}
|
||||
|
||||
strcpy(info->fix.id, sinfo->pdev->name);
|
||||
info->flags = ATMEL_LCDFB_FBINFO_DEFAULT;
|
||||
|
||||
@@ -158,7 +158,7 @@ static int w1_gpio_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __exit w1_gpio_remove(struct platform_device *pdev)
|
||||
static int w1_gpio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct w1_bus_master *master = platform_get_drvdata(pdev);
|
||||
struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
@@ -210,7 +210,7 @@ static struct platform_driver w1_gpio_driver = {
|
||||
.of_match_table = of_match_ptr(w1_gpio_dt_ids),
|
||||
},
|
||||
.probe = w1_gpio_probe,
|
||||
.remove = __exit_p(w1_gpio_remove),
|
||||
.remove = w1_gpio_remove,
|
||||
.suspend = w1_gpio_suspend,
|
||||
.resume = w1_gpio_resume,
|
||||
};
|
||||
|
||||
@@ -924,7 +924,8 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
|
||||
tmp64 = (triplet_ret >> 2);
|
||||
rn |= (tmp64 << i);
|
||||
|
||||
if (kthread_should_stop()) {
|
||||
/* ensure we're called from kthread and not by netlink callback */
|
||||
if (!dev->priv && kthread_should_stop()) {
|
||||
mutex_unlock(&dev->bus_mutex);
|
||||
dev_dbg(&dev->dev, "Abort w1_search\n");
|
||||
return;
|
||||
|
||||
@@ -113,7 +113,8 @@ void xen_pcibk_reset_device(struct pci_dev *dev)
|
||||
if (dev->msi_enabled)
|
||||
pci_disable_msi(dev);
|
||||
#endif
|
||||
pci_disable_device(dev);
|
||||
if (pci_is_enabled(dev))
|
||||
pci_disable_device(dev);
|
||||
|
||||
pci_write_config_word(dev, PCI_COMMAND, 0);
|
||||
|
||||
|
||||
@@ -1033,7 +1033,9 @@ void bd_set_size(struct block_device *bdev, loff_t size)
|
||||
{
|
||||
unsigned bsize = bdev_logical_block_size(bdev);
|
||||
|
||||
bdev->bd_inode->i_size = size;
|
||||
mutex_lock(&bdev->bd_inode->i_mutex);
|
||||
i_size_write(bdev->bd_inode, size);
|
||||
mutex_unlock(&bdev->bd_inode->i_mutex);
|
||||
while (bsize < PAGE_CACHE_SIZE) {
|
||||
if (size & bsize)
|
||||
break;
|
||||
|
||||
@@ -681,6 +681,12 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
|
||||
__btrfs_close_devices(fs_devices);
|
||||
free_fs_devices(fs_devices);
|
||||
}
|
||||
/*
|
||||
* Wait for rcu kworkers under __btrfs_close_devices
|
||||
* to finish all blkdev_puts so device is really
|
||||
* free when umount is done.
|
||||
*/
|
||||
rcu_barrier();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -353,7 +353,7 @@ static struct block_device *ext3_blkdev_get(dev_t dev, struct super_block *sb)
|
||||
return bdev;
|
||||
|
||||
fail:
|
||||
ext3_msg(sb, "error: failed to open journal device %s: %ld",
|
||||
ext3_msg(sb, KERN_ERR, "error: failed to open journal device %s: %ld",
|
||||
__bdevname(dev, b), PTR_ERR(bdev));
|
||||
|
||||
return NULL;
|
||||
@@ -887,7 +887,7 @@ static ext3_fsblk_t get_sb_block(void **data, struct super_block *sb)
|
||||
/*todo: use simple_strtoll with >32bit ext3 */
|
||||
sb_block = simple_strtoul(options, &options, 0);
|
||||
if (*options && *options != ',') {
|
||||
ext3_msg(sb, "error: invalid sb specification: %s",
|
||||
ext3_msg(sb, KERN_ERR, "error: invalid sb specification: %s",
|
||||
(char *) *data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -187,6 +187,13 @@ typedef enum {
|
||||
* This happens with the Renesas AG-AND chips, possibly others.
|
||||
*/
|
||||
#define BBT_AUTO_REFRESH 0x00000080
|
||||
/*
|
||||
* Chip requires ready check on read (for auto-incremented sequential read).
|
||||
* True only for small page devices; large page devices do not support
|
||||
* autoincrement.
|
||||
*/
|
||||
#define NAND_NEED_READRDY 0x00000100
|
||||
|
||||
/* Chip does not allow subpage writes */
|
||||
#define NAND_NO_SUBPAGE_WRITE 0x00000200
|
||||
|
||||
|
||||
@@ -794,6 +794,12 @@ static inline int __perf_event_disable(void *info) { return -1; }
|
||||
static inline void perf_event_task_tick(void) { }
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL)
|
||||
extern void perf_restore_debug_store(void);
|
||||
#else
|
||||
static inline void perf_restore_debug_store(void) { }
|
||||
#endif
|
||||
|
||||
#define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof(x))
|
||||
|
||||
/*
|
||||
|
||||
@@ -51,7 +51,10 @@
|
||||
#define PORT_8250_CIR 23 /* CIR infrared port, has its own driver */
|
||||
#define PORT_XR17V35X 24 /* Exar XR17V35x UARTs */
|
||||
#define PORT_BRCM_TRUMANAGE 25
|
||||
#define PORT_MAX_8250 25 /* max port ID */
|
||||
#define PORT_ALTR_16550_F32 26 /* Altera 16550 UART with 32 FIFOs */
|
||||
#define PORT_ALTR_16550_F64 27 /* Altera 16550 UART with 64 FIFOs */
|
||||
#define PORT_ALTR_16550_F128 28 /* Altera 16550 UART with 128 FIFOs */
|
||||
#define PORT_MAX_8250 28 /* max port ID */
|
||||
|
||||
/*
|
||||
* ARM specific type numbers. These are not currently guaranteed
|
||||
|
||||
@@ -62,6 +62,7 @@ struct atmel_lcdfb_info {
|
||||
void (*atmel_lcdfb_power_control)(int on);
|
||||
struct fb_monspecs *default_monspecs;
|
||||
u32 pseudo_palette[16];
|
||||
bool have_intensity_bit;
|
||||
};
|
||||
|
||||
#define ATMEL_LCDC_DMABADDR1 0x00
|
||||
|
||||
@@ -485,6 +485,9 @@ flush_signal_handlers(struct task_struct *t, int force_default)
|
||||
if (force_default || ka->sa.sa_handler != SIG_IGN)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
ka->sa.sa_flags = 0;
|
||||
#ifdef SA_RESTORER
|
||||
ka->sa.sa_restorer = NULL;
|
||||
#endif
|
||||
sigemptyset(&ka->sa.sa_mask);
|
||||
ka++;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
|
||||
port = p->port;
|
||||
if (port) {
|
||||
struct br_mdb_entry e;
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.ifindex = port->dev->ifindex;
|
||||
e.state = p->state;
|
||||
if (p->addr.proto == htons(ETH_P_IP))
|
||||
@@ -138,6 +139,7 @@ static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
break;
|
||||
|
||||
bpm = nlmsg_data(nlh);
|
||||
memset(bpm, 0, sizeof(*bpm));
|
||||
bpm->ifindex = dev->ifindex;
|
||||
if (br_mdb_fill_info(skb, cb, dev) < 0)
|
||||
goto out;
|
||||
@@ -173,6 +175,7 @@ static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
|
||||
return -EMSGSIZE;
|
||||
|
||||
bpm = nlmsg_data(nlh);
|
||||
memset(bpm, 0, sizeof(*bpm));
|
||||
bpm->family = AF_BRIDGE;
|
||||
bpm->ifindex = dev->ifindex;
|
||||
nest = nla_nest_start(skb, MDBA_MDB);
|
||||
@@ -230,6 +233,7 @@ void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
|
||||
{
|
||||
struct br_mdb_entry entry;
|
||||
|
||||
memset(&entry, 0, sizeof(entry));
|
||||
entry.ifindex = port->dev->ifindex;
|
||||
entry.addr.proto = group->proto;
|
||||
entry.addr.u.ip4 = group->u.ip4;
|
||||
|
||||
@@ -3419,6 +3419,7 @@ ncls:
|
||||
}
|
||||
switch (rx_handler(&skb)) {
|
||||
case RX_HANDLER_CONSUMED:
|
||||
ret = NET_RX_SUCCESS;
|
||||
goto unlock;
|
||||
case RX_HANDLER_ANOTHER:
|
||||
goto another_round;
|
||||
|
||||
@@ -976,6 +976,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
||||
* report anything.
|
||||
*/
|
||||
ivi.spoofchk = -1;
|
||||
memset(ivi.mac, 0, sizeof(ivi.mac));
|
||||
if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
|
||||
break;
|
||||
vf_mac.vf =
|
||||
|
||||
@@ -284,6 +284,7 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlmsghdr *nlh,
|
||||
if (!netdev->dcbnl_ops->getpermhwaddr)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
memset(perm_addr, 0, sizeof(perm_addr));
|
||||
netdev->dcbnl_ops->getpermhwaddr(netdev, perm_addr);
|
||||
|
||||
return nla_put(skb, DCB_ATTR_PERM_HWADDR, sizeof(perm_addr), perm_addr);
|
||||
@@ -1042,6 +1043,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (ops->ieee_getets) {
|
||||
struct ieee_ets ets;
|
||||
memset(&ets, 0, sizeof(ets));
|
||||
err = ops->ieee_getets(netdev, &ets);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_IEEE_ETS, sizeof(ets), &ets))
|
||||
@@ -1050,6 +1052,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (ops->ieee_getmaxrate) {
|
||||
struct ieee_maxrate maxrate;
|
||||
memset(&maxrate, 0, sizeof(maxrate));
|
||||
err = ops->ieee_getmaxrate(netdev, &maxrate);
|
||||
if (!err) {
|
||||
err = nla_put(skb, DCB_ATTR_IEEE_MAXRATE,
|
||||
@@ -1061,6 +1064,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (ops->ieee_getpfc) {
|
||||
struct ieee_pfc pfc;
|
||||
memset(&pfc, 0, sizeof(pfc));
|
||||
err = ops->ieee_getpfc(netdev, &pfc);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_IEEE_PFC, sizeof(pfc), &pfc))
|
||||
@@ -1094,6 +1098,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
/* get peer info if available */
|
||||
if (ops->ieee_peer_getets) {
|
||||
struct ieee_ets ets;
|
||||
memset(&ets, 0, sizeof(ets));
|
||||
err = ops->ieee_peer_getets(netdev, &ets);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_IEEE_PEER_ETS, sizeof(ets), &ets))
|
||||
@@ -1102,6 +1107,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (ops->ieee_peer_getpfc) {
|
||||
struct ieee_pfc pfc;
|
||||
memset(&pfc, 0, sizeof(pfc));
|
||||
err = ops->ieee_peer_getpfc(netdev, &pfc);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_IEEE_PEER_PFC, sizeof(pfc), &pfc))
|
||||
@@ -1280,6 +1286,7 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
/* peer info if available */
|
||||
if (ops->cee_peer_getpg) {
|
||||
struct cee_pg pg;
|
||||
memset(&pg, 0, sizeof(pg));
|
||||
err = ops->cee_peer_getpg(netdev, &pg);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_CEE_PEER_PG, sizeof(pg), &pg))
|
||||
@@ -1288,6 +1295,7 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (ops->cee_peer_getpfc) {
|
||||
struct cee_pfc pfc;
|
||||
memset(&pfc, 0, sizeof(pfc));
|
||||
err = ops->cee_peer_getpfc(netdev, &pfc);
|
||||
if (!err &&
|
||||
nla_put(skb, DCB_ATTR_CEE_PEER_PFC, sizeof(pfc), &pfc))
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
(memcmp(addr1, addr2, length >> 3) == 0)
|
||||
|
||||
/* local link, i.e. FE80::/10 */
|
||||
#define is_addr_link_local(a) (((a)->s6_addr16[0]) == 0x80FE)
|
||||
#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80))
|
||||
|
||||
/*
|
||||
* check whether we can compress the IID to 16 bits,
|
||||
|
||||
@@ -5498,6 +5498,9 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
|
||||
if (tcp_checksum_complete_user(sk, skb))
|
||||
goto csum_error;
|
||||
|
||||
if ((int)skb->truesize > sk->sk_forward_alloc)
|
||||
goto step5;
|
||||
|
||||
/* Predicted packet is in window by definition.
|
||||
* seq == rcv_nxt and rcv_wup <= rcv_nxt.
|
||||
* Hence, check seq<=rcv_wup reduces to:
|
||||
@@ -5509,9 +5512,6 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
|
||||
|
||||
tcp_rcv_rtt_measure_ts(sk, skb);
|
||||
|
||||
if ((int)skb->truesize > sk->sk_forward_alloc)
|
||||
goto step5;
|
||||
|
||||
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPHITS);
|
||||
|
||||
/* Bulk data transfer: receiver */
|
||||
|
||||
@@ -270,7 +270,8 @@ int ip6_mc_input(struct sk_buff *skb)
|
||||
* IPv6 multicast router mode is now supported ;)
|
||||
*/
|
||||
if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
|
||||
!(ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) &&
|
||||
!(ipv6_addr_type(&hdr->daddr) &
|
||||
(IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)) &&
|
||||
likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
|
||||
/*
|
||||
* Okay, we try to forward - split and duplicate
|
||||
|
||||
@@ -1990,7 +1990,8 @@ void rt6_purge_dflt_routers(struct net *net)
|
||||
restart:
|
||||
read_lock_bh(&table->tb6_lock);
|
||||
for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
|
||||
if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
|
||||
if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
|
||||
(!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
|
||||
dst_hold(&rt->dst);
|
||||
read_unlock_bh(&table->tb6_lock);
|
||||
ip6_del_rt(rt);
|
||||
|
||||
@@ -355,6 +355,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh
|
||||
l2tp_xmit_skb(session, skb, session->hdr_len);
|
||||
|
||||
sock_put(ps->tunnel_sock);
|
||||
sock_put(sk);
|
||||
|
||||
return error;
|
||||
|
||||
|
||||
@@ -1189,8 +1189,6 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
|
||||
struct netlbl_unlhsh_walk_arg cb_arg;
|
||||
u32 skip_bkt = cb->args[0];
|
||||
u32 skip_chain = cb->args[1];
|
||||
u32 skip_addr4 = cb->args[2];
|
||||
u32 skip_addr6 = cb->args[3];
|
||||
u32 iter_bkt;
|
||||
u32 iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
|
||||
struct netlbl_unlhsh_iface *iface;
|
||||
@@ -1215,7 +1213,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
|
||||
continue;
|
||||
netlbl_af4list_foreach_rcu(addr4,
|
||||
&iface->addr4_list) {
|
||||
if (iter_addr4++ < skip_addr4)
|
||||
if (iter_addr4++ < cb->args[2])
|
||||
continue;
|
||||
if (netlbl_unlabel_staticlist_gen(
|
||||
NLBL_UNLABEL_C_STATICLIST,
|
||||
@@ -1231,7 +1229,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
netlbl_af6list_foreach_rcu(addr6,
|
||||
&iface->addr6_list) {
|
||||
if (iter_addr6++ < skip_addr6)
|
||||
if (iter_addr6++ < cb->args[3])
|
||||
continue;
|
||||
if (netlbl_unlabel_staticlist_gen(
|
||||
NLBL_UNLABEL_C_STATICLIST,
|
||||
@@ -1250,10 +1248,10 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
|
||||
|
||||
unlabel_staticlist_return:
|
||||
rcu_read_unlock();
|
||||
cb->args[0] = skip_bkt;
|
||||
cb->args[1] = skip_chain;
|
||||
cb->args[2] = skip_addr4;
|
||||
cb->args[3] = skip_addr6;
|
||||
cb->args[0] = iter_bkt;
|
||||
cb->args[1] = iter_chain;
|
||||
cb->args[2] = iter_addr4;
|
||||
cb->args[3] = iter_addr6;
|
||||
return skb->len;
|
||||
}
|
||||
|
||||
@@ -1273,12 +1271,9 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb,
|
||||
{
|
||||
struct netlbl_unlhsh_walk_arg cb_arg;
|
||||
struct netlbl_unlhsh_iface *iface;
|
||||
u32 skip_addr4 = cb->args[0];
|
||||
u32 skip_addr6 = cb->args[1];
|
||||
u32 iter_addr4 = 0;
|
||||
u32 iter_addr4 = 0, iter_addr6 = 0;
|
||||
struct netlbl_af4list *addr4;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
u32 iter_addr6 = 0;
|
||||
struct netlbl_af6list *addr6;
|
||||
#endif
|
||||
|
||||
@@ -1292,7 +1287,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb,
|
||||
goto unlabel_staticlistdef_return;
|
||||
|
||||
netlbl_af4list_foreach_rcu(addr4, &iface->addr4_list) {
|
||||
if (iter_addr4++ < skip_addr4)
|
||||
if (iter_addr4++ < cb->args[0])
|
||||
continue;
|
||||
if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF,
|
||||
iface,
|
||||
@@ -1305,7 +1300,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb,
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
netlbl_af6list_foreach_rcu(addr6, &iface->addr6_list) {
|
||||
if (iter_addr6++ < skip_addr6)
|
||||
if (iter_addr6++ < cb->args[1])
|
||||
continue;
|
||||
if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF,
|
||||
iface,
|
||||
@@ -1320,8 +1315,8 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb,
|
||||
|
||||
unlabel_staticlistdef_return:
|
||||
rcu_read_unlock();
|
||||
cb->args[0] = skip_addr4;
|
||||
cb->args[1] = skip_addr6;
|
||||
cb->args[0] = iter_addr4;
|
||||
cb->args[1] = iter_addr6;
|
||||
return skb->len;
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +197,9 @@ struct rds_message *rds_message_alloc(unsigned int extra_len, gfp_t gfp)
|
||||
{
|
||||
struct rds_message *rm;
|
||||
|
||||
if (extra_len > KMALLOC_MAX_SIZE - sizeof(struct rds_message))
|
||||
return NULL;
|
||||
|
||||
rm = kzalloc(sizeof(struct rds_message) + extra_len, gfp);
|
||||
if (!rm)
|
||||
goto out;
|
||||
|
||||
@@ -5653,6 +5653,9 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
|
||||
if (len < sizeof(sctp_assoc_t))
|
||||
return -EINVAL;
|
||||
|
||||
/* Allow the struct to grow and fill in as much as possible */
|
||||
len = min_t(size_t, len, sizeof(sas));
|
||||
|
||||
if (copy_from_user(&sas, optval, len))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -5686,9 +5689,6 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
|
||||
/* Mark beginning of a new observation period */
|
||||
asoc->stats.max_obs_rto = asoc->rto_min;
|
||||
|
||||
/* Allow the struct to grow and fill in as much as possible */
|
||||
len = min_t(size_t, len, sizeof(sas));
|
||||
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# ==========================================================================
|
||||
|
||||
# called may set destination dir (when installing to asm/)
|
||||
_dst := $(or $(destination-y),$(dst),$(obj))
|
||||
_dst := $(if $(destination-y),$(destination-y),$(if $(dst),$(dst),$(obj)))
|
||||
|
||||
# generated header directory
|
||||
gen := $(if $(gen),$(gen),$(subst include/,include/generated/,$(obj)))
|
||||
@@ -48,13 +48,14 @@ all-files := $(header-y) $(genhdr-y) $(wrapper-files)
|
||||
output-files := $(addprefix $(installdir)/, $(all-files))
|
||||
|
||||
input-files := $(foreach hdr, $(header-y), \
|
||||
$(or \
|
||||
$(if $(wildcard $(srcdir)/$(hdr)), \
|
||||
$(wildcard $(srcdir)/$(hdr)), \
|
||||
$(wildcard $(oldsrcdir)/$(hdr)), \
|
||||
$(error Missing UAPI file $(srcdir)/$(hdr)) \
|
||||
$(if $(wildcard $(oldsrcdir)/$(hdr)), \
|
||||
$(wildcard $(oldsrcdir)/$(hdr)), \
|
||||
$(error Missing UAPI file $(srcdir)/$(hdr))) \
|
||||
)) \
|
||||
$(foreach hdr, $(genhdr-y), \
|
||||
$(or \
|
||||
$(if $(wildcard $(gendir)/$(hdr)), \
|
||||
$(wildcard $(gendir)/$(hdr)), \
|
||||
$(error Missing generated UAPI file $(gendir)/$(hdr)) \
|
||||
))
|
||||
|
||||
@@ -310,7 +310,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,
|
||||
|
||||
if (old_ctx) {
|
||||
new_ctx = kmalloc(sizeof(*old_ctx) + old_ctx->ctx_len,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
if (!new_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
@@ -290,10 +290,10 @@ int snd_seq_timer_open(struct snd_seq_queue *q)
|
||||
tid.device = SNDRV_TIMER_GLOBAL_SYSTEM;
|
||||
err = snd_timer_open(&t, str, &tid, q->queue);
|
||||
}
|
||||
if (err < 0) {
|
||||
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
if (err < 0) {
|
||||
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
|
||||
return err;
|
||||
}
|
||||
t->callback = snd_seq_timer_interrupt;
|
||||
t->callback_data = q;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#include <unistd.h>
|
||||
#include <tools/le_byteshift.h>
|
||||
|
||||
#include "../../include/linux/usb/functionfs.h"
|
||||
#include "../../include/uapi/linux/usb/functionfs.h"
|
||||
|
||||
|
||||
/******************** Little Endian Handling ********************************/
|
||||
|
||||
Reference in New Issue
Block a user