mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'v3.8.13.12' of git://kernel.ubuntu.com/ubuntu/linux into odroid-3.8.y
v3.8.13.12
This commit is contained in:
@@ -15,6 +15,13 @@ amemthresh - INTEGER
|
||||
enabled and the variable is automatically set to 2, otherwise
|
||||
the strategy is disabled and the variable is set to 1.
|
||||
|
||||
backup_only - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
|
||||
If set, disable the director function while the server is
|
||||
in backup mode to avoid packet loops for DR/TUN methods.
|
||||
|
||||
conntrack - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION = .11
|
||||
EXTRAVERSION = .12
|
||||
NAME = Remoralised Urchins Update
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("1:\n\t"
|
||||
asm_volatile_goto("1:\n\t"
|
||||
JUMP_LABEL_NOP "\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
".word 1b, %l[l_yes], %c0\n\t"
|
||||
|
||||
@@ -57,6 +57,9 @@ static inline void syscall_get_arguments(struct task_struct *task,
|
||||
unsigned int i, unsigned int n,
|
||||
unsigned long *args)
|
||||
{
|
||||
if (n == 0)
|
||||
return;
|
||||
|
||||
if (i + n > SYSCALL_MAX_ARGS) {
|
||||
unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
|
||||
unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
|
||||
@@ -81,6 +84,9 @@ static inline void syscall_set_arguments(struct task_struct *task,
|
||||
unsigned int i, unsigned int n,
|
||||
const unsigned long *args)
|
||||
{
|
||||
if (n == 0)
|
||||
return;
|
||||
|
||||
if (i + n > SYSCALL_MAX_ARGS) {
|
||||
pr_warning("%s called with max args %d, handling only %d\n",
|
||||
__func__, i + n, SYSCALL_MAX_ARGS);
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("1:\tnop\n\t"
|
||||
asm_volatile_goto("1:\tnop\n\t"
|
||||
"nop\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
WORD_INSN " 1b, %l[l_yes], %0\n\t"
|
||||
|
||||
@@ -810,14 +810,14 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
||||
else {
|
||||
|
||||
/*
|
||||
* The kernel should never fault on its own address space.
|
||||
* The kernel should never fault on its own address space,
|
||||
* unless pagefault_disable() was called before.
|
||||
*/
|
||||
|
||||
if (fault_space == 0)
|
||||
if (fault_space == 0 && !in_atomic())
|
||||
{
|
||||
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
|
||||
parisc_terminate("Kernel Fault", regs, code, fault_address);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("1:\n\t"
|
||||
asm_volatile_goto("1:\n\t"
|
||||
"nop\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
JUMP_ENTRY_TYPE "1b, %l[l_yes], %c0\n\t"
|
||||
|
||||
@@ -964,7 +964,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
|
||||
BEGIN_FTR_SECTION
|
||||
mfspr r8, SPRN_DSCR
|
||||
ld r7, HSTATE_DSCR(r13)
|
||||
std r8, VCPU_DSCR(r7)
|
||||
std r8, VCPU_DSCR(r9)
|
||||
mtspr SPRN_DSCR, r7
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("0: brcl 0,0\n"
|
||||
asm_volatile_goto("0: brcl 0,0\n"
|
||||
".pushsection __jump_table, \"aw\"\n"
|
||||
ASM_ALIGN "\n"
|
||||
ASM_PTR " 0b, %l[label], %0\n"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("1:\n\t"
|
||||
asm_volatile_goto("1:\n\t"
|
||||
"nop\n\t"
|
||||
"nop\n\t"
|
||||
".pushsection __jump_table, \"aw\"\n\t"
|
||||
|
||||
@@ -847,7 +847,7 @@ sys_sigreturn:
|
||||
nop
|
||||
|
||||
call syscall_trace
|
||||
nop
|
||||
mov 1, %o1
|
||||
|
||||
1:
|
||||
/* We don't want to muck with user registers like a
|
||||
|
||||
@@ -25,11 +25,10 @@ kvmap_itlb:
|
||||
*/
|
||||
kvmap_itlb_4v:
|
||||
|
||||
kvmap_itlb_nonlinear:
|
||||
/* Catch kernel NULL pointer calls. */
|
||||
sethi %hi(PAGE_SIZE), %g5
|
||||
cmp %g4, %g5
|
||||
bleu,pn %xcc, kvmap_dtlb_longpath
|
||||
blu,pn %xcc, kvmap_itlb_longpath
|
||||
nop
|
||||
|
||||
KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_itlb_load)
|
||||
|
||||
@@ -158,7 +158,7 @@ linux_syscall_trace32:
|
||||
srl %i4, 0, %o4
|
||||
srl %i1, 0, %o1
|
||||
srl %i2, 0, %o2
|
||||
ba,pt %xcc, 2f
|
||||
ba,pt %xcc, 5f
|
||||
srl %i3, 0, %o3
|
||||
|
||||
linux_syscall_trace:
|
||||
@@ -188,13 +188,13 @@ linux_sparc_syscall32:
|
||||
srl %i1, 0, %o1 ! IEU0 Group
|
||||
ldx [%g6 + TI_FLAGS], %l0 ! Load
|
||||
|
||||
srl %i5, 0, %o5 ! IEU1
|
||||
srl %i3, 0, %o3 ! IEU0
|
||||
srl %i2, 0, %o2 ! IEU0 Group
|
||||
andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
|
||||
bne,pn %icc, linux_syscall_trace32 ! CTI
|
||||
mov %i0, %l5 ! IEU1
|
||||
call %l7 ! CTI Group brk forced
|
||||
srl %i3, 0, %o3 ! IEU0
|
||||
5: call %l7 ! CTI Group brk forced
|
||||
srl %i5, 0, %o5 ! IEU1
|
||||
ba,a,pt %xcc, 3f
|
||||
|
||||
/* Linux native system calls enter here... */
|
||||
|
||||
@@ -131,7 +131,6 @@ startup_continue:
|
||||
clr %l5
|
||||
sethi %hi(num_kernel_image_mappings), %l6
|
||||
lduw [%l6 + %lo(num_kernel_image_mappings)], %l6
|
||||
add %l6, 1, %l6
|
||||
|
||||
mov 15, %l7
|
||||
BRANCH_IF_ANY_CHEETAH(g1,g5,2f)
|
||||
@@ -224,7 +223,6 @@ niagara_lock_tlb:
|
||||
clr %l5
|
||||
sethi %hi(num_kernel_image_mappings), %l6
|
||||
lduw [%l6 + %lo(num_kernel_image_mappings)], %l6
|
||||
add %l6, 1, %l6
|
||||
|
||||
1:
|
||||
mov HV_FAST_MMU_MAP_PERM_ADDR, %o5
|
||||
|
||||
@@ -98,15 +98,6 @@ EXPORT_SYMBOL(___copy_from_user);
|
||||
EXPORT_SYMBOL(___copy_in_user);
|
||||
EXPORT_SYMBOL(__clear_user);
|
||||
|
||||
/* RW semaphores */
|
||||
EXPORT_SYMBOL(__down_read);
|
||||
EXPORT_SYMBOL(__down_read_trylock);
|
||||
EXPORT_SYMBOL(__down_write);
|
||||
EXPORT_SYMBOL(__down_write_trylock);
|
||||
EXPORT_SYMBOL(__up_read);
|
||||
EXPORT_SYMBOL(__up_write);
|
||||
EXPORT_SYMBOL(__downgrade_write);
|
||||
|
||||
/* Atomic counter implementation. */
|
||||
EXPORT_SYMBOL(atomic_add);
|
||||
EXPORT_SYMBOL(atomic_add_ret);
|
||||
|
||||
@@ -15,9 +15,37 @@
|
||||
#ifndef _ASM_TILE_PERCPU_H
|
||||
#define _ASM_TILE_PERCPU_H
|
||||
|
||||
register unsigned long __my_cpu_offset __asm__("tp");
|
||||
#define __my_cpu_offset __my_cpu_offset
|
||||
#define set_my_cpu_offset(tp) (__my_cpu_offset = (tp))
|
||||
register unsigned long my_cpu_offset_reg asm("tp");
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
/*
|
||||
* For full preemption, we can't just use the register variable
|
||||
* directly, since we need barrier() to hazard against it, causing the
|
||||
* compiler to reload anything computed from a previous "tp" value.
|
||||
* But we also don't want to use volatile asm, since we'd like the
|
||||
* compiler to be able to cache the value across multiple percpu reads.
|
||||
* So we use a fake stack read as a hazard against barrier().
|
||||
* The 'U' constraint is like 'm' but disallows postincrement.
|
||||
*/
|
||||
static inline unsigned long __my_cpu_offset(void)
|
||||
{
|
||||
unsigned long tp;
|
||||
register unsigned long *sp asm("sp");
|
||||
asm("move %0, tp" : "=r" (tp) : "U" (*sp));
|
||||
return tp;
|
||||
}
|
||||
#define __my_cpu_offset __my_cpu_offset()
|
||||
#else
|
||||
/*
|
||||
* We don't need to hazard against barrier() since "tp" doesn't ever
|
||||
* change with PREEMPT_NONE, and with PREEMPT_VOLUNTARY it only
|
||||
* changes at function call points, at which we are already re-reading
|
||||
* the value of "tp" due to "my_cpu_offset_reg" being a global variable.
|
||||
*/
|
||||
#define __my_cpu_offset my_cpu_offset_reg
|
||||
#endif
|
||||
|
||||
#define set_my_cpu_offset(tp) (my_cpu_offset_reg = (tp))
|
||||
|
||||
#include <asm-generic/percpu.h>
|
||||
|
||||
|
||||
@@ -346,7 +346,7 @@ extern const char * const x86_power_flags[32];
|
||||
static __always_inline __pure bool __static_cpu_has(u16 bit)
|
||||
{
|
||||
#if __GNUC__ > 4 || __GNUC_MINOR__ >= 5
|
||||
asm goto("1: jmp %l[t_no]\n"
|
||||
asm_volatile_goto("1: jmp %l[t_no]\n"
|
||||
"2:\n"
|
||||
".section .altinstructions,\"a\"\n"
|
||||
" .long 1b - .\n"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm goto("1:"
|
||||
asm_volatile_goto("1:"
|
||||
STATIC_KEY_INITIAL_NOP
|
||||
".pushsection __jump_table, \"aw\" \n\t"
|
||||
_ASM_ALIGN "\n\t"
|
||||
|
||||
@@ -76,6 +76,7 @@ struct blk_shadow {
|
||||
struct request *request;
|
||||
unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
struct grant *grants_used[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(blkfront_mutex);
|
||||
@@ -99,7 +100,6 @@ struct blkfront_info
|
||||
enum blkif_state connected;
|
||||
int ring_ref;
|
||||
struct blkif_front_ring ring;
|
||||
struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
||||
unsigned int evtchn, irq;
|
||||
struct request_queue *rq;
|
||||
struct work_struct work;
|
||||
@@ -362,11 +362,11 @@ static int blkif_queue_request(struct request *req)
|
||||
ring_req->u.discard.flag = 0;
|
||||
} else {
|
||||
ring_req->u.rw.nr_segments = blk_rq_map_sg(req->q, req,
|
||||
info->sg);
|
||||
info->shadow[id].sg);
|
||||
BUG_ON(ring_req->u.rw.nr_segments >
|
||||
BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
||||
|
||||
for_each_sg(info->sg, sg, ring_req->u.rw.nr_segments, i) {
|
||||
for_each_sg(info->shadow[id].sg, sg, ring_req->u.rw.nr_segments, i) {
|
||||
fsect = sg->offset >> 9;
|
||||
lsect = fsect + (sg->length >> 9) - 1;
|
||||
|
||||
@@ -839,12 +839,12 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,
|
||||
struct blkif_response *bret)
|
||||
{
|
||||
int i = 0;
|
||||
struct bio_vec *bvec;
|
||||
struct req_iterator iter;
|
||||
unsigned long flags;
|
||||
struct scatterlist *sg;
|
||||
char *bvec_data;
|
||||
void *shared_data;
|
||||
unsigned int offset = 0;
|
||||
int nseg;
|
||||
|
||||
nseg = s->req.u.rw.nr_segments;
|
||||
|
||||
if (bret->operation == BLKIF_OP_READ) {
|
||||
/*
|
||||
@@ -853,19 +853,16 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,
|
||||
* than PAGE_SIZE, we have to keep track of the current offset,
|
||||
* to be sure we are copying the data from the right shared page.
|
||||
*/
|
||||
rq_for_each_segment(bvec, s->request, iter) {
|
||||
BUG_ON((bvec->bv_offset + bvec->bv_len) > PAGE_SIZE);
|
||||
if (bvec->bv_offset < offset)
|
||||
i++;
|
||||
BUG_ON(i >= s->req.u.rw.nr_segments);
|
||||
for_each_sg(s->sg, sg, nseg, i) {
|
||||
BUG_ON(sg->offset + sg->length > PAGE_SIZE);
|
||||
shared_data = kmap_atomic(
|
||||
pfn_to_page(s->grants_used[i]->pfn));
|
||||
bvec_data = bvec_kmap_irq(bvec, &flags);
|
||||
memcpy(bvec_data, shared_data + bvec->bv_offset,
|
||||
bvec->bv_len);
|
||||
bvec_kunmap_irq(bvec_data, &flags);
|
||||
bvec_data = kmap_atomic(sg_page(sg));
|
||||
memcpy(bvec_data + sg->offset,
|
||||
shared_data + sg->offset,
|
||||
sg->length);
|
||||
kunmap_atomic(bvec_data);
|
||||
kunmap_atomic(shared_data);
|
||||
offset = bvec->bv_offset + bvec->bv_len;
|
||||
}
|
||||
}
|
||||
/* Add the persistent grant into the list of free grants */
|
||||
@@ -994,7 +991,7 @@ static int setup_blkring(struct xenbus_device *dev,
|
||||
struct blkfront_info *info)
|
||||
{
|
||||
struct blkif_sring *sring;
|
||||
int err;
|
||||
int err, i;
|
||||
|
||||
info->ring_ref = GRANT_INVALID_REF;
|
||||
|
||||
@@ -1006,7 +1003,8 @@ static int setup_blkring(struct xenbus_device *dev,
|
||||
SHARED_RING_INIT(sring);
|
||||
FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
|
||||
|
||||
sg_init_table(info->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
||||
for (i = 0; i < BLK_RING_SIZE; i++)
|
||||
sg_init_table(info->shadow[i].sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
||||
|
||||
err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
|
||||
if (err < 0) {
|
||||
|
||||
@@ -643,7 +643,7 @@ struct timer_rand_state {
|
||||
*/
|
||||
void add_device_randomness(const void *buf, unsigned int size)
|
||||
{
|
||||
unsigned long time = get_cycles() ^ jiffies;
|
||||
unsigned long time = random_get_entropy() ^ jiffies;
|
||||
|
||||
mix_pool_bytes(&input_pool, buf, size, NULL);
|
||||
mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
|
||||
@@ -680,7 +680,7 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
|
||||
goto out;
|
||||
|
||||
sample.jiffies = jiffies;
|
||||
sample.cycles = get_cycles();
|
||||
sample.cycles = random_get_entropy();
|
||||
sample.num = num;
|
||||
mix_pool_bytes(&input_pool, &sample, sizeof(sample), NULL);
|
||||
|
||||
@@ -747,7 +747,7 @@ void add_interrupt_randomness(int irq, int irq_flags)
|
||||
struct fast_pool *fast_pool = &__get_cpu_var(irq_randomness);
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
unsigned long now = jiffies;
|
||||
__u32 input[4], cycles = get_cycles();
|
||||
__u32 input[4], cycles = random_get_entropy();
|
||||
|
||||
input[0] = cycles ^ jiffies;
|
||||
input[1] = irq;
|
||||
@@ -1462,12 +1462,11 @@ ctl_table random_table[] = {
|
||||
|
||||
static u32 random_int_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned;
|
||||
|
||||
static int __init random_int_secret_init(void)
|
||||
int random_int_secret_init(void)
|
||||
{
|
||||
get_random_bytes(random_int_secret, sizeof(random_int_secret));
|
||||
return 0;
|
||||
}
|
||||
late_initcall(random_int_secret_init);
|
||||
|
||||
/*
|
||||
* Get a random word for internal kernel use only. Similar to urandom but
|
||||
@@ -1486,7 +1485,7 @@ unsigned int get_random_int(void)
|
||||
|
||||
hash = get_cpu_var(get_random_int_hash);
|
||||
|
||||
hash[0] += current->pid + jiffies + get_cycles();
|
||||
hash[0] += current->pid + jiffies + random_get_entropy();
|
||||
md5_transform(hash, random_int_secret);
|
||||
ret = hash[0];
|
||||
put_cpu_var(get_random_int_hash);
|
||||
|
||||
@@ -3485,6 +3485,9 @@
|
||||
#define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG 0x9030
|
||||
#define GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB (1<<11)
|
||||
|
||||
#define HSW_SCRATCH1 0xb038
|
||||
#define HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE (1<<27)
|
||||
|
||||
#define HSW_FUSE_STRAP 0x42014
|
||||
#define HSW_CDCLK_LIMIT (1 << 24)
|
||||
|
||||
@@ -4321,6 +4324,9 @@
|
||||
#define GEN7_ROW_CHICKEN2_GT2 0xf4f4
|
||||
#define DOP_CLOCK_GATING_DISABLE (1<<0)
|
||||
|
||||
#define HSW_ROW_CHICKEN3 0xe49c
|
||||
#define HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE (1 << 6)
|
||||
|
||||
#define G4X_AUD_VID_DID 0x62020
|
||||
#define INTEL_AUDIO_DEVCL 0x808629FB
|
||||
#define INTEL_AUDIO_DEVBLC 0x80862801
|
||||
|
||||
@@ -3906,8 +3906,6 @@ static void intel_connector_check_state(struct intel_connector *connector)
|
||||
* consider. */
|
||||
void intel_connector_dpms(struct drm_connector *connector, int mode)
|
||||
{
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
|
||||
/* All the simple cases only support two dpms states. */
|
||||
if (mode != DRM_MODE_DPMS_ON)
|
||||
mode = DRM_MODE_DPMS_OFF;
|
||||
@@ -3918,10 +3916,8 @@ void intel_connector_dpms(struct drm_connector *connector, int mode)
|
||||
connector->dpms = mode;
|
||||
|
||||
/* Only need to change hw state when actually enabled */
|
||||
if (encoder->base.crtc)
|
||||
intel_encoder_dpms(encoder, mode);
|
||||
else
|
||||
WARN_ON(encoder->connectors_active != false);
|
||||
if (connector->encoder)
|
||||
intel_encoder_dpms(to_intel_encoder(connector->encoder), mode);
|
||||
|
||||
intel_modeset_check_state(connector->dev);
|
||||
}
|
||||
|
||||
@@ -3730,6 +3730,11 @@ static void haswell_init_clock_gating(struct drm_device *dev)
|
||||
I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER,
|
||||
GEN7_WA_L3_CHICKEN_MODE);
|
||||
|
||||
/* L3 caching of data atomics doesn't work -- disable it. */
|
||||
I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE);
|
||||
I915_WRITE(HSW_ROW_CHICKEN3,
|
||||
_MASKED_BIT_ENABLE(HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE));
|
||||
|
||||
/* This is required by WaCatErrorRejectionIssue */
|
||||
I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
|
||||
I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
|
||||
|
||||
@@ -1989,7 +1989,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
rdev->config.evergreen.sx_max_export_size = 256;
|
||||
rdev->config.evergreen.sx_max_export_pos_size = 64;
|
||||
rdev->config.evergreen.sx_max_export_smx_size = 192;
|
||||
rdev->config.evergreen.max_hw_contexts = 8;
|
||||
rdev->config.evergreen.max_hw_contexts = 4;
|
||||
rdev->config.evergreen.sq_num_cf_insts = 2;
|
||||
|
||||
rdev->config.evergreen.sc_prim_fifo_size = 0x40;
|
||||
|
||||
@@ -1050,7 +1050,7 @@
|
||||
* 6. COMMAND [29:22] | BYTE_COUNT [20:0]
|
||||
*/
|
||||
# define PACKET3_CP_DMA_DST_SEL(x) ((x) << 20)
|
||||
/* 0 - SRC_ADDR
|
||||
/* 0 - DST_ADDR
|
||||
* 1 - GDS
|
||||
*/
|
||||
# define PACKET3_CP_DMA_ENGINE(x) ((x) << 27)
|
||||
@@ -1065,7 +1065,7 @@
|
||||
# define PACKET3_CP_DMA_CP_SYNC (1 << 31)
|
||||
/* COMMAND */
|
||||
# define PACKET3_CP_DMA_DIS_WC (1 << 21)
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 23)
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 22)
|
||||
/* 0 - none
|
||||
* 1 - 8 in 16
|
||||
* 2 - 8 in 32
|
||||
|
||||
@@ -1196,7 +1196,7 @@
|
||||
*/
|
||||
# define PACKET3_CP_DMA_CP_SYNC (1 << 31)
|
||||
/* COMMAND */
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 23)
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 22)
|
||||
/* 0 - none
|
||||
* 1 - 8 in 16
|
||||
* 2 - 8 in 32
|
||||
|
||||
@@ -37,8 +37,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
|
||||
struct radeon_bo **gtt_obj = NULL;
|
||||
struct radeon_fence *fence = NULL;
|
||||
uint64_t gtt_addr, vram_addr;
|
||||
unsigned i, n, size;
|
||||
int r, ring;
|
||||
unsigned n, size;
|
||||
int i, r, ring;
|
||||
|
||||
switch (flag) {
|
||||
case RADEON_TEST_COPY_DMA:
|
||||
|
||||
@@ -881,7 +881,7 @@
|
||||
* 6. COMMAND [30:21] | BYTE_COUNT [20:0]
|
||||
*/
|
||||
# define PACKET3_CP_DMA_DST_SEL(x) ((x) << 20)
|
||||
/* 0 - SRC_ADDR
|
||||
/* 0 - DST_ADDR
|
||||
* 1 - GDS
|
||||
*/
|
||||
# define PACKET3_CP_DMA_ENGINE(x) ((x) << 27)
|
||||
@@ -896,7 +896,7 @@
|
||||
# define PACKET3_CP_DMA_CP_SYNC (1 << 31)
|
||||
/* COMMAND */
|
||||
# define PACKET3_CP_DMA_DIS_WC (1 << 21)
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 23)
|
||||
# define PACKET3_CP_DMA_CMD_SRC_SWAP(x) ((x) << 22)
|
||||
/* 0 - none
|
||||
* 1 - 8 in 16
|
||||
* 2 - 8 in 32
|
||||
|
||||
@@ -230,6 +230,7 @@ static int send_argument(const char *key)
|
||||
|
||||
static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
|
||||
{
|
||||
u8 status, data = 0;
|
||||
int i;
|
||||
|
||||
if (send_command(cmd) || send_argument(key)) {
|
||||
@@ -237,6 +238,7 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* This has no effect on newer (2012) SMCs */
|
||||
if (send_byte(len, APPLESMC_DATA_PORT)) {
|
||||
pr_warn("%.4s: read len fail\n", key);
|
||||
return -EIO;
|
||||
@@ -250,6 +252,17 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)
|
||||
buffer[i] = inb(APPLESMC_DATA_PORT);
|
||||
}
|
||||
|
||||
/* Read the data port until bit0 is cleared */
|
||||
for (i = 0; i < 16; i++) {
|
||||
udelay(APPLESMC_MIN_WAIT);
|
||||
status = inb(APPLESMC_CMD_PORT);
|
||||
if (!(status & 0x01))
|
||||
break;
|
||||
data = inb(APPLESMC_DATA_PORT);
|
||||
}
|
||||
if (i)
|
||||
pr_warn("flushed %d bytes, last value is: %d\n", i, data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -941,6 +941,9 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
|
||||
/*
|
||||
* ProDB0017052: Clear ARDY bit twice
|
||||
*/
|
||||
if (stat & OMAP_I2C_STAT_ARDY)
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_ARDY);
|
||||
|
||||
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
||||
OMAP_I2C_STAT_AL)) {
|
||||
omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_RRDY |
|
||||
|
||||
@@ -269,6 +269,14 @@ static chunk_t area_location(struct pstore *ps, chunk_t area)
|
||||
return NUM_SNAPSHOT_HDR_CHUNKS + ((ps->exceptions_per_area + 1) * area);
|
||||
}
|
||||
|
||||
static void skip_metadata(struct pstore *ps)
|
||||
{
|
||||
uint32_t stride = ps->exceptions_per_area + 1;
|
||||
chunk_t next_free = ps->next_free;
|
||||
if (sector_div(next_free, stride) == NUM_SNAPSHOT_HDR_CHUNKS)
|
||||
ps->next_free++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read or write a metadata area. Remembering to skip the first
|
||||
* chunk which holds the header.
|
||||
@@ -502,6 +510,8 @@ static int read_exceptions(struct pstore *ps,
|
||||
|
||||
ps->current_area--;
|
||||
|
||||
skip_metadata(ps);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -616,8 +626,6 @@ static int persistent_prepare_exception(struct dm_exception_store *store,
|
||||
struct dm_exception *e)
|
||||
{
|
||||
struct pstore *ps = get_info(store);
|
||||
uint32_t stride;
|
||||
chunk_t next_free;
|
||||
sector_t size = get_dev_size(dm_snap_cow(store->snap)->bdev);
|
||||
|
||||
/* Is there enough room ? */
|
||||
@@ -630,10 +638,8 @@ static int persistent_prepare_exception(struct dm_exception_store *store,
|
||||
* Move onto the next free pending, making sure to take
|
||||
* into account the location of the metadata chunks.
|
||||
*/
|
||||
stride = (ps->exceptions_per_area + 1);
|
||||
next_free = ++ps->next_free;
|
||||
if (sector_div(next_free, stride) == 1)
|
||||
ps->next_free++;
|
||||
ps->next_free++;
|
||||
skip_metadata(ps);
|
||||
|
||||
atomic_inc(&ps->pending_count);
|
||||
return 0;
|
||||
|
||||
@@ -1933,6 +1933,7 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
struct bonding *bond = netdev_priv(bond_dev);
|
||||
struct slave *slave, *oldcurrent;
|
||||
struct sockaddr addr;
|
||||
int old_flags = bond_dev->flags;
|
||||
netdev_features_t old_features = bond_dev->features;
|
||||
|
||||
/* slave is not a slave or master is not master of this slave */
|
||||
@@ -2067,12 +2068,18 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
* already taken care of above when we detached the slave
|
||||
*/
|
||||
if (!USES_PRIMARY(bond->params.mode)) {
|
||||
/* unset promiscuity level from slave */
|
||||
if (bond_dev->flags & IFF_PROMISC)
|
||||
/* unset promiscuity level from slave
|
||||
* NOTE: The NETDEV_CHANGEADDR call above may change the value
|
||||
* of the IFF_PROMISC flag in the bond_dev, but we need the
|
||||
* value of that flag before that change, as that was the value
|
||||
* when this slave was attached, so we cache at the start of the
|
||||
* function and use it here. Same goes for ALLMULTI below
|
||||
*/
|
||||
if (old_flags & IFF_PROMISC)
|
||||
dev_set_promiscuity(slave_dev, -1);
|
||||
|
||||
/* unset allmulti level from slave */
|
||||
if (bond_dev->flags & IFF_ALLMULTI)
|
||||
if (old_flags & IFF_ALLMULTI)
|
||||
dev_set_allmulti(slave_dev, -1);
|
||||
|
||||
/* flush master's mc_list from slave */
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define FLEXCAN_MCR_BCC BIT(16)
|
||||
#define FLEXCAN_MCR_LPRIO_EN BIT(13)
|
||||
#define FLEXCAN_MCR_AEN BIT(12)
|
||||
#define FLEXCAN_MCR_MAXMB(x) ((x) & 0xf)
|
||||
#define FLEXCAN_MCR_MAXMB(x) ((x) & 0x1f)
|
||||
#define FLEXCAN_MCR_IDAM_A (0 << 8)
|
||||
#define FLEXCAN_MCR_IDAM_B (1 << 8)
|
||||
#define FLEXCAN_MCR_IDAM_C (2 << 8)
|
||||
@@ -707,7 +707,6 @@ static int flexcan_chip_start(struct net_device *dev)
|
||||
{
|
||||
struct flexcan_priv *priv = netdev_priv(dev);
|
||||
struct flexcan_regs __iomem *regs = priv->base;
|
||||
unsigned int i;
|
||||
int err;
|
||||
u32 reg_mcr, reg_ctrl;
|
||||
|
||||
@@ -741,9 +740,11 @@ static int flexcan_chip_start(struct net_device *dev)
|
||||
*
|
||||
*/
|
||||
reg_mcr = flexcan_read(®s->mcr);
|
||||
reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff);
|
||||
reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT |
|
||||
FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN |
|
||||
FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS;
|
||||
FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS |
|
||||
FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID);
|
||||
netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr);
|
||||
flexcan_write(reg_mcr, ®s->mcr);
|
||||
|
||||
@@ -777,16 +778,9 @@ static int flexcan_chip_start(struct net_device *dev)
|
||||
netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
|
||||
flexcan_write(reg_ctrl, ®s->ctrl);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) {
|
||||
flexcan_write(0, ®s->cantxfg[i].can_ctrl);
|
||||
flexcan_write(0, ®s->cantxfg[i].can_id);
|
||||
flexcan_write(0, ®s->cantxfg[i].data[0]);
|
||||
flexcan_write(0, ®s->cantxfg[i].data[1]);
|
||||
|
||||
/* put MB into rx queue */
|
||||
flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
|
||||
®s->cantxfg[i].can_ctrl);
|
||||
}
|
||||
/* Abort any pending TX, mark Mailbox as INACTIVE */
|
||||
flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
|
||||
®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
|
||||
|
||||
/* acceptance mask/acceptance code (accept everything) */
|
||||
flexcan_write(0x0, ®s->rxgmask);
|
||||
|
||||
@@ -4148,6 +4148,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_34:
|
||||
case RTL_GIGA_MAC_VER_35:
|
||||
RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#define DRV_NAME "via-rhine"
|
||||
#define DRV_VERSION "1.5.0"
|
||||
#define DRV_VERSION "1.5.1"
|
||||
#define DRV_RELDATE "2010-10-09"
|
||||
|
||||
#include <linux/types.h>
|
||||
@@ -1683,7 +1683,12 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
|
||||
cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
|
||||
|
||||
if (unlikely(vlan_tx_tag_present(skb))) {
|
||||
rp->tx_ring[entry].tx_status = cpu_to_le32((vlan_tx_tag_get(skb)) << 16);
|
||||
u16 vid_pcp = vlan_tx_tag_get(skb);
|
||||
|
||||
/* drop CFI/DEI bit, register needs VID and PCP */
|
||||
vid_pcp = (vid_pcp & VLAN_VID_MASK) |
|
||||
((vid_pcp & VLAN_PRIO_MASK) >> 1);
|
||||
rp->tx_ring[entry].tx_status = cpu_to_le32((vid_pcp) << 16);
|
||||
/* request tagging */
|
||||
rp->tx_ring[entry].desc_length |= cpu_to_le32(0x020000);
|
||||
}
|
||||
|
||||
@@ -308,6 +308,12 @@ static int temac_dma_bd_init(struct net_device *ndev)
|
||||
lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1)));
|
||||
lp->dma_out(lp, TX_CURDESC_PTR, lp->tx_bd_p);
|
||||
|
||||
/* Init descriptor indexes */
|
||||
lp->tx_bd_ci = 0;
|
||||
lp->tx_bd_next = 0;
|
||||
lp->tx_bd_tail = 0;
|
||||
lp->rx_bd_ci = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
|
||||
@@ -281,7 +281,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
nf_reset(skb);
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
ip_select_ident(iph, &rt->dst, NULL);
|
||||
ip_select_ident(skb, &rt->dst, NULL);
|
||||
ip_send_check(iph);
|
||||
|
||||
ip_local_out(skb);
|
||||
|
||||
@@ -1686,11 +1686,11 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
INIT_LIST_HEAD(&tun->disabled);
|
||||
err = tun_attach(tun, file);
|
||||
if (err < 0)
|
||||
goto err_free_dev;
|
||||
goto err_free_flow;
|
||||
|
||||
err = register_netdevice(tun->dev);
|
||||
if (err < 0)
|
||||
goto err_free_dev;
|
||||
goto err_detach;
|
||||
|
||||
if (device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
|
||||
device_create_file(&tun->dev->dev, &dev_attr_owner) ||
|
||||
@@ -1734,7 +1734,12 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
strcpy(ifr->ifr_name, tun->dev->name);
|
||||
return 0;
|
||||
|
||||
err_free_dev:
|
||||
err_detach:
|
||||
tun_detach_all(dev);
|
||||
err_free_flow:
|
||||
tun_flow_uninit(tun);
|
||||
security_tun_dev_free_security(tun->security);
|
||||
err_free_dev:
|
||||
free_netdev(dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@ static void dm9601_set_multicast(struct net_device *net)
|
||||
rx_ctl |= 0x02;
|
||||
} else if (net->flags & IFF_ALLMULTI ||
|
||||
netdev_mc_count(net) > DM_MAX_MCAST) {
|
||||
rx_ctl |= 0x04;
|
||||
rx_ctl |= 0x08;
|
||||
} else if (!netdev_mc_empty(net)) {
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
|
||||
@@ -354,6 +354,49 @@ static bool start_new_rx_buffer(int offset, unsigned long size, int head)
|
||||
return false;
|
||||
}
|
||||
|
||||
struct xenvif_count_slot_state {
|
||||
unsigned long copy_off;
|
||||
bool head;
|
||||
};
|
||||
|
||||
unsigned int xenvif_count_frag_slots(struct xenvif *vif,
|
||||
unsigned long offset, unsigned long size,
|
||||
struct xenvif_count_slot_state *state)
|
||||
{
|
||||
unsigned count = 0;
|
||||
|
||||
offset &= ~PAGE_MASK;
|
||||
|
||||
while (size > 0) {
|
||||
unsigned long bytes;
|
||||
|
||||
bytes = PAGE_SIZE - offset;
|
||||
|
||||
if (bytes > size)
|
||||
bytes = size;
|
||||
|
||||
if (start_new_rx_buffer(state->copy_off, bytes, state->head)) {
|
||||
count++;
|
||||
state->copy_off = 0;
|
||||
}
|
||||
|
||||
if (state->copy_off + bytes > MAX_BUFFER_OFFSET)
|
||||
bytes = MAX_BUFFER_OFFSET - state->copy_off;
|
||||
|
||||
state->copy_off += bytes;
|
||||
|
||||
offset += bytes;
|
||||
size -= bytes;
|
||||
|
||||
if (offset == PAGE_SIZE)
|
||||
offset = 0;
|
||||
|
||||
state->head = false;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figure out how many ring slots we're going to need to send @skb to
|
||||
* the guest. This function is essentially a dry run of
|
||||
@@ -361,48 +404,39 @@ static bool start_new_rx_buffer(int offset, unsigned long size, int head)
|
||||
*/
|
||||
unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb)
|
||||
{
|
||||
struct xenvif_count_slot_state state;
|
||||
unsigned int count;
|
||||
int i, copy_off;
|
||||
unsigned char *data;
|
||||
unsigned i;
|
||||
|
||||
count = DIV_ROUND_UP(skb_headlen(skb), PAGE_SIZE);
|
||||
state.head = true;
|
||||
state.copy_off = 0;
|
||||
|
||||
copy_off = skb_headlen(skb) % PAGE_SIZE;
|
||||
/* Slot for the first (partial) page of data. */
|
||||
count = 1;
|
||||
|
||||
/* Need a slot for the GSO prefix for GSO extra data? */
|
||||
if (skb_shinfo(skb)->gso_size)
|
||||
count++;
|
||||
|
||||
data = skb->data;
|
||||
while (data < skb_tail_pointer(skb)) {
|
||||
unsigned long offset = offset_in_page(data);
|
||||
unsigned long size = PAGE_SIZE - offset;
|
||||
|
||||
if (data + size > skb_tail_pointer(skb))
|
||||
size = skb_tail_pointer(skb) - data;
|
||||
|
||||
count += xenvif_count_frag_slots(vif, offset, size, &state);
|
||||
|
||||
data += size;
|
||||
}
|
||||
|
||||
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
||||
unsigned long size = skb_frag_size(&skb_shinfo(skb)->frags[i]);
|
||||
unsigned long offset = skb_shinfo(skb)->frags[i].page_offset;
|
||||
unsigned long bytes;
|
||||
|
||||
offset &= ~PAGE_MASK;
|
||||
|
||||
while (size > 0) {
|
||||
BUG_ON(offset >= PAGE_SIZE);
|
||||
BUG_ON(copy_off > MAX_BUFFER_OFFSET);
|
||||
|
||||
bytes = PAGE_SIZE - offset;
|
||||
|
||||
if (bytes > size)
|
||||
bytes = size;
|
||||
|
||||
if (start_new_rx_buffer(copy_off, bytes, 0)) {
|
||||
count++;
|
||||
copy_off = 0;
|
||||
}
|
||||
|
||||
if (copy_off + bytes > MAX_BUFFER_OFFSET)
|
||||
bytes = MAX_BUFFER_OFFSET - copy_off;
|
||||
|
||||
copy_off += bytes;
|
||||
|
||||
offset += bytes;
|
||||
size -= bytes;
|
||||
|
||||
if (offset == PAGE_SIZE)
|
||||
offset = 0;
|
||||
}
|
||||
count += xenvif_count_frag_slots(vif, offset, size, &state);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -530,7 +530,7 @@ static int esp_need_to_nego_sync(struct esp_target_data *tp)
|
||||
static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,
|
||||
struct esp_lun_data *lp)
|
||||
{
|
||||
if (!ent->tag[0]) {
|
||||
if (!ent->orig_tag[0]) {
|
||||
/* Non-tagged, slot already taken? */
|
||||
if (lp->non_tagged_cmd)
|
||||
return -EBUSY;
|
||||
@@ -564,9 +564,9 @@ static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
BUG_ON(lp->tagged_cmds[ent->tag[1]]);
|
||||
BUG_ON(lp->tagged_cmds[ent->orig_tag[1]]);
|
||||
|
||||
lp->tagged_cmds[ent->tag[1]] = ent;
|
||||
lp->tagged_cmds[ent->orig_tag[1]] = ent;
|
||||
lp->num_tagged++;
|
||||
|
||||
return 0;
|
||||
@@ -575,9 +575,9 @@ static int esp_alloc_lun_tag(struct esp_cmd_entry *ent,
|
||||
static void esp_free_lun_tag(struct esp_cmd_entry *ent,
|
||||
struct esp_lun_data *lp)
|
||||
{
|
||||
if (ent->tag[0]) {
|
||||
BUG_ON(lp->tagged_cmds[ent->tag[1]] != ent);
|
||||
lp->tagged_cmds[ent->tag[1]] = NULL;
|
||||
if (ent->orig_tag[0]) {
|
||||
BUG_ON(lp->tagged_cmds[ent->orig_tag[1]] != ent);
|
||||
lp->tagged_cmds[ent->orig_tag[1]] = NULL;
|
||||
lp->num_tagged--;
|
||||
} else {
|
||||
BUG_ON(lp->non_tagged_cmd != ent);
|
||||
@@ -667,6 +667,8 @@ static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp)
|
||||
ent->tag[0] = 0;
|
||||
ent->tag[1] = 0;
|
||||
}
|
||||
ent->orig_tag[0] = ent->tag[0];
|
||||
ent->orig_tag[1] = ent->tag[1];
|
||||
|
||||
if (esp_alloc_lun_tag(ent, lp) < 0)
|
||||
continue;
|
||||
|
||||
@@ -271,6 +271,7 @@ struct esp_cmd_entry {
|
||||
#define ESP_CMD_FLAG_AUTOSENSE 0x04 /* Doing automatic REQUEST_SENSE */
|
||||
|
||||
u8 tag[2];
|
||||
u8 orig_tag[2];
|
||||
|
||||
u8 status;
|
||||
u8 message;
|
||||
|
||||
@@ -567,12 +567,13 @@ static int vt8500_serial_probe(struct platform_device *pdev)
|
||||
if (!mmres || !irqres)
|
||||
return -ENODEV;
|
||||
|
||||
if (np)
|
||||
if (np) {
|
||||
port = of_alias_get_id(np, "serial");
|
||||
if (port > VT8500_MAX_PORTS)
|
||||
if (port >= VT8500_MAX_PORTS)
|
||||
port = -1;
|
||||
else
|
||||
} else {
|
||||
port = -1;
|
||||
}
|
||||
|
||||
if (port < 0) {
|
||||
/* calculate the port id */
|
||||
@@ -580,7 +581,7 @@ static int vt8500_serial_probe(struct platform_device *pdev)
|
||||
sizeof(vt8500_ports_in_use));
|
||||
}
|
||||
|
||||
if (port > VT8500_MAX_PORTS)
|
||||
if (port >= VT8500_MAX_PORTS)
|
||||
return -ENODEV;
|
||||
|
||||
/* reserve the port id */
|
||||
|
||||
@@ -97,6 +97,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Alcor Micro Corp. Hub */
|
||||
{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* MicroTouch Systems touchscreen */
|
||||
{ USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* appletouch */
|
||||
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
@@ -130,6 +133,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Broadcom BCM92035DGROM BT dongle */
|
||||
{ USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* MAYA44USB sound device */
|
||||
{ USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Action Semiconductor flash disk */
|
||||
{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
|
||||
USB_QUIRK_STRING_FETCH_255 },
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
#define PCI_VENDOR_ID_ETRON 0x1b6f
|
||||
#define PCI_DEVICE_ID_ASROCK_P67 0x7023
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI 0x8c31
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
|
||||
|
||||
static const char hcd_name[] = "xhci_hcd";
|
||||
|
||||
/* called after powerup, by probe or system-pm "wakeup" */
|
||||
@@ -67,6 +70,13 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure"
|
||||
" endpoint cmd after reset endpoint\n");
|
||||
}
|
||||
if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
|
||||
pdev->revision == 0x4) {
|
||||
xhci->quirks |= XHCI_SLOW_SUSPEND;
|
||||
xhci_dbg(xhci, "QUIRK: Fresco Logic xHC revision %u"
|
||||
"must be suspended extra slowly",
|
||||
pdev->revision);
|
||||
}
|
||||
/* Fresco Logic confirms: all revisions of this chip do not
|
||||
* support MSI, even though some of them claim to in their PCI
|
||||
* capabilities.
|
||||
@@ -107,6 +117,15 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci->quirks |= XHCI_SPURIOUS_REBOOT;
|
||||
xhci->quirks |= XHCI_AVOID_BEI;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
(pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI)) {
|
||||
/* Workaround for occasional spurious wakeups from S5 (or
|
||||
* any other sleep) on Haswell machines with LPT and LPT-LP
|
||||
* with the new Intel BIOS
|
||||
*/
|
||||
xhci->quirks |= XHCI_SPURIOUS_WAKEUP;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
|
||||
pdev->device == PCI_DEVICE_ID_ASROCK_P67) {
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
@@ -213,6 +232,11 @@ static void xhci_pci_remove(struct pci_dev *dev)
|
||||
usb_put_hcd(xhci->shared_hcd);
|
||||
}
|
||||
usb_hcd_pci_remove(dev);
|
||||
|
||||
/* Workaround for spurious wakeups at shutdown with HSW */
|
||||
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
||||
pci_set_power_state(dev, PCI_D3hot);
|
||||
|
||||
kfree(xhci);
|
||||
}
|
||||
|
||||
|
||||
@@ -776,12 +776,19 @@ void xhci_shutdown(struct usb_hcd *hcd)
|
||||
|
||||
spin_lock_irq(&xhci->lock);
|
||||
xhci_halt(xhci);
|
||||
/* Workaround for spurious wakeups at shutdown with HSW */
|
||||
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
||||
xhci_reset(xhci);
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
|
||||
xhci_cleanup_msix(xhci);
|
||||
|
||||
xhci_dbg(xhci, "xhci_shutdown completed - status = %x\n",
|
||||
xhci_readl(xhci, &xhci->op_regs->status));
|
||||
|
||||
/* Yet another workaround for spurious wakeups at shutdown with HSW */
|
||||
if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
||||
pci_set_power_state(to_pci_dev(hcd->self.controller), PCI_D3hot);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
@@ -883,6 +890,7 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci)
|
||||
int xhci_suspend(struct xhci_hcd *xhci)
|
||||
{
|
||||
int rc = 0;
|
||||
unsigned int delay = XHCI_MAX_HALT_USEC;
|
||||
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
||||
u32 command;
|
||||
|
||||
@@ -905,8 +913,12 @@ int xhci_suspend(struct xhci_hcd *xhci)
|
||||
command = xhci_readl(xhci, &xhci->op_regs->command);
|
||||
command &= ~CMD_RUN;
|
||||
xhci_writel(xhci, command, &xhci->op_regs->command);
|
||||
|
||||
/* Some chips from Fresco Logic need an extraordinary delay */
|
||||
delay *= (xhci->quirks & XHCI_SLOW_SUSPEND) ? 10 : 1;
|
||||
|
||||
if (xhci_handshake(xhci, &xhci->op_regs->status,
|
||||
STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
|
||||
STS_HALT, STS_HALT, delay)) {
|
||||
xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n");
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
return -ETIMEDOUT;
|
||||
|
||||
@@ -1517,6 +1517,8 @@ struct xhci_hcd {
|
||||
#define XHCI_COMP_MODE_QUIRK (1 << 14)
|
||||
#define XHCI_AVOID_BEI (1 << 15)
|
||||
#define XHCI_PLAT (1 << 16)
|
||||
#define XHCI_SLOW_SUSPEND (1 << 17)
|
||||
#define XHCI_SPURIOUS_WAKEUP (1 << 18)
|
||||
unsigned int num_active_eps;
|
||||
unsigned int limit_active_eps;
|
||||
/* There are two roothubs to keep track of bus suspend info for */
|
||||
|
||||
@@ -451,6 +451,10 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define CHANGHONG_VENDOR_ID 0x2077
|
||||
#define CHANGHONG_PRODUCT_CH690 0x7001
|
||||
|
||||
/* Inovia */
|
||||
#define INOVIA_VENDOR_ID 0x20a6
|
||||
#define INOVIA_SEW858 0x1105
|
||||
|
||||
/* some devices interfaces need special handling due to a number of reasons */
|
||||
enum option_blacklist_reason {
|
||||
OPTION_BLACKLIST_NONE = 0,
|
||||
@@ -689,6 +693,222 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x02) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x03) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x04) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x06) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x10) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x12) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x13) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x14) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x15) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x17) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x18) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x19) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x31) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x32) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x33) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x34) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x35) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x36) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x48) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x49) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x61) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x62) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x63) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x64) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x65) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x66) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x02) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x03) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x04) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x06) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x10) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x12) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x13) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x14) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x15) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x17) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x18) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x19) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x31) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x32) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x33) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x34) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x35) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x36) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x48) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x49) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x61) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x62) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x63) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x64) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x65) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x66) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x02) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x03) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x04) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x06) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x10) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x12) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x13) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x14) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x15) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x17) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x18) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x19) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x31) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x32) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x33) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x34) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x35) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x36) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x48) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x49) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x61) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x62) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x63) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x64) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x65) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x66) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x02) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x03) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x04) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x06) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x10) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x12) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x13) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x14) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x15) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x17) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x18) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x19) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x31) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x32) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x33) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x34) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x35) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x36) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x48) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x49) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4C) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x61) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x62) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x63) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x64) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x65) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x66) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7B) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7C) },
|
||||
|
||||
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) },
|
||||
@@ -1257,7 +1477,9 @@ static const struct usb_device_id option_ids[] = {
|
||||
|
||||
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
|
||||
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) },
|
||||
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200) },
|
||||
{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200),
|
||||
.driver_info = (kernel_ulong_t)&net_intf6_blacklist
|
||||
},
|
||||
{ USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/
|
||||
{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) },
|
||||
@@ -1345,6 +1567,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */
|
||||
{ USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||
|
||||
@@ -209,6 +209,7 @@ static struct usb_device_id ti_id_table_combined[19+2*TI_EXTRA_VID_PID_COUNT+1]
|
||||
{ USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
|
||||
{ USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) },
|
||||
{ USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -211,8 +211,11 @@ static int slave_configure(struct scsi_device *sdev)
|
||||
/*
|
||||
* Many devices do not respond properly to READ_CAPACITY_16.
|
||||
* Tell the SCSI layer to try READ_CAPACITY_10 first.
|
||||
* However some USB 3.0 drive enclosures return capacity
|
||||
* modulo 2TB. Those must use READ_CAPACITY_16
|
||||
*/
|
||||
sdev->try_rc_10_first = 1;
|
||||
if (!(us->fflags & US_FL_NEEDS_CAP16))
|
||||
sdev->try_rc_10_first = 1;
|
||||
|
||||
/* assume SPC3 or latter devices support sense size > 18 */
|
||||
if (sdev->scsi_level > SCSI_SPC_2)
|
||||
|
||||
@@ -1924,6 +1924,13 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Oliver Neukum <oneukum@suse.com> */
|
||||
UNUSUAL_DEV( 0x174c, 0x55aa, 0x0100, 0x0100,
|
||||
"ASMedia",
|
||||
"AS2105",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NEEDS_CAP16),
|
||||
|
||||
/* Reported by Jesse Feddema <jdfeddema@gmail.com> */
|
||||
UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000,
|
||||
"Yarvik",
|
||||
|
||||
@@ -7387,7 +7387,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
|
||||
|
||||
/* check for collisions, even if the name isn't there */
|
||||
ret = btrfs_check_dir_item_collision(root, new_dir->i_ino,
|
||||
ret = btrfs_check_dir_item_collision(dest, new_dir->i_ino,
|
||||
new_dentry->d_name.name,
|
||||
new_dentry->d_name.len);
|
||||
|
||||
|
||||
@@ -120,14 +120,16 @@ cifs_read_super(struct super_block *sb)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct cifs_tcon *tcon;
|
||||
int rc = 0;
|
||||
|
||||
cifs_sb = CIFS_SB(sb);
|
||||
tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
|
||||
sb->s_flags |= MS_POSIXACL;
|
||||
|
||||
if (cifs_sb_master_tcon(cifs_sb)->ses->capabilities & CAP_LARGE_FILES)
|
||||
if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files)
|
||||
sb->s_maxbytes = MAX_LFS_FILESIZE;
|
||||
else
|
||||
sb->s_maxbytes = MAX_NON_LFS;
|
||||
@@ -154,7 +156,7 @@ cifs_read_super(struct super_block *sb)
|
||||
}
|
||||
|
||||
/* do that *after* d_make_root() - we want NULL ->d_op for root here */
|
||||
if (cifs_sb_master_tcon(cifs_sb)->nocase)
|
||||
if (tcon->nocase)
|
||||
sb->s_d_op = &cifs_ci_dentry_ops;
|
||||
else
|
||||
sb->s_d_op = &cifs_dentry_ops;
|
||||
|
||||
@@ -1356,6 +1356,8 @@ retry:
|
||||
s_min_extra_isize) {
|
||||
tried_min_extra_isize++;
|
||||
new_extra_isize = s_min_extra_isize;
|
||||
kfree(is); is = NULL;
|
||||
kfree(bs); bs = NULL;
|
||||
goto retry;
|
||||
}
|
||||
error = -1;
|
||||
|
||||
@@ -94,7 +94,7 @@ retry:
|
||||
|
||||
int fd_statfs(int fd, struct kstatfs *st)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
struct fd f = fdget_raw(fd);
|
||||
int error = -EBADF;
|
||||
if (f.file) {
|
||||
error = vfs_statfs(&f.file->f_path, st);
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
/*
|
||||
* Common definitions for all gcc versions go here.
|
||||
*/
|
||||
#define GCC_VERSION (__GNUC__ * 10000 \
|
||||
+ __GNUC_MINOR__ * 100 \
|
||||
+ __GNUC_PATCHLEVEL__)
|
||||
|
||||
|
||||
/* Optimization barrier */
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
||||
|
||||
#if __GNUC_MINOR__ > 0
|
||||
# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||
#endif
|
||||
|
||||
#if __GNUC_MINOR__ >= 3
|
||||
/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
to them will be unlikely. This means a lot of manual unlikely()s
|
||||
@@ -33,6 +37,12 @@
|
||||
|
||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
|
||||
#ifndef __CHECKER__
|
||||
# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
# define __compiletime_error(message) __attribute__((error(message)))
|
||||
#endif /* __CHECKER__ */
|
||||
#endif /* __GNUC_MINOR__ >= 3 */
|
||||
|
||||
#if __GNUC_MINOR__ >= 5
|
||||
/*
|
||||
* Mark a position in code as unreachable. This can be used to
|
||||
@@ -48,8 +58,7 @@
|
||||
/* Mark a function definition as prohibited from being cloned. */
|
||||
#define __noclone __attribute__((__noclone__))
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif /* __GNUC_MINOR__ >= 5 */
|
||||
|
||||
#if __GNUC_MINOR__ >= 6
|
||||
/*
|
||||
@@ -58,12 +67,20 @@
|
||||
#define __visible __attribute__((externally_visible))
|
||||
#endif
|
||||
|
||||
#if __GNUC_MINOR__ > 0
|
||||
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||
#endif
|
||||
#if __GNUC_MINOR__ >= 3 && !defined(__CHECKER__)
|
||||
#define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
#define __compiletime_error(message) __attribute__((error(message)))
|
||||
/*
|
||||
* GCC 'asm goto' miscompiles certain code sequences:
|
||||
*
|
||||
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
*
|
||||
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
* Fixed in GCC 4.8.2 and later versions.
|
||||
*
|
||||
* (asm goto is automatically volatile - the naming reflects this.)
|
||||
*/
|
||||
#if GCC_VERSION <= 40801
|
||||
# define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
#else
|
||||
# define asm_volatile_goto(x...) do { asm goto(x); } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
|
||||
@@ -17,6 +17,7 @@ extern void add_interrupt_randomness(int irq, int irq_flags);
|
||||
extern void get_random_bytes(void *buf, int nbytes);
|
||||
extern void get_random_bytes_arch(void *buf, int nbytes);
|
||||
void generate_random_uuid(unsigned char uuid_out[16]);
|
||||
extern int random_int_secret_init(void);
|
||||
|
||||
#ifndef MODULE
|
||||
extern const struct file_operations random_fops, urandom_fops;
|
||||
|
||||
@@ -64,6 +64,20 @@
|
||||
|
||||
#include <asm/timex.h>
|
||||
|
||||
#ifndef random_get_entropy
|
||||
/*
|
||||
* The random_get_entropy() function is used by the /dev/random driver
|
||||
* in order to extract entropy via the relative unpredictability of
|
||||
* when an interrupt takes places versus a high speed, fine-grained
|
||||
* timing source or cycle counter. Since it will be occurred on every
|
||||
* single interrupt, it must have a very low cost/overhead.
|
||||
*
|
||||
* By default we use get_cycles() for this purpose, but individual
|
||||
* architectures may override this in their asm/timex.h header file.
|
||||
*/
|
||||
#define random_get_entropy() get_cycles()
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SHIFT_PLL is used as a dampening factor to define how much we
|
||||
* adjust the frequency correction for a given offset in PLL mode.
|
||||
|
||||
@@ -66,7 +66,9 @@
|
||||
US_FLAG(INITIAL_READ10, 0x00100000) \
|
||||
/* Initial READ(10) (and others) must be retried */ \
|
||||
US_FLAG(WRITE_CACHE, 0x00200000) \
|
||||
/* Write Cache status is not available */
|
||||
/* Write Cache status is not available */ \
|
||||
US_FLAG(NEEDS_CAP16, 0x00400000)
|
||||
/* cannot handle READ_CAPACITY_10 */
|
||||
|
||||
#define US_FLAG(name, value) US_FL_##name = value ,
|
||||
enum { US_DO_ALL_FLAGS };
|
||||
|
||||
@@ -254,9 +254,11 @@ int ip_dont_fragment(struct sock *sk, struct dst_entry *dst)
|
||||
|
||||
extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more);
|
||||
|
||||
static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, struct sock *sk)
|
||||
static inline void ip_select_ident(struct sk_buff *skb, struct dst_entry *dst, struct sock *sk)
|
||||
{
|
||||
if (iph->frag_off & htons(IP_DF)) {
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if ((iph->frag_off & htons(IP_DF)) && !skb->local_df) {
|
||||
/* This is only to work around buggy Windows95/2000
|
||||
* VJ compression implementations. If the ID field
|
||||
* does not change, they drop every other packet in
|
||||
@@ -268,9 +270,11 @@ static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, str
|
||||
__ip_select_ident(iph, dst, 0);
|
||||
}
|
||||
|
||||
static inline void ip_select_ident_more(struct iphdr *iph, struct dst_entry *dst, struct sock *sk, int more)
|
||||
static inline void ip_select_ident_more(struct sk_buff *skb, struct dst_entry *dst, struct sock *sk, int more)
|
||||
{
|
||||
if (iph->frag_off & htons(IP_DF)) {
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if ((iph->frag_off & htons(IP_DF)) && !skb->local_df) {
|
||||
if (sk && inet_sk(sk)->inet_daddr) {
|
||||
iph->id = htons(inet_sk(sk)->inet_id);
|
||||
inet_sk(sk)->inet_id += 1 + more;
|
||||
|
||||
@@ -976,6 +976,7 @@ struct netns_ipvs {
|
||||
int sysctl_sync_retries;
|
||||
int sysctl_nat_icmp_send;
|
||||
int sysctl_pmtu_disc;
|
||||
int sysctl_backup_only;
|
||||
|
||||
/* ip_vs_lblc */
|
||||
int sysctl_lblc_expiration;
|
||||
@@ -1067,6 +1068,12 @@ static inline int sysctl_pmtu_disc(struct netns_ipvs *ipvs)
|
||||
return ipvs->sysctl_pmtu_disc;
|
||||
}
|
||||
|
||||
static inline int sysctl_backup_only(struct netns_ipvs *ipvs)
|
||||
{
|
||||
return ipvs->sync_state & IP_VS_STATE_BACKUP &&
|
||||
ipvs->sysctl_backup_only;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs)
|
||||
@@ -1114,6 +1121,11 @@ static inline int sysctl_pmtu_disc(struct netns_ipvs *ipvs)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int sysctl_backup_only(struct netns_ipvs *ipvs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -51,13 +51,12 @@ struct ip_tunnel_prl_entry {
|
||||
static inline void iptunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
int err;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
int pkt_len = skb->len - skb_transport_offset(skb);
|
||||
struct pcpu_tstats *tstats = this_cpu_ptr(dev->tstats);
|
||||
|
||||
nf_reset(skb);
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
ip_select_ident(iph, skb_dst(skb), NULL);
|
||||
ip_select_ident(skb, skb_dst(skb), NULL);
|
||||
|
||||
err = ip_local_out(skb);
|
||||
if (likely(net_xmit_eval(err) == 0)) {
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/bugs.h>
|
||||
@@ -804,6 +805,7 @@ static void __init do_basic_setup(void)
|
||||
do_ctors();
|
||||
usermodehelper_enable();
|
||||
do_initcalls();
|
||||
random_int_secret_init();
|
||||
}
|
||||
|
||||
static void __init do_pre_smp_initcalls(void)
|
||||
|
||||
@@ -2740,6 +2740,7 @@ void __split_huge_page_pmd(struct vm_area_struct *vma, unsigned long address,
|
||||
|
||||
mmun_start = haddr;
|
||||
mmun_end = haddr + HPAGE_PMD_SIZE;
|
||||
again:
|
||||
mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end);
|
||||
spin_lock(&mm->page_table_lock);
|
||||
if (unlikely(!pmd_trans_huge(*pmd))) {
|
||||
@@ -2762,7 +2763,14 @@ void __split_huge_page_pmd(struct vm_area_struct *vma, unsigned long address,
|
||||
split_huge_page(page);
|
||||
|
||||
put_page(page);
|
||||
BUG_ON(pmd_trans_huge(*pmd));
|
||||
|
||||
/*
|
||||
* We don't always have down_write of mmap_sem here: a racing
|
||||
* do_huge_pmd_wp_page() might have copied-on-write to another
|
||||
* huge page before our split_huge_page() got the anon_vma lock.
|
||||
*/
|
||||
if (unlikely(pmd_trans_huge(*pmd)))
|
||||
goto again;
|
||||
}
|
||||
|
||||
void split_huge_page_pmd_mm(struct mm_struct *mm, unsigned long address,
|
||||
|
||||
@@ -1100,11 +1100,11 @@ static unsigned long dirty_poll_interval(unsigned long dirty,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static long bdi_max_pause(struct backing_dev_info *bdi,
|
||||
unsigned long bdi_dirty)
|
||||
static unsigned long bdi_max_pause(struct backing_dev_info *bdi,
|
||||
unsigned long bdi_dirty)
|
||||
{
|
||||
long bw = bdi->avg_write_bandwidth;
|
||||
long t;
|
||||
unsigned long bw = bdi->avg_write_bandwidth;
|
||||
unsigned long t;
|
||||
|
||||
/*
|
||||
* Limit pause time for small memory systems. If sleeping for too long
|
||||
@@ -1116,7 +1116,7 @@ static long bdi_max_pause(struct backing_dev_info *bdi,
|
||||
t = bdi_dirty / (1 + bw / roundup_pow_of_two(1 + HZ / 8));
|
||||
t++;
|
||||
|
||||
return min_t(long, t, MAX_PAUSE);
|
||||
return min_t(unsigned long, t, MAX_PAUSE);
|
||||
}
|
||||
|
||||
static long bdi_min_pause(struct backing_dev_info *bdi,
|
||||
|
||||
@@ -152,7 +152,7 @@ int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
struct net_device *dev)
|
||||
{
|
||||
int err = 0;
|
||||
struct net_bridge_port *port = br_port_get_rcu(dev);
|
||||
struct net_bridge_port *port = br_port_get_rtnl(dev);
|
||||
|
||||
/* not a bridge port */
|
||||
if (!port)
|
||||
|
||||
@@ -162,13 +162,10 @@ struct net_bridge_port
|
||||
|
||||
static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
|
||||
{
|
||||
struct net_bridge_port *port =
|
||||
rcu_dereference_rtnl(dev->rx_handler_data);
|
||||
|
||||
return br_port_exists(dev) ? port : NULL;
|
||||
return rcu_dereference(dev->rx_handler_data);
|
||||
}
|
||||
|
||||
static inline struct net_bridge_port *br_port_get_rtnl(struct net_device *dev)
|
||||
static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *dev)
|
||||
{
|
||||
return br_port_exists(dev) ?
|
||||
rtnl_dereference(dev->rx_handler_data) : NULL;
|
||||
@@ -552,6 +549,7 @@ extern struct net_bridge_port *br_get_port(struct net_bridge *br,
|
||||
extern void br_init_port(struct net_bridge_port *p);
|
||||
extern void br_become_designated_port(struct net_bridge_port *p);
|
||||
|
||||
extern void __br_set_forward_delay(struct net_bridge *br, unsigned long t);
|
||||
extern int br_set_forward_delay(struct net_bridge *br, unsigned long x);
|
||||
extern int br_set_hello_time(struct net_bridge *br, unsigned long x);
|
||||
extern int br_set_max_age(struct net_bridge *br, unsigned long x);
|
||||
|
||||
@@ -209,7 +209,7 @@ static void br_record_config_information(struct net_bridge_port *p,
|
||||
p->designated_age = jiffies - bpdu->message_age;
|
||||
|
||||
mod_timer(&p->message_age_timer, jiffies
|
||||
+ (p->br->max_age - bpdu->message_age));
|
||||
+ (bpdu->max_age - bpdu->message_age));
|
||||
}
|
||||
|
||||
/* called under bridge lock */
|
||||
@@ -537,18 +537,27 @@ int br_set_max_age(struct net_bridge *br, unsigned long val)
|
||||
|
||||
}
|
||||
|
||||
int br_set_forward_delay(struct net_bridge *br, unsigned long val)
|
||||
void __br_set_forward_delay(struct net_bridge *br, unsigned long t)
|
||||
{
|
||||
unsigned long t = clock_t_to_jiffies(val);
|
||||
|
||||
if (br->stp_enabled != BR_NO_STP &&
|
||||
(t < BR_MIN_FORWARD_DELAY || t > BR_MAX_FORWARD_DELAY))
|
||||
return -ERANGE;
|
||||
|
||||
spin_lock_bh(&br->lock);
|
||||
br->bridge_forward_delay = t;
|
||||
if (br_is_root_bridge(br))
|
||||
br->forward_delay = br->bridge_forward_delay;
|
||||
spin_unlock_bh(&br->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int br_set_forward_delay(struct net_bridge *br, unsigned long val)
|
||||
{
|
||||
unsigned long t = clock_t_to_jiffies(val);
|
||||
int err = -ERANGE;
|
||||
|
||||
spin_lock_bh(&br->lock);
|
||||
if (br->stp_enabled != BR_NO_STP &&
|
||||
(t < BR_MIN_FORWARD_DELAY || t > BR_MAX_FORWARD_DELAY))
|
||||
goto unlock;
|
||||
|
||||
__br_set_forward_delay(br, t);
|
||||
err = 0;
|
||||
|
||||
unlock:
|
||||
spin_unlock_bh(&br->lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -129,6 +129,14 @@ static void br_stp_start(struct net_bridge *br)
|
||||
char *envp[] = { NULL };
|
||||
|
||||
r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
|
||||
|
||||
spin_lock_bh(&br->lock);
|
||||
|
||||
if (br->bridge_forward_delay < BR_MIN_FORWARD_DELAY)
|
||||
__br_set_forward_delay(br, BR_MIN_FORWARD_DELAY);
|
||||
else if (br->bridge_forward_delay < BR_MAX_FORWARD_DELAY)
|
||||
__br_set_forward_delay(br, BR_MAX_FORWARD_DELAY);
|
||||
|
||||
if (r == 0) {
|
||||
br->stp_enabled = BR_USER_STP;
|
||||
br_debug(br, "userspace STP started\n");
|
||||
@@ -137,10 +145,10 @@ static void br_stp_start(struct net_bridge *br)
|
||||
br_debug(br, "using kernel STP\n");
|
||||
|
||||
/* To start timers on any ports left in blocking */
|
||||
spin_lock_bh(&br->lock);
|
||||
br_port_state_selection(br);
|
||||
spin_unlock_bh(&br->lock);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&br->lock);
|
||||
}
|
||||
|
||||
static void br_stp_stop(struct net_bridge *br)
|
||||
|
||||
@@ -293,9 +293,10 @@ int cfctrl_linkup_request(struct cflayer *layer,
|
||||
|
||||
count = cfctrl_cancel_req(&cfctrl->serv.layer,
|
||||
user_layer);
|
||||
if (count != 1)
|
||||
if (count != 1) {
|
||||
pr_err("Could not remove request (%d)", count);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -134,8 +134,8 @@ ipv6:
|
||||
if (poff >= 0) {
|
||||
__be32 *ports, _ports;
|
||||
|
||||
nhoff += poff;
|
||||
ports = skb_header_pointer(skb, nhoff, sizeof(_ports), &_ports);
|
||||
ports = skb_header_pointer(skb, nhoff + poff,
|
||||
sizeof(_ports), &_ports);
|
||||
if (ports)
|
||||
flow->ports = *ports;
|
||||
}
|
||||
|
||||
@@ -962,15 +962,14 @@ EXPORT_SYMBOL_GPL(__netpoll_free_rcu);
|
||||
|
||||
void netpoll_cleanup(struct netpoll *np)
|
||||
{
|
||||
if (!np->dev)
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
if (!np->dev)
|
||||
goto out;
|
||||
__netpoll_cleanup(np);
|
||||
rtnl_unlock();
|
||||
|
||||
dev_put(np->dev);
|
||||
np->dev = NULL;
|
||||
out:
|
||||
rtnl_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL(netpoll_cleanup);
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
||||
|
||||
if (dst)
|
||||
dst->ops->redirect(dst, sk, skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (type == ICMPV6_PKT_TOOBIG) {
|
||||
|
||||
@@ -343,7 +343,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
|
||||
pip->saddr = fl4.saddr;
|
||||
pip->protocol = IPPROTO_IGMP;
|
||||
pip->tot_len = 0; /* filled in later */
|
||||
ip_select_ident(pip, &rt->dst, NULL);
|
||||
ip_select_ident(skb, &rt->dst, NULL);
|
||||
((u8 *)&pip[1])[0] = IPOPT_RA;
|
||||
((u8 *)&pip[1])[1] = 4;
|
||||
((u8 *)&pip[1])[2] = 0;
|
||||
@@ -687,7 +687,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
|
||||
iph->daddr = dst;
|
||||
iph->saddr = fl4.saddr;
|
||||
iph->protocol = IPPROTO_IGMP;
|
||||
ip_select_ident(iph, &rt->dst, NULL);
|
||||
ip_select_ident(skb, &rt->dst, NULL);
|
||||
((u8 *)&iph[1])[0] = IPOPT_RA;
|
||||
((u8 *)&iph[1])[1] = 4;
|
||||
((u8 *)&iph[1])[2] = 0;
|
||||
@@ -709,7 +709,7 @@ static void igmp_gq_timer_expire(unsigned long data)
|
||||
|
||||
in_dev->mr_gq_running = 0;
|
||||
igmpv3_send_report(in_dev, NULL);
|
||||
__in_dev_put(in_dev);
|
||||
in_dev_put(in_dev);
|
||||
}
|
||||
|
||||
static void igmp_ifc_timer_expire(unsigned long data)
|
||||
@@ -721,7 +721,7 @@ static void igmp_ifc_timer_expire(unsigned long data)
|
||||
in_dev->mr_ifc_count--;
|
||||
igmp_ifc_start_timer(in_dev, IGMP_Unsolicited_Report_Interval);
|
||||
}
|
||||
__in_dev_put(in_dev);
|
||||
in_dev_put(in_dev);
|
||||
}
|
||||
|
||||
static void igmp_ifc_event(struct in_device *in_dev)
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
* At the moment of writing this notes identifier of IP packets is generated
|
||||
* to be unpredictable using this code only for packets subjected
|
||||
* (actually or potentially) to defragmentation. I.e. DF packets less than
|
||||
* PMTU in size uses a constant ID and do not use this code (see
|
||||
* ip_select_ident() in include/net/ip.h).
|
||||
* PMTU in size when local fragmentation is disabled use a constant ID and do
|
||||
* not use this code (see ip_select_ident() in include/net/ip.h).
|
||||
*
|
||||
* Route cache entries hold references to our nodes.
|
||||
* New cache entries get references via lookup by destination IP address in
|
||||
|
||||
@@ -148,7 +148,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
|
||||
iph->daddr = (opt && opt->opt.srr ? opt->opt.faddr : daddr);
|
||||
iph->saddr = saddr;
|
||||
iph->protocol = sk->sk_protocol;
|
||||
ip_select_ident(iph, &rt->dst, sk);
|
||||
ip_select_ident(skb, &rt->dst, sk);
|
||||
|
||||
if (opt && opt->opt.optlen) {
|
||||
iph->ihl += opt->opt.optlen>>2;
|
||||
@@ -394,7 +394,7 @@ packet_routed:
|
||||
ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt, 0);
|
||||
}
|
||||
|
||||
ip_select_ident_more(iph, &rt->dst, sk,
|
||||
ip_select_ident_more(skb, &rt->dst, sk,
|
||||
(skb_shinfo(skb)->gso_segs ?: 1) - 1);
|
||||
|
||||
skb->priority = sk->sk_priority;
|
||||
@@ -1324,7 +1324,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
|
||||
else
|
||||
ttl = ip_select_ttl(inet, &rt->dst);
|
||||
|
||||
iph = (struct iphdr *)skb->data;
|
||||
iph = ip_hdr(skb);
|
||||
iph->version = 4;
|
||||
iph->ihl = 5;
|
||||
iph->tos = inet->tos;
|
||||
@@ -1332,7 +1332,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
|
||||
iph->ttl = ttl;
|
||||
iph->protocol = sk->sk_protocol;
|
||||
ip_copy_addrs(iph, fl4);
|
||||
ip_select_ident(iph, &rt->dst, sk);
|
||||
ip_select_ident(skb, &rt->dst, sk);
|
||||
|
||||
if (opt) {
|
||||
iph->ihl += opt->optlen>>2;
|
||||
|
||||
@@ -1606,7 +1606,7 @@ static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr)
|
||||
iph->protocol = IPPROTO_IPIP;
|
||||
iph->ihl = 5;
|
||||
iph->tot_len = htons(skb->len);
|
||||
ip_select_ident(iph, skb_dst(skb), NULL);
|
||||
ip_select_ident(skb, skb_dst(skb), NULL);
|
||||
ip_send_check(iph);
|
||||
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||
|
||||
@@ -389,7 +389,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
|
||||
iph->check = 0;
|
||||
iph->tot_len = htons(length);
|
||||
if (!iph->id)
|
||||
ip_select_ident(iph, &rt->dst, NULL);
|
||||
ip_select_ident(skb, &rt->dst, NULL);
|
||||
|
||||
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
|
||||
}
|
||||
|
||||
@@ -2540,10 +2540,11 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
|
||||
case TCP_THIN_DUPACK:
|
||||
if (val < 0 || val > 1)
|
||||
err = -EINVAL;
|
||||
else
|
||||
else {
|
||||
tp->thin_dupack = val;
|
||||
if (tp->thin_dupack)
|
||||
tcp_disable_early_retrans(tp);
|
||||
}
|
||||
break;
|
||||
|
||||
case TCP_REPAIR:
|
||||
|
||||
@@ -113,7 +113,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
|
||||
|
||||
top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ?
|
||||
0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF));
|
||||
ip_select_ident(top_iph, dst->child, NULL);
|
||||
ip_select_ident(skb, dst->child, NULL);
|
||||
|
||||
top_iph->ttl = ip4_dst_hoplimit(dst->child);
|
||||
|
||||
|
||||
@@ -162,12 +162,6 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs, struct sk_buff *skb)
|
||||
off += optlen;
|
||||
len -= optlen;
|
||||
}
|
||||
/* This case will not be caught by above check since its padding
|
||||
* length is smaller than 7:
|
||||
* 1 byte NH + 1 byte Length + 6 bytes Padding
|
||||
*/
|
||||
if ((padlen == 6) && ((off - skb_network_header_len(skb)) == 8))
|
||||
goto bad;
|
||||
|
||||
if (len == 0)
|
||||
return true;
|
||||
|
||||
@@ -827,9 +827,9 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info)
|
||||
fn = fib6_add_1(root, &rt->rt6i_dst.addr, sizeof(struct in6_addr),
|
||||
rt->rt6i_dst.plen, offsetof(struct rt6_info, rt6i_dst),
|
||||
allow_create, replace_required);
|
||||
|
||||
if (IS_ERR(fn)) {
|
||||
err = PTR_ERR(fn);
|
||||
fn = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -659,7 +659,7 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
|
||||
struct ip6_tnl *tunnel = netdev_priv(dev);
|
||||
struct net_device *tdev; /* Device to other host */
|
||||
struct ipv6hdr *ipv6h; /* Our new IP header */
|
||||
unsigned int max_headroom; /* The extra header space needed */
|
||||
unsigned int max_headroom = 0; /* The extra header space needed */
|
||||
int gre_hlen;
|
||||
struct ipv6_tel_txoption opt;
|
||||
int mtu;
|
||||
@@ -733,7 +733,7 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
|
||||
tunnel->err_count = 0;
|
||||
}
|
||||
|
||||
max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + dst->header_len;
|
||||
max_headroom += LL_RESERVED_SPACE(tdev) + gre_hlen + dst->header_len;
|
||||
|
||||
if (skb_headroom(skb) < max_headroom || skb_shared(skb) ||
|
||||
(skb_cloned(skb) && !skb_clone_writable(skb, 0))) {
|
||||
|
||||
@@ -1057,6 +1057,8 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
||||
* udp datagram
|
||||
*/
|
||||
if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
|
||||
struct frag_hdr fhdr;
|
||||
|
||||
skb = sock_alloc_send_skb(sk,
|
||||
hh_len + fragheaderlen + transhdrlen + 20,
|
||||
(flags & MSG_DONTWAIT), &err);
|
||||
@@ -1077,12 +1079,6 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
||||
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
skb->csum = 0;
|
||||
}
|
||||
|
||||
err = skb_append_datato_frags(sk,skb, getfrag, from,
|
||||
(length - transhdrlen));
|
||||
if (!err) {
|
||||
struct frag_hdr fhdr;
|
||||
|
||||
/* Specify the length of each IPv6 datagram fragment.
|
||||
* It has to be a multiple of 8.
|
||||
@@ -1093,15 +1089,10 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
||||
ipv6_select_ident(&fhdr, rt);
|
||||
skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
|
||||
__skb_queue_tail(&sk->sk_write_queue, skb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* There is not enough support do UPD LSO,
|
||||
* so follow normal path
|
||||
*/
|
||||
kfree_skb(skb);
|
||||
|
||||
return err;
|
||||
return skb_append_datato_frags(sk, skb, getfrag, from,
|
||||
(length - transhdrlen));
|
||||
}
|
||||
|
||||
static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
|
||||
@@ -1271,27 +1262,27 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
||||
* --yoshfuji
|
||||
*/
|
||||
|
||||
cork->length += length;
|
||||
if (length > mtu) {
|
||||
int proto = sk->sk_protocol;
|
||||
if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){
|
||||
ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
if (proto == IPPROTO_UDP &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO)) {
|
||||
|
||||
err = ip6_ufo_append_data(sk, getfrag, from, length,
|
||||
hh_len, fragheaderlen,
|
||||
transhdrlen, mtu, flags, rt);
|
||||
if (err)
|
||||
goto error;
|
||||
return 0;
|
||||
}
|
||||
if ((length > mtu) && dontfrag && (sk->sk_protocol == IPPROTO_UDP ||
|
||||
sk->sk_protocol == IPPROTO_RAW)) {
|
||||
ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
|
||||
skb = skb_peek_tail(&sk->sk_write_queue);
|
||||
cork->length += length;
|
||||
if (((length > mtu) ||
|
||||
(skb && skb_is_gso(skb))) &&
|
||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO)) {
|
||||
err = ip6_ufo_append_data(sk, getfrag, from, length,
|
||||
hh_len, fragheaderlen,
|
||||
transhdrlen, mtu, flags, rt);
|
||||
if (err)
|
||||
goto error;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!skb)
|
||||
goto alloc_new_skb;
|
||||
|
||||
while (length > 0) {
|
||||
|
||||
@@ -1660,9 +1660,9 @@ static int ip6_tnl_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
|
||||
if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
|
||||
nla_put(skb, IFLA_IPTUN_LOCAL, sizeof(struct in6_addr),
|
||||
&parm->raddr) ||
|
||||
nla_put(skb, IFLA_IPTUN_REMOTE, sizeof(struct in6_addr),
|
||||
&parm->laddr) ||
|
||||
nla_put(skb, IFLA_IPTUN_REMOTE, sizeof(struct in6_addr),
|
||||
&parm->raddr) ||
|
||||
nla_put_u8(skb, IFLA_IPTUN_TTL, parm->hop_limit) ||
|
||||
nla_put_u8(skb, IFLA_IPTUN_ENCAP_LIMIT, parm->encap_limit) ||
|
||||
nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
|
||||
@@ -1746,6 +1746,7 @@ static int __net_init ip6_tnl_init_net(struct net *net)
|
||||
if (!ip6n->fb_tnl_dev)
|
||||
goto err_alloc_dev;
|
||||
dev_net_set(ip6n->fb_tnl_dev, net);
|
||||
ip6n->fb_tnl_dev->rtnl_link_ops = &ip6_link_ops;
|
||||
|
||||
err = ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
|
||||
if (err < 0)
|
||||
|
||||
@@ -2155,7 +2155,7 @@ static void mld_gq_timer_expire(unsigned long data)
|
||||
|
||||
idev->mc_gq_running = 0;
|
||||
mld_send_report(idev, NULL);
|
||||
__in6_dev_put(idev);
|
||||
in6_dev_put(idev);
|
||||
}
|
||||
|
||||
static void mld_ifc_timer_expire(unsigned long data)
|
||||
@@ -2168,7 +2168,7 @@ static void mld_ifc_timer_expire(unsigned long data)
|
||||
if (idev->mc_ifc_count)
|
||||
mld_ifc_start_timer(idev, idev->mc_maxdelay);
|
||||
}
|
||||
__in6_dev_put(idev);
|
||||
in6_dev_put(idev);
|
||||
}
|
||||
|
||||
static void mld_ifc_event(struct inet6_dev *idev)
|
||||
|
||||
@@ -1517,6 +1517,7 @@ static int __net_init sit_init_net(struct net *net)
|
||||
goto err_alloc_dev;
|
||||
}
|
||||
dev_net_set(sitn->fb_tunnel_dev, net);
|
||||
sitn->fb_tunnel_dev->rtnl_link_ops = &sit_link_ops;
|
||||
|
||||
err = ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
|
||||
if (err)
|
||||
|
||||
@@ -1604,7 +1604,8 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
|
||||
}
|
||||
/* ipvs enabled in this netns ? */
|
||||
net = skb_net(skb);
|
||||
if (!net_ipvs(net)->enable)
|
||||
ipvs = net_ipvs(net);
|
||||
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
||||
return NF_ACCEPT;
|
||||
|
||||
ip_vs_fill_iph_skb(af, skb, &iph);
|
||||
@@ -1690,7 +1691,6 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
|
||||
}
|
||||
|
||||
IP_VS_DBG_PKT(11, af, pp, skb, 0, "Incoming packet");
|
||||
ipvs = net_ipvs(net);
|
||||
/* Check the server status */
|
||||
if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) {
|
||||
/* the destination server is not available */
|
||||
@@ -1851,13 +1851,15 @@ ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff *skb,
|
||||
{
|
||||
int r;
|
||||
struct net *net;
|
||||
struct netns_ipvs *ipvs;
|
||||
|
||||
if (ip_hdr(skb)->protocol != IPPROTO_ICMP)
|
||||
return NF_ACCEPT;
|
||||
|
||||
/* ipvs enabled in this netns ? */
|
||||
net = skb_net(skb);
|
||||
if (!net_ipvs(net)->enable)
|
||||
ipvs = net_ipvs(net);
|
||||
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
||||
return NF_ACCEPT;
|
||||
|
||||
return ip_vs_in_icmp(skb, &r, hooknum);
|
||||
@@ -1871,6 +1873,7 @@ ip_vs_forward_icmp_v6(unsigned int hooknum, struct sk_buff *skb,
|
||||
{
|
||||
int r;
|
||||
struct net *net;
|
||||
struct netns_ipvs *ipvs;
|
||||
struct ip_vs_iphdr iphdr;
|
||||
|
||||
ip_vs_fill_iph_skb(AF_INET6, skb, &iphdr);
|
||||
@@ -1879,7 +1882,8 @@ ip_vs_forward_icmp_v6(unsigned int hooknum, struct sk_buff *skb,
|
||||
|
||||
/* ipvs enabled in this netns ? */
|
||||
net = skb_net(skb);
|
||||
if (!net_ipvs(net)->enable)
|
||||
ipvs = net_ipvs(net);
|
||||
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
||||
return NF_ACCEPT;
|
||||
|
||||
return ip_vs_in_icmp_v6(skb, &r, hooknum, &iphdr);
|
||||
|
||||
@@ -1808,6 +1808,12 @@ static struct ctl_table vs_vars[] = {
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "backup_only",
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
#ifdef CONFIG_IP_VS_DEBUG
|
||||
{
|
||||
.procname = "debug_level",
|
||||
@@ -3742,6 +3748,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net)
|
||||
tbl[idx++].data = &ipvs->sysctl_nat_icmp_send;
|
||||
ipvs->sysctl_pmtu_disc = 1;
|
||||
tbl[idx++].data = &ipvs->sysctl_pmtu_disc;
|
||||
tbl[idx++].data = &ipvs->sysctl_backup_only;
|
||||
|
||||
|
||||
ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl);
|
||||
|
||||
@@ -906,7 +906,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
iph->daddr = cp->daddr.ip;
|
||||
iph->saddr = saddr;
|
||||
iph->ttl = old_iph->ttl;
|
||||
ip_select_ident(iph, &rt->dst, NULL);
|
||||
ip_select_ident(skb, &rt->dst, NULL);
|
||||
|
||||
/* Another hack: avoid icmp_send in ip_fragment */
|
||||
skb->local_df = 1;
|
||||
|
||||
@@ -1513,7 +1513,7 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
|
||||
htb_precompute_ratedata(&cl->ceil);
|
||||
|
||||
cl->buffer = hopt->buffer << PSCHED_SHIFT;
|
||||
cl->cbuffer = hopt->buffer << PSCHED_SHIFT;
|
||||
cl->cbuffer = hopt->cbuffer << PSCHED_SHIFT;
|
||||
|
||||
sch_tree_unlock(sch);
|
||||
|
||||
|
||||
@@ -649,8 +649,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
|
||||
break;
|
||||
case ICMP_REDIRECT:
|
||||
sctp_icmp_redirect(sk, transport, skb);
|
||||
err = 0;
|
||||
break;
|
||||
/* Fall through to out_unlock. */
|
||||
default:
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@ SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
||||
break;
|
||||
case NDISC_REDIRECT:
|
||||
sctp_icmp_redirect(sk, transport, skb);
|
||||
break;
|
||||
goto out_unlock;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -210,45 +210,24 @@ out:
|
||||
in6_dev_put(idev);
|
||||
}
|
||||
|
||||
/* Based on tcp_v6_xmit() in tcp_ipv6.c. */
|
||||
static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct flowi6 fl6;
|
||||
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
|
||||
fl6.flowi6_proto = sk->sk_protocol;
|
||||
|
||||
/* Fill in the dest address from the route entry passed with the skb
|
||||
* and the source address from the transport.
|
||||
*/
|
||||
fl6.daddr = transport->ipaddr.v6.sin6_addr;
|
||||
fl6.saddr = transport->saddr.v6.sin6_addr;
|
||||
|
||||
fl6.flowlabel = np->flow_label;
|
||||
IP6_ECN_flow_xmit(sk, fl6.flowlabel);
|
||||
if (ipv6_addr_type(&fl6.saddr) & IPV6_ADDR_LINKLOCAL)
|
||||
fl6.flowi6_oif = transport->saddr.v6.sin6_scope_id;
|
||||
else
|
||||
fl6.flowi6_oif = sk->sk_bound_dev_if;
|
||||
|
||||
if (np->opt && np->opt->srcrt) {
|
||||
struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
|
||||
fl6.daddr = *rt0->addr;
|
||||
}
|
||||
struct flowi6 *fl6 = &transport->fl.u.ip6;
|
||||
|
||||
SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, src:%pI6 dst:%pI6\n",
|
||||
__func__, skb, skb->len,
|
||||
&fl6.saddr, &fl6.daddr);
|
||||
&fl6->saddr, &fl6->daddr);
|
||||
|
||||
SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS);
|
||||
IP6_ECN_flow_xmit(sk, fl6->flowlabel);
|
||||
|
||||
if (!(transport->param_flags & SPP_PMTUD_ENABLE))
|
||||
skb->local_df = 1;
|
||||
|
||||
return ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
|
||||
SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS);
|
||||
|
||||
return ip6_xmit(sk, skb, fl6, np->opt, np->tclass);
|
||||
}
|
||||
|
||||
/* Returns the dst cache entry for the given source and destination ip
|
||||
@@ -261,10 +240,12 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
||||
struct dst_entry *dst = NULL;
|
||||
struct flowi6 *fl6 = &fl->u.ip6;
|
||||
struct sctp_bind_addr *bp;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct sctp_sockaddr_entry *laddr;
|
||||
union sctp_addr *baddr = NULL;
|
||||
union sctp_addr *daddr = &t->ipaddr;
|
||||
union sctp_addr dst_saddr;
|
||||
struct in6_addr *final_p, final;
|
||||
__u8 matchlen = 0;
|
||||
__u8 bmatchlen;
|
||||
sctp_scope_t scope;
|
||||
@@ -287,7 +268,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
||||
SCTP_DEBUG_PRINTK("SRC=%pI6 - ", &fl6->saddr);
|
||||
}
|
||||
|
||||
dst = ip6_dst_lookup_flow(sk, fl6, NULL, false);
|
||||
final_p = fl6_update_dst(fl6, np->opt, &final);
|
||||
dst = ip6_dst_lookup_flow(sk, fl6, final_p, false);
|
||||
if (!asoc || saddr)
|
||||
goto out;
|
||||
|
||||
@@ -339,10 +321,12 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (baddr) {
|
||||
fl6->saddr = baddr->v6.sin6_addr;
|
||||
fl6->fl6_sport = baddr->v6.sin6_port;
|
||||
dst = ip6_dst_lookup_flow(sk, fl6, NULL, false);
|
||||
final_p = fl6_update_dst(fl6, np->opt, &final);
|
||||
dst = ip6_dst_lookup_flow(sk, fl6, final_p, false);
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
@@ -820,6 +820,9 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
|
||||
goto skip_mkasconf;
|
||||
}
|
||||
|
||||
if (laddr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* We do not need RCU protection throughout this loop
|
||||
* because this is done under a socket lock from the
|
||||
* setsockopt call.
|
||||
|
||||
@@ -907,6 +907,14 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* always configure channel mapping, it may have been changed by the
|
||||
* user in the meantime
|
||||
*/
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
|
||||
/*
|
||||
* sizeof(ai) is used instead of sizeof(*hdmi_ai) or
|
||||
* sizeof(*dp_ai) to avoid partial match/update problems when
|
||||
@@ -918,20 +926,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx,
|
||||
"pin=%d channels=%d\n",
|
||||
pin_nid,
|
||||
channels);
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
hdmi_stop_infoframe_trans(codec, pin_nid);
|
||||
hdmi_fill_audio_infoframe(codec, pin_nid,
|
||||
ai.bytes, sizeof(ai));
|
||||
hdmi_start_infoframe_trans(codec, pin_nid);
|
||||
} else {
|
||||
/* For non-pcm audio switch, setup new channel mapping
|
||||
* accordingly */
|
||||
if (per_pin->non_pcm != non_pcm)
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
}
|
||||
|
||||
per_pin->non_pcm = non_pcm;
|
||||
|
||||
@@ -6082,6 +6082,7 @@ enum {
|
||||
ALC269_FIXUP_MIC2_MUTE_LED,
|
||||
ALC269_FIXUP_INV_DMIC,
|
||||
ALC269_FIXUP_LENOVO_DOCK,
|
||||
ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
|
||||
ALC271_FIXUP_AMIC_MIC2,
|
||||
ALC271_FIXUP_HP_GATE_MIC_JACK,
|
||||
@@ -6233,6 +6234,13 @@ static const struct alc_fixup alc269_fixups[] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
|
||||
},
|
||||
[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
},
|
||||
[ALC271_FIXUP_AMIC_MIC2] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
.v.pins = (const struct alc_pincfg[]) {
|
||||
@@ -6266,6 +6274,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
|
||||
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
@@ -6936,6 +6945,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
|
||||
SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_ASUS_MODE4),
|
||||
SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
|
||||
SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
|
||||
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
|
||||
|
||||
@@ -262,7 +262,9 @@ static int usb_stream_hwdep_mmap(struct snd_hwdep *hw,
|
||||
}
|
||||
|
||||
area->vm_ops = &usb_stream_hwdep_vm_ops;
|
||||
area->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
|
||||
area->vm_flags |= VM_DONTDUMP;
|
||||
if (!read)
|
||||
area->vm_flags |= VM_DONTEXPAND;
|
||||
area->vm_private_data = us122l;
|
||||
atomic_inc(&us122l->mmap_count);
|
||||
out:
|
||||
|
||||
@@ -299,19 +299,6 @@ static void usX2Y_error_urb_status(struct usX2Ydev *usX2Y,
|
||||
usX2Y_clients_stop(usX2Y);
|
||||
}
|
||||
|
||||
static void usX2Y_error_sequence(struct usX2Ydev *usX2Y,
|
||||
struct snd_usX2Y_substream *subs, struct urb *urb)
|
||||
{
|
||||
snd_printk(KERN_ERR
|
||||
"Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n"
|
||||
"Most probably some urb of usb-frame %i is still missing.\n"
|
||||
"Cause could be too long delays in usb-hcd interrupt handling.\n",
|
||||
usb_get_current_frame_number(usX2Y->dev),
|
||||
subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
|
||||
usX2Y->wait_iso_frame, urb->start_frame, usX2Y->wait_iso_frame);
|
||||
usX2Y_clients_stop(usX2Y);
|
||||
}
|
||||
|
||||
static void i_usX2Y_urb_complete(struct urb *urb)
|
||||
{
|
||||
struct snd_usX2Y_substream *subs = urb->context;
|
||||
@@ -328,12 +315,9 @@ static void i_usX2Y_urb_complete(struct urb *urb)
|
||||
usX2Y_error_urb_status(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
if (likely((urb->start_frame & 0xFFFF) == (usX2Y->wait_iso_frame & 0xFFFF)))
|
||||
subs->completed_urb = urb;
|
||||
else {
|
||||
usX2Y_error_sequence(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
|
||||
subs->completed_urb = urb;
|
||||
|
||||
{
|
||||
struct snd_usX2Y_substream *capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE],
|
||||
*playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
|
||||
@@ -244,13 +244,8 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb)
|
||||
usX2Y_error_urb_status(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
if (likely((urb->start_frame & 0xFFFF) == (usX2Y->wait_iso_frame & 0xFFFF)))
|
||||
subs->completed_urb = urb;
|
||||
else {
|
||||
usX2Y_error_sequence(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
|
||||
subs->completed_urb = urb;
|
||||
capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE];
|
||||
capsubs2 = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE + 2];
|
||||
playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
|
||||
Reference in New Issue
Block a user