| 1 |
diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S
|
| 2 |
index 80cac98..f812452 100644
|
| 3 |
--- a/arch/powerpc/kernel/cpu_setup_44x.S
|
| 4 |
+++ b/arch/powerpc/kernel/cpu_setup_44x.S
|
| 5 |
@@ -35,6 +35,7 @@ _GLOBAL(__setup_cpu_440grx)
|
| 6 |
_GLOBAL(__setup_cpu_460ex)
|
| 7 |
_GLOBAL(__setup_cpu_460gt)
|
| 8 |
b __init_fpu_44x
|
| 9 |
+_GLOBAL(__setup_cpu_440x5)
|
| 10 |
_GLOBAL(__setup_cpu_440gx)
|
| 11 |
_GLOBAL(__setup_cpu_440spe)
|
| 12 |
b __fixup_440A_mcheck
|
| 13 |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
|
| 14 |
index 25c273c..2b88cae 100644
|
| 15 |
--- a/arch/powerpc/kernel/cputable.c
|
| 16 |
+++ b/arch/powerpc/kernel/cputable.c
|
| 17 |
@@ -39,6 +39,7 @@ extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
|
| 18 |
extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
|
| 19 |
extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
|
| 20 |
extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
|
| 21 |
+extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec);
|
| 22 |
extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
|
| 23 |
extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
|
| 24 |
extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
|
| 25 |
@@ -1463,6 +1464,8 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
| 26 |
.cpu_user_features = COMMON_USER_BOOKE,
|
| 27 |
.icache_bsize = 32,
|
| 28 |
.dcache_bsize = 32,
|
| 29 |
+ .cpu_setup = __setup_cpu_440x5,
|
| 30 |
+ .machine_check = machine_check_440A,
|
| 31 |
.platform = "ppc440",
|
| 32 |
},
|
| 33 |
{ /* 460EX */
|
| 34 |
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c
|
| 35 |
index efb3964..c0d86e1 100644
|
| 36 |
--- a/arch/powerpc/platforms/cell/smp.c
|
| 37 |
+++ b/arch/powerpc/platforms/cell/smp.c
|
| 38 |
@@ -54,8 +54,8 @@
|
| 39 |
#endif
|
| 40 |
|
| 41 |
/*
|
| 42 |
- * The primary thread of each non-boot processor is recorded here before
|
| 43 |
- * smp init.
|
| 44 |
+ * The Primary thread of each non-boot processor was started from the OF client
|
| 45 |
+ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
|
| 46 |
*/
|
| 47 |
static cpumask_t of_spin_map;
|
| 48 |
|
| 49 |
@@ -208,11 +208,7 @@ void __init smp_init_cell(void)
|
| 50 |
/* Mark threads which are still spinning in hold loops. */
|
| 51 |
if (cpu_has_feature(CPU_FTR_SMT)) {
|
| 52 |
for_each_present_cpu(i) {
|
| 53 |
- if (i % 2 == 0)
|
| 54 |
- /*
|
| 55 |
- * Even-numbered logical cpus correspond to
|
| 56 |
- * primary threads.
|
| 57 |
- */
|
| 58 |
+ if (cpu_thread_in_core(i) == 0)
|
| 59 |
cpu_set(i, of_spin_map);
|
| 60 |
}
|
| 61 |
} else {
|
| 62 |
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
|
| 63 |
index 9d8f8c8..c9337c7 100644
|
| 64 |
--- a/arch/powerpc/platforms/pseries/smp.c
|
| 65 |
+++ b/arch/powerpc/platforms/pseries/smp.c
|
| 66 |
@@ -52,8 +52,8 @@
|
| 67 |
|
| 68 |
|
| 69 |
/*
|
| 70 |
- * The primary thread of each non-boot processor is recorded here before
|
| 71 |
- * smp init.
|
| 72 |
+ * The Primary thread of each non-boot processor was started from the OF client
|
| 73 |
+ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
|
| 74 |
*/
|
| 75 |
static cpumask_t of_spin_map;
|
| 76 |
|
| 77 |
@@ -191,8 +191,7 @@ static void __devinit smp_pSeries_kick_cpu(int nr)
|
| 78 |
static int smp_pSeries_cpu_bootable(unsigned int nr)
|
| 79 |
{
|
| 80 |
/* Special case - we inhibit secondary thread startup
|
| 81 |
- * during boot if the user requests it. Odd-numbered
|
| 82 |
- * cpus are assumed to be secondary threads.
|
| 83 |
+ * during boot if the user requests it.
|
| 84 |
*/
|
| 85 |
if (system_state < SYSTEM_RUNNING &&
|
| 86 |
cpu_has_feature(CPU_FTR_SMT) &&
|
| 87 |
@@ -229,11 +228,7 @@ static void __init smp_init_pseries(void)
|
| 88 |
/* Mark threads which are still spinning in hold loops. */
|
| 89 |
if (cpu_has_feature(CPU_FTR_SMT)) {
|
| 90 |
for_each_present_cpu(i) {
|
| 91 |
- if (i % 2 == 0)
|
| 92 |
- /*
|
| 93 |
- * Even-numbered logical cpus correspond to
|
| 94 |
- * primary threads.
|
| 95 |
- */
|
| 96 |
+ if (cpu_thread_in_core(i) == 0)
|
| 97 |
cpu_set(i, of_spin_map);
|
| 98 |
}
|
| 99 |
} else {
|
| 100 |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
|
| 101 |
index f6299cc..b24e1d0 100644
|
| 102 |
--- a/arch/powerpc/sysdev/mpic.c
|
| 103 |
+++ b/arch/powerpc/sysdev/mpic.c
|
| 104 |
@@ -1271,6 +1271,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count)
|
| 105 |
void __init mpic_init(struct mpic *mpic)
|
| 106 |
{
|
| 107 |
int i;
|
| 108 |
+ int cpu;
|
| 109 |
|
| 110 |
BUG_ON(mpic->num_sources == 0);
|
| 111 |
|
| 112 |
@@ -1313,6 +1314,11 @@ void __init mpic_init(struct mpic *mpic)
|
| 113 |
|
| 114 |
mpic_pasemi_msi_init(mpic);
|
| 115 |
|
| 116 |
+ if (mpic->flags & MPIC_PRIMARY)
|
| 117 |
+ cpu = hard_smp_processor_id();
|
| 118 |
+ else
|
| 119 |
+ cpu = 0;
|
| 120 |
+
|
| 121 |
for (i = 0; i < mpic->num_sources; i++) {
|
| 122 |
/* start with vector = source number, and masked */
|
| 123 |
u32 vecpri = MPIC_VECPRI_MASK | i |
|
| 124 |
@@ -1323,8 +1329,7 @@ void __init mpic_init(struct mpic *mpic)
|
| 125 |
continue;
|
| 126 |
/* init hw */
|
| 127 |
mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
|
| 128 |
- mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
|
| 129 |
- 1 << hard_smp_processor_id());
|
| 130 |
+ mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu);
|
| 131 |
}
|
| 132 |
|
| 133 |
/* Init spurious vector */
|
| 134 |
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
|
| 135 |
index 296ef30..c64e767 100644
|
| 136 |
--- a/arch/sparc/include/asm/uaccess_64.h
|
| 137 |
+++ b/arch/sparc/include/asm/uaccess_64.h
|
| 138 |
@@ -265,8 +265,8 @@ extern long __strnlen_user(const char __user *, long len);
|
| 139 |
|
| 140 |
#define strlen_user __strlen_user
|
| 141 |
#define strnlen_user __strnlen_user
|
| 142 |
-#define __copy_to_user_inatomic __copy_to_user
|
| 143 |
-#define __copy_from_user_inatomic __copy_from_user
|
| 144 |
+#define __copy_to_user_inatomic ___copy_to_user
|
| 145 |
+#define __copy_from_user_inatomic ___copy_from_user
|
| 146 |
|
| 147 |
#endif /* __ASSEMBLY__ */
|
| 148 |
|
| 149 |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
|
| 150 |
index 80dad76..83b4725 100644
|
| 151 |
--- a/arch/sparc64/kernel/pci.c
|
| 152 |
+++ b/arch/sparc64/kernel/pci.c
|
| 153 |
@@ -1017,6 +1017,7 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
|
| 154 |
|
| 155 |
for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
|
| 156 |
struct resource *rp = &pdev->resource[i];
|
| 157 |
+ resource_size_t aligned_end;
|
| 158 |
|
| 159 |
/* Active? */
|
| 160 |
if (!rp->flags)
|
| 161 |
@@ -1034,8 +1035,15 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
|
| 162 |
continue;
|
| 163 |
}
|
| 164 |
|
| 165 |
+ /* Align the resource end to the next page address.
|
| 166 |
+ * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1),
|
| 167 |
+ * because actually we need the address of the next byte
|
| 168 |
+ * after rp->end.
|
| 169 |
+ */
|
| 170 |
+ aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK;
|
| 171 |
+
|
| 172 |
if ((rp->start <= user_paddr) &&
|
| 173 |
- (user_paddr + user_size) <= (rp->end + 1UL))
|
| 174 |
+ (user_paddr + user_size) <= aligned_end)
|
| 175 |
break;
|
| 176 |
}
|
| 177 |
|
| 178 |
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c
|
| 179 |
index 10306e4..2df5b9b 100644
|
| 180 |
--- a/arch/sparc64/kernel/ptrace.c
|
| 181 |
+++ b/arch/sparc64/kernel/ptrace.c
|
| 182 |
@@ -1014,7 +1014,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
| 183 |
break;
|
| 184 |
|
| 185 |
case PTRACE_SETFPREGS64:
|
| 186 |
- ret = copy_regset_to_user(child, view, REGSET_FP,
|
| 187 |
+ ret = copy_regset_from_user(child, view, REGSET_FP,
|
| 188 |
0 * sizeof(u64),
|
| 189 |
33 * sizeof(u64),
|
| 190 |
fps);
|
| 191 |
diff --git a/arch/sparc64/kernel/visemul.c b/arch/sparc64/kernel/visemul.c
|
| 192 |
index c3fd647..a4428fd 100644
|
| 193 |
--- a/arch/sparc64/kernel/visemul.c
|
| 194 |
+++ b/arch/sparc64/kernel/visemul.c
|
| 195 |
@@ -131,7 +131,7 @@
|
| 196 |
#define VIS_OPF_SHIFT 5
|
| 197 |
#define VIS_OPF_MASK (0x1ff << VIS_OPF_SHIFT)
|
| 198 |
|
| 199 |
-#define RS1(INSN) (((INSN) >> 24) & 0x1f)
|
| 200 |
+#define RS1(INSN) (((INSN) >> 14) & 0x1f)
|
| 201 |
#define RS2(INSN) (((INSN) >> 0) & 0x1f)
|
| 202 |
#define RD(INSN) (((INSN) >> 25) & 0x1f)
|
| 203 |
|
| 204 |
@@ -445,7 +445,7 @@ static void pdist(struct pt_regs *regs, unsigned int insn)
|
| 205 |
unsigned long i;
|
| 206 |
|
| 207 |
rs1 = fpd_regval(f, RS1(insn));
|
| 208 |
- rs2 = fpd_regval(f, RS1(insn));
|
| 209 |
+ rs2 = fpd_regval(f, RS2(insn));
|
| 210 |
rd = fpd_regaddr(f, RD(insn));
|
| 211 |
|
| 212 |
rd_val = *rd;
|
| 213 |
@@ -807,6 +807,8 @@ int vis_emul(struct pt_regs *regs, unsigned int insn)
|
| 214 |
if (get_user(insn, (u32 __user *) pc))
|
| 215 |
return -EFAULT;
|
| 216 |
|
| 217 |
+ save_and_clear_fpu();
|
| 218 |
+
|
| 219 |
opf = (insn & VIS_OPF_MASK) >> VIS_OPF_SHIFT;
|
| 220 |
switch (opf) {
|
| 221 |
default:
|
| 222 |
diff --git a/arch/sparc64/lib/user_fixup.c b/arch/sparc64/lib/user_fixup.c
|
| 223 |
index 19d1fdb..05a361b 100644
|
| 224 |
--- a/arch/sparc64/lib/user_fixup.c
|
| 225 |
+++ b/arch/sparc64/lib/user_fixup.c
|
| 226 |
@@ -24,7 +24,7 @@ static unsigned long compute_size(unsigned long start, unsigned long size, unsig
|
| 227 |
if (fault_addr < start || fault_addr >= end) {
|
| 228 |
*offset = 0;
|
| 229 |
} else {
|
| 230 |
- *offset = start - fault_addr;
|
| 231 |
+ *offset = fault_addr - start;
|
| 232 |
size = end - fault_addr;
|
| 233 |
}
|
| 234 |
return size;
|
| 235 |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
|
| 236 |
index 19d579d..8f44ebb 100644
|
| 237 |
--- a/arch/um/drivers/mconsole_kern.c
|
| 238 |
+++ b/arch/um/drivers/mconsole_kern.c
|
| 239 |
@@ -16,6 +16,8 @@
|
| 240 |
#include <linux/slab.h>
|
| 241 |
#include <linux/syscalls.h>
|
| 242 |
#include <linux/utsname.h>
|
| 243 |
+#include <linux/socket.h>
|
| 244 |
+#include <linux/un.h>
|
| 245 |
#include <linux/workqueue.h>
|
| 246 |
#include <linux/mutex.h>
|
| 247 |
#include <asm/uaccess.h>
|
| 248 |
@@ -785,7 +787,7 @@ static int __init mconsole_init(void)
|
| 249 |
/* long to avoid size mismatch warnings from gcc */
|
| 250 |
long sock;
|
| 251 |
int err;
|
| 252 |
- char file[256];
|
| 253 |
+ char file[UNIX_PATH_MAX];
|
| 254 |
|
| 255 |
if (umid_file_name("mconsole", file, sizeof(file)))
|
| 256 |
return -1;
|
| 257 |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
|
| 258 |
index 73deaff..759e8da 100644
|
| 259 |
--- a/arch/x86/kernel/hpet.c
|
| 260 |
+++ b/arch/x86/kernel/hpet.c
|
| 261 |
@@ -283,7 +283,7 @@ static int hpet_legacy_next_event(unsigned long delta,
|
| 262 |
* what we wrote hit the chip before we compare it to the
|
| 263 |
* counter.
|
| 264 |
*/
|
| 265 |
- WARN_ON((u32)hpet_readl(HPET_T0_CMP) != cnt);
|
| 266 |
+ WARN_ON_ONCE((u32)hpet_readl(HPET_T0_CMP) != cnt);
|
| 267 |
|
| 268 |
return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
|
| 269 |
}
|
| 270 |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
|
| 271 |
index d3746ef..1adbb3e 100644
|
| 272 |
--- a/arch/x86/mm/init_64.c
|
| 273 |
+++ b/arch/x86/mm/init_64.c
|
| 274 |
@@ -721,12 +721,12 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
| 275 |
unsigned long nr_pages = size >> PAGE_SHIFT;
|
| 276 |
int ret;
|
| 277 |
|
| 278 |
- last_mapped_pfn = init_memory_mapping(start, start + size-1);
|
| 279 |
+ last_mapped_pfn = init_memory_mapping(start, start + size);
|
| 280 |
if (last_mapped_pfn > max_pfn_mapped)
|
| 281 |
max_pfn_mapped = last_mapped_pfn;
|
| 282 |
|
| 283 |
ret = __add_pages(zone, start_pfn, nr_pages);
|
| 284 |
- WARN_ON(1);
|
| 285 |
+ WARN_ON_ONCE(ret);
|
| 286 |
|
| 287 |
return ret;
|
| 288 |
}
|
| 289 |
diff --git a/block/bsg.c b/block/bsg.c
|
| 290 |
index 0aae8d7..9cfbea8 100644
|
| 291 |
--- a/block/bsg.c
|
| 292 |
+++ b/block/bsg.c
|
| 293 |
@@ -202,6 +202,8 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
|
| 294 |
rq->timeout = q->sg_timeout;
|
| 295 |
if (!rq->timeout)
|
| 296 |
rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
|
| 297 |
+ if (rq->timeout < BLK_MIN_SG_TIMEOUT)
|
| 298 |
+ rq->timeout = BLK_MIN_SG_TIMEOUT;
|
| 299 |
|
| 300 |
return 0;
|
| 301 |
}
|
| 302 |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
|
| 303 |
index ec4b7f2..dd3281a 100644
|
| 304 |
--- a/block/scsi_ioctl.c
|
| 305 |
+++ b/block/scsi_ioctl.c
|
| 306 |
@@ -208,6 +208,8 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
|
| 307 |
rq->timeout = q->sg_timeout;
|
| 308 |
if (!rq->timeout)
|
| 309 |
rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
|
| 310 |
+ if (rq->timeout < BLK_MIN_SG_TIMEOUT)
|
| 311 |
+ rq->timeout = BLK_MIN_SG_TIMEOUT;
|
| 312 |
|
| 313 |
return 0;
|
| 314 |
}
|
| 315 |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
|
| 316 |
index 235a138..b0d40aa 100644
|
| 317 |
--- a/drivers/acpi/osl.c
|
| 318 |
+++ b/drivers/acpi/osl.c
|
| 319 |
@@ -1261,34 +1261,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
|
| 320 |
return (AE_OK);
|
| 321 |
}
|
| 322 |
|
| 323 |
-/**
|
| 324 |
- * acpi_dmi_dump - dump DMI slots needed for blacklist entry
|
| 325 |
- *
|
| 326 |
- * Returns 0 on success
|
| 327 |
- */
|
| 328 |
-static int acpi_dmi_dump(void)
|
| 329 |
-{
|
| 330 |
-
|
| 331 |
- if (!dmi_available)
|
| 332 |
- return -1;
|
| 333 |
-
|
| 334 |
- printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
|
| 335 |
- dmi_get_system_info(DMI_SYS_VENDOR));
|
| 336 |
- printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
|
| 337 |
- dmi_get_system_info(DMI_PRODUCT_NAME));
|
| 338 |
- printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
|
| 339 |
- dmi_get_system_info(DMI_PRODUCT_VERSION));
|
| 340 |
- printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
|
| 341 |
- dmi_get_system_info(DMI_BOARD_NAME));
|
| 342 |
- printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
|
| 343 |
- dmi_get_system_info(DMI_BIOS_VENDOR));
|
| 344 |
- printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
|
| 345 |
- dmi_get_system_info(DMI_BIOS_DATE));
|
| 346 |
-
|
| 347 |
- return 0;
|
| 348 |
-}
|
| 349 |
-
|
| 350 |
-
|
| 351 |
/******************************************************************************
|
| 352 |
*
|
| 353 |
* FUNCTION: acpi_os_validate_interface
|
| 354 |
@@ -1315,14 +1287,6 @@ acpi_os_validate_interface (char *interface)
|
| 355 |
osi_linux.cmdline ? " via cmdline" :
|
| 356 |
osi_linux.dmi ? " via DMI" : "");
|
| 357 |
|
| 358 |
- if (!osi_linux.dmi) {
|
| 359 |
- if (acpi_dmi_dump())
|
| 360 |
- printk(KERN_NOTICE PREFIX
|
| 361 |
- "[please extract dmidecode output]\n");
|
| 362 |
- printk(KERN_NOTICE PREFIX
|
| 363 |
- "Please send DMI info above to "
|
| 364 |
- "linux-acpi@vger.kernel.org\n");
|
| 365 |
- }
|
| 366 |
if (!osi_linux.known && !osi_linux.cmdline) {
|
| 367 |
printk(KERN_NOTICE PREFIX
|
| 368 |
"If \"acpi_osi=%sLinux\" works better, "
|
| 369 |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
|
| 370 |
index 4751909..3706469 100644
|
| 371 |
--- a/drivers/acpi/sleep/main.c
|
| 372 |
+++ b/drivers/acpi/sleep/main.c
|
| 373 |
@@ -60,6 +60,18 @@ void __init acpi_old_suspend_ordering(void)
|
| 374 |
old_suspend_ordering = true;
|
| 375 |
}
|
| 376 |
|
| 377 |
+/*
|
| 378 |
+ * According to the ACPI specification the BIOS should make sure that ACPI is
|
| 379 |
+ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
|
| 380 |
+ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
|
| 381 |
+ * on such systems during resume. Unfortunately that doesn't help in
|
| 382 |
+ * particularly pathological cases in which SCI_EN has to be set directly on
|
| 383 |
+ * resume, although the specification states very clearly that this flag is
|
| 384 |
+ * owned by the hardware. The set_sci_en_on_resume variable will be set in such
|
| 385 |
+ * cases.
|
| 386 |
+ */
|
| 387 |
+static bool set_sci_en_on_resume;
|
| 388 |
+
|
| 389 |
/**
|
| 390 |
* acpi_pm_disable_gpes - Disable the GPEs.
|
| 391 |
*/
|
| 392 |
@@ -201,7 +213,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
|
| 393 |
}
|
| 394 |
|
| 395 |
/* If ACPI is not enabled by the BIOS, we need to enable it here. */
|
| 396 |
- acpi_enable();
|
| 397 |
+ if (set_sci_en_on_resume)
|
| 398 |
+ acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1);
|
| 399 |
+ else
|
| 400 |
+ acpi_enable();
|
| 401 |
+
|
| 402 |
/* Reprogram control registers and execute _BFS */
|
| 403 |
acpi_leave_sleep_state_prep(acpi_state);
|
| 404 |
|
| 405 |
@@ -289,6 +305,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
|
| 406 |
return 0;
|
| 407 |
}
|
| 408 |
|
| 409 |
+static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d)
|
| 410 |
+{
|
| 411 |
+ set_sci_en_on_resume = true;
|
| 412 |
+ return 0;
|
| 413 |
+}
|
| 414 |
+
|
| 415 |
static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
|
| 416 |
{
|
| 417 |
.callback = init_old_suspend_ordering,
|
| 418 |
@@ -306,6 +328,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
|
| 419 |
DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
|
| 420 |
},
|
| 421 |
},
|
| 422 |
+ {
|
| 423 |
+ .callback = init_set_sci_en_on_resume,
|
| 424 |
+ .ident = "Apple MacBook 1,1",
|
| 425 |
+ .matches = {
|
| 426 |
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
|
| 427 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
|
| 428 |
+ },
|
| 429 |
+ },
|
| 430 |
+ {
|
| 431 |
+ .callback = init_set_sci_en_on_resume,
|
| 432 |
+ .ident = "Apple MacMini 1,1",
|
| 433 |
+ .matches = {
|
| 434 |
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
|
| 435 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
|
| 436 |
+ },
|
| 437 |
+ },
|
| 438 |
{},
|
| 439 |
};
|
| 440 |
#endif /* CONFIG_SUSPEND */
|
| 441 |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
|
| 442 |
index 2a4c516..bb26a26 100644
|
| 443 |
--- a/drivers/ata/libata-sff.c
|
| 444 |
+++ b/drivers/ata/libata-sff.c
|
| 445 |
@@ -1227,10 +1227,19 @@ fsm_start:
|
| 446 |
/* ATA PIO protocol */
|
| 447 |
if (unlikely((status & ATA_DRQ) == 0)) {
|
| 448 |
/* handle BSY=0, DRQ=0 as error */
|
| 449 |
- if (likely(status & (ATA_ERR | ATA_DF)))
|
| 450 |
+ if (likely(status & (ATA_ERR | ATA_DF))) {
|
| 451 |
/* device stops HSM for abort/error */
|
| 452 |
qc->err_mask |= AC_ERR_DEV;
|
| 453 |
- else {
|
| 454 |
+
|
| 455 |
+ /* If diagnostic failed and this is
|
| 456 |
+ * IDENTIFY, it's likely a phantom
|
| 457 |
+ * device. Mark hint.
|
| 458 |
+ */
|
| 459 |
+ if (qc->dev->horkage &
|
| 460 |
+ ATA_HORKAGE_DIAGNOSTIC)
|
| 461 |
+ qc->err_mask |=
|
| 462 |
+ AC_ERR_NODEV_HINT;
|
| 463 |
+ } else {
|
| 464 |
/* HSM violation. Let EH handle this.
|
| 465 |
* Phantom devices also trigger this
|
| 466 |
* condition. Mark hint.
|
| 467 |
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c
|
| 468 |
index 31d08b6..b899d91 100644
|
| 469 |
--- a/drivers/char/applicom.c
|
| 470 |
+++ b/drivers/char/applicom.c
|
| 471 |
@@ -712,8 +712,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
|
| 472 |
|
| 473 |
IndexCard = adgl->num_card-1;
|
| 474 |
|
| 475 |
- if(cmd != 0 && cmd != 6 &&
|
| 476 |
- ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
|
| 477 |
+ if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
|
| 478 |
static int warncount = 10;
|
| 479 |
if (warncount) {
|
| 480 |
printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1);
|
| 481 |
@@ -832,8 +831,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
|
| 482 |
}
|
| 483 |
break;
|
| 484 |
default:
|
| 485 |
- printk(KERN_INFO "APPLICOM driver ioctl, unknown function code %d\n",cmd) ;
|
| 486 |
- ret = -EINVAL;
|
| 487 |
+ ret = -ENOTTY;
|
| 488 |
break;
|
| 489 |
}
|
| 490 |
Dummy = readb(apbs[IndexCard].RamIO + VERS);
|
| 491 |
diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
|
| 492 |
index 887072f..cd2e3b8 100644
|
| 493 |
--- a/drivers/edac/cell_edac.c
|
| 494 |
+++ b/drivers/edac/cell_edac.c
|
| 495 |
@@ -9,6 +9,7 @@
|
| 496 |
*/
|
| 497 |
#undef DEBUG
|
| 498 |
|
| 499 |
+#include <linux/edac.h>
|
| 500 |
#include <linux/module.h>
|
| 501 |
#include <linux/init.h>
|
| 502 |
#include <linux/platform_device.h>
|
| 503 |
@@ -164,6 +165,8 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
|
| 504 |
if (regs == NULL)
|
| 505 |
return -ENODEV;
|
| 506 |
|
| 507 |
+ edac_op_state = EDAC_OPSTATE_POLL;
|
| 508 |
+
|
| 509 |
/* Get channel population */
|
| 510 |
reg = in_be64(®s->mic_mnt_cfg);
|
| 511 |
dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg);
|
| 512 |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
|
| 513 |
index 49144cb..e87956a 100644
|
| 514 |
--- a/drivers/hid/usbhid/hid-quirks.c
|
| 515 |
+++ b/drivers/hid/usbhid/hid-quirks.c
|
| 516 |
@@ -83,6 +83,7 @@
|
| 517 |
#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232
|
| 518 |
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
| 519 |
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
| 520 |
+#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
| 521 |
#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
| 522 |
|
| 523 |
#define USB_VENDOR_ID_ASUS 0x0b05
|
| 524 |
@@ -458,6 +459,7 @@ static const struct hid_blacklist {
|
| 525 |
{ USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL },
|
| 526 |
|
| 527 |
{ USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
|
| 528 |
+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
|
| 529 |
{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
|
| 530 |
{ USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
|
| 531 |
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
|
| 532 |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
|
| 533 |
index 5aafe24..29e6863 100644
|
| 534 |
--- a/drivers/input/serio/i8042-x86ia64io.h
|
| 535 |
+++ b/drivers/input/serio/i8042-x86ia64io.h
|
| 536 |
@@ -135,6 +135,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
|
| 537 |
DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
|
| 538 |
},
|
| 539 |
},
|
| 540 |
+ {
|
| 541 |
+ .ident = "Blue FB5601",
|
| 542 |
+ .matches = {
|
| 543 |
+ DMI_MATCH(DMI_SYS_VENDOR, "blue"),
|
| 544 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
|
| 545 |
+ DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
|
| 546 |
+ },
|
| 547 |
+ },
|
| 548 |
{ }
|
| 549 |
};
|
| 550 |
|
| 551 |
@@ -322,6 +330,27 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
|
| 552 |
DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
|
| 553 |
},
|
| 554 |
},
|
| 555 |
+ {
|
| 556 |
+ .ident = "IBM 2656",
|
| 557 |
+ .matches = {
|
| 558 |
+ DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
|
| 559 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
|
| 560 |
+ },
|
| 561 |
+ },
|
| 562 |
+ {
|
| 563 |
+ .ident = "Dell XPS M1530",
|
| 564 |
+ .matches = {
|
| 565 |
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
| 566 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
|
| 567 |
+ },
|
| 568 |
+ },
|
| 569 |
+ {
|
| 570 |
+ .ident = "Compal HEL80I",
|
| 571 |
+ .matches = {
|
| 572 |
+ DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
|
| 573 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
|
| 574 |
+ },
|
| 575 |
+ },
|
| 576 |
{ }
|
| 577 |
};
|
| 578 |
|
| 579 |
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h
|
| 580 |
index 2711404..b1a694b 100644
|
| 581 |
--- a/drivers/net/cxgb3/adapter.h
|
| 582 |
+++ b/drivers/net/cxgb3/adapter.h
|
| 583 |
@@ -285,6 +285,7 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_status,
|
| 584 |
|
| 585 |
void t3_sge_start(struct adapter *adap);
|
| 586 |
void t3_sge_stop(struct adapter *adap);
|
| 587 |
+void t3_stop_sge_timers(struct adapter *adap);
|
| 588 |
void t3_free_sge_resources(struct adapter *adap);
|
| 589 |
void t3_sge_err_intr_handler(struct adapter *adapter);
|
| 590 |
irq_handler_t t3_intr_handler(struct adapter *adap, int polling);
|
| 591 |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c
|
| 592 |
index 5447f3e..d355c82 100644
|
| 593 |
--- a/drivers/net/cxgb3/cxgb3_main.c
|
| 594 |
+++ b/drivers/net/cxgb3/cxgb3_main.c
|
| 595 |
@@ -479,6 +479,7 @@ static int setup_sge_qsets(struct adapter *adap)
|
| 596 |
irq_idx,
|
| 597 |
&adap->params.sge.qset[qset_idx], ntxq, dev);
|
| 598 |
if (err) {
|
| 599 |
+ t3_stop_sge_timers(adap);
|
| 600 |
t3_free_sge_resources(adap);
|
| 601 |
return err;
|
| 602 |
}
|
| 603 |
@@ -2449,6 +2450,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev,
|
| 604 |
test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map))
|
| 605 |
offload_close(&adapter->tdev);
|
| 606 |
|
| 607 |
+ /* Stop SGE timers */
|
| 608 |
+ t3_stop_sge_timers(adapter);
|
| 609 |
+
|
| 610 |
adapter->flags &= ~FULL_INIT_DONE;
|
| 611 |
|
| 612 |
pci_disable_device(pdev);
|
| 613 |
@@ -2801,6 +2805,7 @@ static void __devexit remove_one(struct pci_dev *pdev)
|
| 614 |
if (test_bit(i, &adapter->registered_device_map))
|
| 615 |
unregister_netdev(adapter->port[i]);
|
| 616 |
|
| 617 |
+ t3_stop_sge_timers(adapter);
|
| 618 |
t3_free_sge_resources(adapter);
|
| 619 |
cxgb_disable_msi(adapter);
|
| 620 |
|
| 621 |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
|
| 622 |
index 1b0861d..52f4138 100644
|
| 623 |
--- a/drivers/net/cxgb3/sge.c
|
| 624 |
+++ b/drivers/net/cxgb3/sge.c
|
| 625 |
@@ -603,9 +603,6 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
|
| 626 |
int i;
|
| 627 |
struct pci_dev *pdev = adapter->pdev;
|
| 628 |
|
| 629 |
- if (q->tx_reclaim_timer.function)
|
| 630 |
- del_timer_sync(&q->tx_reclaim_timer);
|
| 631 |
-
|
| 632 |
for (i = 0; i < SGE_RXQ_PER_SET; ++i)
|
| 633 |
if (q->fl[i].desc) {
|
| 634 |
spin_lock_irq(&adapter->sge.reg_lock);
|
| 635 |
@@ -1937,38 +1934,6 @@ static inline int lro_frame_ok(const struct cpl_rx_pkt *p)
|
| 636 |
eh->h_proto == htons(ETH_P_IP) && ih->ihl == (sizeof(*ih) >> 2);
|
| 637 |
}
|
| 638 |
|
| 639 |
-#define TCP_FLAG_MASK (TCP_FLAG_CWR | TCP_FLAG_ECE | TCP_FLAG_URG |\
|
| 640 |
- TCP_FLAG_ACK | TCP_FLAG_PSH | TCP_FLAG_RST |\
|
| 641 |
- TCP_FLAG_SYN | TCP_FLAG_FIN)
|
| 642 |
-#define TSTAMP_WORD ((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |\
|
| 643 |
- (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)
|
| 644 |
-
|
| 645 |
-/**
|
| 646 |
- * lro_segment_ok - check if a TCP segment is eligible for LRO
|
| 647 |
- * @tcph: the TCP header of the packet
|
| 648 |
- *
|
| 649 |
- * Returns true if a TCP packet is eligible for LRO. This requires that
|
| 650 |
- * the packet have only the ACK flag set and no TCP options besides
|
| 651 |
- * time stamps.
|
| 652 |
- */
|
| 653 |
-static inline int lro_segment_ok(const struct tcphdr *tcph)
|
| 654 |
-{
|
| 655 |
- int optlen;
|
| 656 |
-
|
| 657 |
- if (unlikely((tcp_flag_word(tcph) & TCP_FLAG_MASK) != TCP_FLAG_ACK))
|
| 658 |
- return 0;
|
| 659 |
-
|
| 660 |
- optlen = (tcph->doff << 2) - sizeof(*tcph);
|
| 661 |
- if (optlen) {
|
| 662 |
- const u32 *opt = (const u32 *)(tcph + 1);
|
| 663 |
-
|
| 664 |
- if (optlen != TCPOLEN_TSTAMP_ALIGNED ||
|
| 665 |
- *opt != htonl(TSTAMP_WORD) || !opt[2])
|
| 666 |
- return 0;
|
| 667 |
- }
|
| 668 |
- return 1;
|
| 669 |
-}
|
| 670 |
-
|
| 671 |
static int t3_get_lro_header(void **eh, void **iph, void **tcph,
|
| 672 |
u64 *hdr_flags, void *priv)
|
| 673 |
{
|
| 674 |
@@ -1981,9 +1946,6 @@ static int t3_get_lro_header(void **eh, void **iph, void **tcph,
|
| 675 |
*iph = (struct iphdr *)((struct ethhdr *)*eh + 1);
|
| 676 |
*tcph = (struct tcphdr *)((struct iphdr *)*iph + 1);
|
| 677 |
|
| 678 |
- if (!lro_segment_ok(*tcph))
|
| 679 |
- return -1;
|
| 680 |
-
|
| 681 |
*hdr_flags = LRO_IPV4 | LRO_TCP;
|
| 682 |
return 0;
|
| 683 |
}
|
| 684 |
@@ -3043,6 +3005,24 @@ err:
|
| 685 |
}
|
| 686 |
|
| 687 |
/**
|
| 688 |
+ * t3_stop_sge_timers - stop SGE timer call backs
|
| 689 |
+ * @adap: the adapter
|
| 690 |
+ *
|
| 691 |
+ * Stops each SGE queue set's timer call back
|
| 692 |
+ */
|
| 693 |
+void t3_stop_sge_timers(struct adapter *adap)
|
| 694 |
+{
|
| 695 |
+ int i;
|
| 696 |
+
|
| 697 |
+ for (i = 0; i < SGE_QSETS; ++i) {
|
| 698 |
+ struct sge_qset *q = &adap->sge.qs[i];
|
| 699 |
+
|
| 700 |
+ if (q->tx_reclaim_timer.function)
|
| 701 |
+ del_timer_sync(&q->tx_reclaim_timer);
|
| 702 |
+ }
|
| 703 |
+}
|
| 704 |
+
|
| 705 |
+/**
|
| 706 |
* t3_free_sge_resources - free SGE resources
|
| 707 |
* @adap: the adapter
|
| 708 |
*
|
| 709 |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c
|
| 710 |
index e3be81e..6f9809e 100644
|
| 711 |
--- a/drivers/net/niu.c
|
| 712 |
+++ b/drivers/net/niu.c
|
| 713 |
@@ -51,8 +51,7 @@ MODULE_VERSION(DRV_MODULE_VERSION);
|
| 714 |
#ifndef readq
|
| 715 |
static u64 readq(void __iomem *reg)
|
| 716 |
{
|
| 717 |
- return (((u64)readl(reg + 0x4UL) << 32) |
|
| 718 |
- (u64)readl(reg));
|
| 719 |
+ return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
|
| 720 |
}
|
| 721 |
|
| 722 |
static void writeq(u64 val, void __iomem *reg)
|
| 723 |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
|
| 724 |
index ff175e8..de80ba4 100644
|
| 725 |
--- a/drivers/net/pppol2tp.c
|
| 726 |
+++ b/drivers/net/pppol2tp.c
|
| 727 |
@@ -1353,6 +1353,7 @@ static int pppol2tp_release(struct socket *sock)
|
| 728 |
kfree_skb(skb);
|
| 729 |
sock_put(sk);
|
| 730 |
}
|
| 731 |
+ sock_put(sk);
|
| 732 |
}
|
| 733 |
|
| 734 |
release_sock(sk);
|
| 735 |
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
|
| 736 |
index 851f5b8..aa6fda1 100644
|
| 737 |
--- a/drivers/pci/pcie/aspm.c
|
| 738 |
+++ b/drivers/pci/pcie/aspm.c
|
| 739 |
@@ -16,6 +16,7 @@
|
| 740 |
#include <linux/pm.h>
|
| 741 |
#include <linux/init.h>
|
| 742 |
#include <linux/slab.h>
|
| 743 |
+#include <linux/jiffies.h>
|
| 744 |
#include <linux/pci-aspm.h>
|
| 745 |
#include "../pci.h"
|
| 746 |
|
| 747 |
@@ -161,11 +162,12 @@ static void pcie_check_clock_pm(struct pci_dev *pdev)
|
| 748 |
*/
|
| 749 |
static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
|
| 750 |
{
|
| 751 |
- int pos, child_pos;
|
| 752 |
+ int pos, child_pos, i = 0;
|
| 753 |
u16 reg16 = 0;
|
| 754 |
struct pci_dev *child_dev;
|
| 755 |
int same_clock = 1;
|
| 756 |
-
|
| 757 |
+ unsigned long start_jiffies;
|
| 758 |
+ u16 child_regs[8], parent_reg;
|
| 759 |
/*
|
| 760 |
* all functions of a slot should have the same Slot Clock
|
| 761 |
* Configuration, so just check one function
|
| 762 |
@@ -191,16 +193,19 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
|
| 763 |
child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
| 764 |
pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
|
| 765 |
®16);
|
| 766 |
+ child_regs[i] = reg16;
|
| 767 |
if (same_clock)
|
| 768 |
reg16 |= PCI_EXP_LNKCTL_CCC;
|
| 769 |
else
|
| 770 |
reg16 &= ~PCI_EXP_LNKCTL_CCC;
|
| 771 |
pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
|
| 772 |
reg16);
|
| 773 |
+ i++;
|
| 774 |
}
|
| 775 |
|
| 776 |
/* Configure upstream component */
|
| 777 |
pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16);
|
| 778 |
+ parent_reg = reg16;
|
| 779 |
if (same_clock)
|
| 780 |
reg16 |= PCI_EXP_LNKCTL_CCC;
|
| 781 |
else
|
| 782 |
@@ -212,12 +217,30 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
|
| 783 |
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
| 784 |
|
| 785 |
/* Wait for link training end */
|
| 786 |
- while (1) {
|
| 787 |
+ /* break out after waiting for 1 second */
|
| 788 |
+ start_jiffies = jiffies;
|
| 789 |
+ while ((jiffies - start_jiffies) < HZ) {
|
| 790 |
pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16);
|
| 791 |
if (!(reg16 & PCI_EXP_LNKSTA_LT))
|
| 792 |
break;
|
| 793 |
cpu_relax();
|
| 794 |
}
|
| 795 |
+ /* training failed -> recover */
|
| 796 |
+ if ((jiffies - start_jiffies) >= HZ) {
|
| 797 |
+ dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure"
|
| 798 |
+ " common clock\n");
|
| 799 |
+ i = 0;
|
| 800 |
+ list_for_each_entry(child_dev, &pdev->subordinate->devices,
|
| 801 |
+ bus_list) {
|
| 802 |
+ child_pos = pci_find_capability(child_dev,
|
| 803 |
+ PCI_CAP_ID_EXP);
|
| 804 |
+ pci_write_config_word(child_dev,
|
| 805 |
+ child_pos + PCI_EXP_LNKCTL,
|
| 806 |
+ child_regs[i]);
|
| 807 |
+ i++;
|
| 808 |
+ }
|
| 809 |
+ pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, parent_reg);
|
| 810 |
+ }
|
| 811 |
}
|
| 812 |
|
| 813 |
/*
|
| 814 |
diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c
|
| 815 |
index b703b09..e423fd9 100644
|
| 816 |
--- a/drivers/pci/slot.c
|
| 817 |
+++ b/drivers/pci/slot.c
|
| 818 |
@@ -243,6 +243,7 @@ placeholder:
|
| 819 |
__func__, pci_domain_nr(parent), parent->number, slot_nr);
|
| 820 |
|
| 821 |
out:
|
| 822 |
+ kfree(slot_name);
|
| 823 |
up_write(&pci_bus_sem);
|
| 824 |
return slot;
|
| 825 |
err:
|
| 826 |
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
|
| 827 |
index 9fd7bb9..7cc7bf5 100644
|
| 828 |
--- a/drivers/pnp/base.h
|
| 829 |
+++ b/drivers/pnp/base.h
|
| 830 |
@@ -147,7 +147,7 @@ char *pnp_resource_type_name(struct resource *res);
|
| 831 |
void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc);
|
| 832 |
|
| 833 |
void pnp_free_resources(struct pnp_dev *dev);
|
| 834 |
-int pnp_resource_type(struct resource *res);
|
| 835 |
+unsigned long pnp_resource_type(struct resource *res);
|
| 836 |
|
| 837 |
struct pnp_resource {
|
| 838 |
struct list_head list;
|
| 839 |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
|
| 840 |
index 0bdf9b8..d15e2b7 100644
|
| 841 |
--- a/drivers/pnp/quirks.c
|
| 842 |
+++ b/drivers/pnp/quirks.c
|
| 843 |
@@ -245,7 +245,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
|
| 844 |
*/
|
| 845 |
for_each_pci_dev(pdev) {
|
| 846 |
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
| 847 |
- unsigned int type;
|
| 848 |
+ unsigned long type;
|
| 849 |
|
| 850 |
type = pci_resource_flags(pdev, i) &
|
| 851 |
(IORESOURCE_IO | IORESOURCE_MEM);
|
| 852 |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c
|
| 853 |
index 4cfe3a1..dbae23a 100644
|
| 854 |
--- a/drivers/pnp/resource.c
|
| 855 |
+++ b/drivers/pnp/resource.c
|
| 856 |
@@ -467,14 +467,14 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)
|
| 857 |
#endif
|
| 858 |
}
|
| 859 |
|
| 860 |
-int pnp_resource_type(struct resource *res)
|
| 861 |
+unsigned long pnp_resource_type(struct resource *res)
|
| 862 |
{
|
| 863 |
return res->flags & (IORESOURCE_IO | IORESOURCE_MEM |
|
| 864 |
IORESOURCE_IRQ | IORESOURCE_DMA);
|
| 865 |
}
|
| 866 |
|
| 867 |
struct resource *pnp_get_resource(struct pnp_dev *dev,
|
| 868 |
- unsigned int type, unsigned int num)
|
| 869 |
+ unsigned long type, unsigned int num)
|
| 870 |
{
|
| 871 |
struct pnp_resource *pnp_res;
|
| 872 |
struct resource *res;
|
| 873 |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
|
| 874 |
index e5e0cfe..bdc4d4e 100644
|
| 875 |
--- a/drivers/spi/spidev.c
|
| 876 |
+++ b/drivers/spi/spidev.c
|
| 877 |
@@ -598,7 +598,9 @@ static int spidev_probe(struct spi_device *spi)
|
| 878 |
}
|
| 879 |
mutex_unlock(&device_list_lock);
|
| 880 |
|
| 881 |
- if (status != 0)
|
| 882 |
+ if (status == 0)
|
| 883 |
+ spi_set_drvdata(spi, spidev);
|
| 884 |
+ else
|
| 885 |
kfree(spidev);
|
| 886 |
|
| 887 |
return status;
|
| 888 |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
| 889 |
index 73f8277..b205311 100644
|
| 890 |
--- a/drivers/usb/serial/option.c
|
| 891 |
+++ b/drivers/usb/serial/option.c
|
| 892 |
@@ -79,38 +79,36 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
|
| 893 |
#define OPTION_PRODUCT_VIPER 0x6600
|
| 894 |
#define OPTION_PRODUCT_VIPER_BUS 0x6601
|
| 895 |
#define OPTION_PRODUCT_GT_MAX_READY 0x6701
|
| 896 |
-#define OPTION_PRODUCT_GT_MAX 0x6711
|
| 897 |
#define OPTION_PRODUCT_FUJI_MODEM_LIGHT 0x6721
|
| 898 |
#define OPTION_PRODUCT_FUJI_MODEM_GT 0x6741
|
| 899 |
#define OPTION_PRODUCT_FUJI_MODEM_EX 0x6761
|
| 900 |
-#define OPTION_PRODUCT_FUJI_NETWORK_LIGHT 0x6731
|
| 901 |
-#define OPTION_PRODUCT_FUJI_NETWORK_GT 0x6751
|
| 902 |
-#define OPTION_PRODUCT_FUJI_NETWORK_EX 0x6771
|
| 903 |
#define OPTION_PRODUCT_KOI_MODEM 0x6800
|
| 904 |
-#define OPTION_PRODUCT_KOI_NETWORK 0x6811
|
| 905 |
#define OPTION_PRODUCT_SCORPION_MODEM 0x6901
|
| 906 |
-#define OPTION_PRODUCT_SCORPION_NETWORK 0x6911
|
| 907 |
#define OPTION_PRODUCT_ETNA_MODEM 0x7001
|
| 908 |
-#define OPTION_PRODUCT_ETNA_NETWORK 0x7011
|
| 909 |
#define OPTION_PRODUCT_ETNA_MODEM_LITE 0x7021
|
| 910 |
#define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041
|
| 911 |
#define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061
|
| 912 |
-#define OPTION_PRODUCT_ETNA_NETWORK_LITE 0x7031
|
| 913 |
-#define OPTION_PRODUCT_ETNA_NETWORK_GT 0x7051
|
| 914 |
-#define OPTION_PRODUCT_ETNA_NETWORK_EX 0x7071
|
| 915 |
#define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100
|
| 916 |
-#define OPTION_PRODUCT_ETNA_KOI_NETWORK 0x7111
|
| 917 |
|
| 918 |
#define HUAWEI_VENDOR_ID 0x12D1
|
| 919 |
#define HUAWEI_PRODUCT_E600 0x1001
|
| 920 |
#define HUAWEI_PRODUCT_E220 0x1003
|
| 921 |
#define HUAWEI_PRODUCT_E220BIS 0x1004
|
| 922 |
#define HUAWEI_PRODUCT_E1401 0x1401
|
| 923 |
+#define HUAWEI_PRODUCT_E1402 0x1402
|
| 924 |
#define HUAWEI_PRODUCT_E1403 0x1403
|
| 925 |
+#define HUAWEI_PRODUCT_E1404 0x1404
|
| 926 |
#define HUAWEI_PRODUCT_E1405 0x1405
|
| 927 |
#define HUAWEI_PRODUCT_E1406 0x1406
|
| 928 |
+#define HUAWEI_PRODUCT_E1407 0x1407
|
| 929 |
#define HUAWEI_PRODUCT_E1408 0x1408
|
| 930 |
#define HUAWEI_PRODUCT_E1409 0x1409
|
| 931 |
+#define HUAWEI_PRODUCT_E140A 0x140A
|
| 932 |
+#define HUAWEI_PRODUCT_E140B 0x140B
|
| 933 |
+#define HUAWEI_PRODUCT_E140C 0x140C
|
| 934 |
+#define HUAWEI_PRODUCT_E140D 0x140D
|
| 935 |
+#define HUAWEI_PRODUCT_E140E 0x140E
|
| 936 |
+#define HUAWEI_PRODUCT_E140F 0x140F
|
| 937 |
#define HUAWEI_PRODUCT_E1410 0x1410
|
| 938 |
#define HUAWEI_PRODUCT_E1411 0x1411
|
| 939 |
#define HUAWEI_PRODUCT_E1412 0x1412
|
| 940 |
@@ -121,9 +119,52 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
|
| 941 |
#define HUAWEI_PRODUCT_E1417 0x1417
|
| 942 |
#define HUAWEI_PRODUCT_E1418 0x1418
|
| 943 |
#define HUAWEI_PRODUCT_E1419 0x1419
|
| 944 |
+#define HUAWEI_PRODUCT_E141A 0x141A
|
| 945 |
+#define HUAWEI_PRODUCT_E141B 0x141B
|
| 946 |
+#define HUAWEI_PRODUCT_E141C 0x141C
|
| 947 |
+#define HUAWEI_PRODUCT_E141D 0x141D
|
| 948 |
+#define HUAWEI_PRODUCT_E141E 0x141E
|
| 949 |
+#define HUAWEI_PRODUCT_E141F 0x141F
|
| 950 |
+#define HUAWEI_PRODUCT_E1420 0x1420
|
| 951 |
+#define HUAWEI_PRODUCT_E1421 0x1421
|
| 952 |
+#define HUAWEI_PRODUCT_E1422 0x1422
|
| 953 |
+#define HUAWEI_PRODUCT_E1423 0x1423
|
| 954 |
+#define HUAWEI_PRODUCT_E1424 0x1424
|
| 955 |
+#define HUAWEI_PRODUCT_E1425 0x1425
|
| 956 |
+#define HUAWEI_PRODUCT_E1426 0x1426
|
| 957 |
+#define HUAWEI_PRODUCT_E1427 0x1427
|
| 958 |
+#define HUAWEI_PRODUCT_E1428 0x1428
|
| 959 |
+#define HUAWEI_PRODUCT_E1429 0x1429
|
| 960 |
+#define HUAWEI_PRODUCT_E142A 0x142A
|
| 961 |
+#define HUAWEI_PRODUCT_E142B 0x142B
|
| 962 |
+#define HUAWEI_PRODUCT_E142C 0x142C
|
| 963 |
+#define HUAWEI_PRODUCT_E142D 0x142D
|
| 964 |
+#define HUAWEI_PRODUCT_E142E 0x142E
|
| 965 |
+#define HUAWEI_PRODUCT_E142F 0x142F
|
| 966 |
+#define HUAWEI_PRODUCT_E1430 0x1430
|
| 967 |
+#define HUAWEI_PRODUCT_E1431 0x1431
|
| 968 |
+#define HUAWEI_PRODUCT_E1432 0x1432
|
| 969 |
+#define HUAWEI_PRODUCT_E1433 0x1433
|
| 970 |
+#define HUAWEI_PRODUCT_E1434 0x1434
|
| 971 |
+#define HUAWEI_PRODUCT_E1435 0x1435
|
| 972 |
+#define HUAWEI_PRODUCT_E1436 0x1436
|
| 973 |
+#define HUAWEI_PRODUCT_E1437 0x1437
|
| 974 |
+#define HUAWEI_PRODUCT_E1438 0x1438
|
| 975 |
+#define HUAWEI_PRODUCT_E1439 0x1439
|
| 976 |
+#define HUAWEI_PRODUCT_E143A 0x143A
|
| 977 |
+#define HUAWEI_PRODUCT_E143B 0x143B
|
| 978 |
+#define HUAWEI_PRODUCT_E143C 0x143C
|
| 979 |
+#define HUAWEI_PRODUCT_E143D 0x143D
|
| 980 |
+#define HUAWEI_PRODUCT_E143E 0x143E
|
| 981 |
+#define HUAWEI_PRODUCT_E143F 0x143F
|
| 982 |
|
| 983 |
#define NOVATELWIRELESS_VENDOR_ID 0x1410
|
| 984 |
|
| 985 |
+/* YISO PRODUCTS */
|
| 986 |
+
|
| 987 |
+#define YISO_VENDOR_ID 0x0EAB
|
| 988 |
+#define YISO_PRODUCT_U893 0xC893
|
| 989 |
+
|
| 990 |
/* MERLIN EVDO PRODUCTS */
|
| 991 |
#define NOVATELWIRELESS_PRODUCT_V640 0x1100
|
| 992 |
#define NOVATELWIRELESS_PRODUCT_V620 0x1110
|
| 993 |
@@ -183,6 +224,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
|
| 994 |
#define ONDA_VENDOR_ID 0x19d2
|
| 995 |
#define ONDA_PRODUCT_MSA501HS 0x0001
|
| 996 |
#define ONDA_PRODUCT_ET502HS 0x0002
|
| 997 |
+#define ONDA_PRODUCT_MT503HS 0x0200
|
| 998 |
|
| 999 |
#define BANDRICH_VENDOR_ID 0x1A8D
|
| 1000 |
#define BANDRICH_PRODUCT_C100_1 0x1002
|
| 1001 |
@@ -218,8 +260,19 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
|
| 1002 |
/* ZTE PRODUCTS */
|
| 1003 |
#define ZTE_VENDOR_ID 0x19d2
|
| 1004 |
#define ZTE_PRODUCT_MF628 0x0015
|
| 1005 |
+#define ZTE_PRODUCT_MF626 0x0031
|
| 1006 |
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
|
| 1007 |
|
| 1008 |
+/* Ericsson products */
|
| 1009 |
+#define ERICSSON_VENDOR_ID 0x0bdb
|
| 1010 |
+#define ERICSSON_PRODUCT_F3507G 0x1900
|
| 1011 |
+
|
| 1012 |
+/* Pantech products */
|
| 1013 |
+#define PANTECH_VENDOR_ID 0x106c
|
| 1014 |
+#define PANTECH_PRODUCT_PC5740 0x3701
|
| 1015 |
+#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */
|
| 1016 |
+#define PANTECH_PRODUCT_UM150 0x3711
|
| 1017 |
+
|
| 1018 |
static struct usb_device_id option_ids[] = {
|
| 1019 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
|
| 1020 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
|
| 1021 |
@@ -235,36 +288,34 @@ static struct usb_device_id option_ids[] = {
|
| 1022 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
|
| 1023 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
|
| 1024 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
|
| 1025 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) },
|
| 1026 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
|
| 1027 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
|
| 1028 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
|
| 1029 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) },
|
| 1030 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) },
|
| 1031 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) },
|
| 1032 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
|
| 1033 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) },
|
| 1034 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
|
| 1035 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) },
|
| 1036 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
|
| 1037 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) },
|
| 1038 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
|
| 1039 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
|
| 1040 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
|
| 1041 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) },
|
| 1042 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) },
|
| 1043 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
|
| 1044 |
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
|
| 1045 |
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
|
| 1046 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
|
| 1047 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
|
| 1048 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
|
| 1049 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
|
| 1050 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
|
| 1051 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
|
| 1052 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
|
| 1053 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
|
| 1054 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
|
| 1055 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
|
| 1056 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
|
| 1057 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
|
| 1058 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
|
| 1059 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
|
| 1060 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
|
| 1061 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
|
| 1062 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
|
| 1063 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
|
| 1064 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
|
| 1065 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
|
| 1066 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
|
| 1067 |
@@ -275,6 +326,44 @@ static struct usb_device_id option_ids[] = {
|
| 1068 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
|
| 1069 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
|
| 1070 |
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
|
| 1071 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
|
| 1072 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
|
| 1073 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
|
| 1074 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
|
| 1075 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
|
| 1076 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
|
| 1077 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
|
| 1078 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
|
| 1079 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
|
| 1080 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
|
| 1081 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
|
| 1082 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
|
| 1083 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
|
| 1084 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
|
| 1085 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
|
| 1086 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
|
| 1087 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
|
| 1088 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
|
| 1089 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
|
| 1090 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
|
| 1091 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
|
| 1092 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
|
| 1093 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
|
| 1094 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
|
| 1095 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
|
| 1096 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
|
| 1097 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
|
| 1098 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
|
| 1099 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
|
| 1100 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
|
| 1101 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
|
| 1102 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
|
| 1103 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
|
| 1104 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
|
| 1105 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
|
| 1106 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
|
| 1107 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
|
| 1108 |
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
|
| 1109 |
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
|
| 1110 |
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
|
| 1111 |
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
|
| 1112 |
@@ -318,12 +407,48 @@ static struct usb_device_id option_ids[] = {
|
| 1113 |
{ USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
|
| 1114 |
{ USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
|
| 1115 |
{ USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
|
| 1116 |
- { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
|
| 1117 |
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
|
| 1118 |
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
| 1119 |
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
| 1120 |
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
| 1121 |
{ USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
|
| 1122 |
{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
|
| 1123 |
{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
|
| 1124 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) },
|
| 1125 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) },
|
| 1126 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) },
|
| 1127 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) },
|
| 1128 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) },
|
| 1129 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) },
|
| 1130 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) },
|
| 1131 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) },
|
| 1132 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) },
|
| 1133 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) },
|
| 1134 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) },
|
| 1135 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) },
|
| 1136 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) },
|
| 1137 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) },
|
| 1138 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) },
|
| 1139 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) },
|
| 1140 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) },
|
| 1141 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) },
|
| 1142 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) },
|
| 1143 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) },
|
| 1144 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) },
|
| 1145 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) },
|
| 1146 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) },
|
| 1147 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) },
|
| 1148 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) },
|
| 1149 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) },
|
| 1150 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) },
|
| 1151 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) },
|
| 1152 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) },
|
| 1153 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) },
|
| 1154 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) },
|
| 1155 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) },
|
| 1156 |
+ { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) },
|
| 1157 |
+ { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) },
|
| 1158 |
+ { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
|
| 1159 |
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
|
| 1160 |
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
|
| 1161 |
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
|
| 1162 |
@@ -347,8 +472,13 @@ static struct usb_device_id option_ids[] = {
|
| 1163 |
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
| 1164 |
{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
|
| 1165 |
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
|
| 1166 |
+ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
|
| 1167 |
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
|
| 1168 |
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
|
| 1169 |
+ { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
|
| 1170 |
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
|
| 1171 |
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
|
| 1172 |
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
|
| 1173 |
{ } /* Terminating entry */
|
| 1174 |
};
|
| 1175 |
MODULE_DEVICE_TABLE(usb, option_ids);
|
| 1176 |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
|
| 1177 |
index ccebf89..e61f2bf 100644
|
| 1178 |
--- a/drivers/usb/storage/unusual_devs.h
|
| 1179 |
+++ b/drivers/usb/storage/unusual_devs.h
|
| 1180 |
@@ -167,6 +167,13 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600,
|
| 1181 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1182 |
US_FL_FIX_CAPACITY ),
|
| 1183 |
|
| 1184 |
+/* Patch for Nokia 5310 capacity */
|
| 1185 |
+UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591,
|
| 1186 |
+ "Nokia",
|
| 1187 |
+ "5310",
|
| 1188 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1189 |
+ US_FL_FIX_CAPACITY ),
|
| 1190 |
+
|
| 1191 |
/* Reported by Mario Rettig <mariorettig@web.de> */
|
| 1192 |
UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100,
|
| 1193 |
"Nokia",
|
| 1194 |
@@ -233,14 +240,14 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370,
|
| 1195 |
US_FL_MAX_SECTORS_64 ),
|
| 1196 |
|
| 1197 |
/* Reported by Cedric Godin <cedric@belbone.be> */
|
| 1198 |
-UNUSUAL_DEV( 0x0421, 0x04b9, 0x0551, 0x0551,
|
| 1199 |
+UNUSUAL_DEV( 0x0421, 0x04b9, 0x0500, 0x0551,
|
| 1200 |
"Nokia",
|
| 1201 |
"5300",
|
| 1202 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1203 |
US_FL_FIX_CAPACITY ),
|
| 1204 |
|
| 1205 |
/* Reported by Richard Nauber <RichardNauber@web.de> */
|
| 1206 |
-UNUSUAL_DEV( 0x0421, 0x04fa, 0x0601, 0x0601,
|
| 1207 |
+UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660,
|
| 1208 |
"Nokia",
|
| 1209 |
"6300",
|
| 1210 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1211 |
@@ -253,6 +260,14 @@ UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591,
|
| 1212 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1213 |
US_FL_FIX_CAPACITY ),
|
| 1214 |
|
| 1215 |
+/* Submitted by Ricky Wong Yung Fei <evilbladewarrior@gmail.com> */
|
| 1216 |
+/* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */
|
| 1217 |
+UNUSUAL_DEV( 0x0421, 0x00f5, 0x0000, 0x0470,
|
| 1218 |
+ "Nokia",
|
| 1219 |
+ "7610 Supernova",
|
| 1220 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1221 |
+ US_FL_FIX_CAPACITY ),
|
| 1222 |
+
|
| 1223 |
/* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */
|
| 1224 |
UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210,
|
| 1225 |
"SMSC",
|
| 1226 |
@@ -303,6 +318,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101,
|
| 1227 |
US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
|
| 1228 |
#endif
|
| 1229 |
|
| 1230 |
+/* Reported by Tamas Kerecsen <kerecsen@bigfoot.com>
|
| 1231 |
+ * Obviously the PROM has not been customized by the VAR;
|
| 1232 |
+ * the Vendor and Product string descriptors are:
|
| 1233 |
+ * Generic Mass Storage (PROTOTYPE--Remember to change idVendor)
|
| 1234 |
+ * Generic Manufacturer (PROTOTYPE--Remember to change idVendor)
|
| 1235 |
+ */
|
| 1236 |
+UNUSUAL_DEV( 0x045e, 0xffff, 0x0000, 0x0000,
|
| 1237 |
+ "Mitac",
|
| 1238 |
+ "GPS",
|
| 1239 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1240 |
+ US_FL_MAX_SECTORS_64 ),
|
| 1241 |
+
|
| 1242 |
/*
|
| 1243 |
* This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.)
|
| 1244 |
* Reported by Pete Zaitcev <zaitcev@redhat.com>
|
| 1245 |
@@ -333,6 +360,13 @@ UNUSUAL_DEV( 0x0482, 0x0103, 0x0100, 0x0100,
|
| 1246 |
"Finecam S5",
|
| 1247 |
US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
|
| 1248 |
|
| 1249 |
+/* Patch submitted by Jens Taprogge <jens.taprogge@taprogge.org> */
|
| 1250 |
+UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100,
|
| 1251 |
+ "Kyocera",
|
| 1252 |
+ "CONTAX SL300R T*",
|
| 1253 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1254 |
+ US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE),
|
| 1255 |
+
|
| 1256 |
/* Reported by Paul Stewart <stewart@wetlogic.net>
|
| 1257 |
* This entry is needed because the device reports Sub=ff */
|
| 1258 |
UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001,
|
| 1259 |
@@ -355,6 +389,13 @@ UNUSUAL_DEV( 0x04b0, 0x0401, 0x0200, 0x0200,
|
| 1260 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1261 |
US_FL_FIX_CAPACITY),
|
| 1262 |
|
| 1263 |
+/* Reported by Tobias Kunze Briseno <t-linux@fictive.com> */
|
| 1264 |
+UNUSUAL_DEV( 0x04b0, 0x0403, 0x0200, 0x0200,
|
| 1265 |
+ "NIKON",
|
| 1266 |
+ "NIKON DSC D2H",
|
| 1267 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1268 |
+ US_FL_FIX_CAPACITY),
|
| 1269 |
+
|
| 1270 |
/* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */
|
| 1271 |
UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100,
|
| 1272 |
"NIKON",
|
| 1273 |
@@ -411,6 +452,13 @@ UNUSUAL_DEV( 0x04b0, 0x0417, 0x0100, 0x0100,
|
| 1274 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1275 |
US_FL_FIX_CAPACITY),
|
| 1276 |
|
| 1277 |
+/* Reported by paul ready <lxtwin@homecall.co.uk> */
|
| 1278 |
+UNUSUAL_DEV( 0x04b0, 0x0419, 0x0100, 0x0200,
|
| 1279 |
+ "NIKON",
|
| 1280 |
+ "NIKON DSC D300",
|
| 1281 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1282 |
+ US_FL_FIX_CAPACITY),
|
| 1283 |
+
|
| 1284 |
/* Reported by Doug Maxey (dwm@austin.ibm.com) */
|
| 1285 |
UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110,
|
| 1286 |
"IBM",
|
| 1287 |
@@ -1635,97 +1683,332 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100,
|
| 1288 |
/* Reported by fangxiaozhi <huananhu@huawei.com>
|
| 1289 |
* This brings the HUAWEI data card devices into multi-port mode
|
| 1290 |
*/
|
| 1291 |
-UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
|
| 1292 |
+UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
|
| 1293 |
+ "HUAWEI MOBILE",
|
| 1294 |
+ "Mass Storage",
|
| 1295 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1296 |
+ 0),
|
| 1297 |
+UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
|
| 1298 |
+ "HUAWEI MOBILE",
|
| 1299 |
+ "Mass Storage",
|
| 1300 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1301 |
+ 0),
|
| 1302 |
+UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
|
| 1303 |
+ "HUAWEI MOBILE",
|
| 1304 |
+ "Mass Storage",
|
| 1305 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1306 |
+ 0),
|
| 1307 |
+UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
|
| 1308 |
+ "HUAWEI MOBILE",
|
| 1309 |
+ "Mass Storage",
|
| 1310 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1311 |
+ 0),
|
| 1312 |
+UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000,
|
| 1313 |
+ "HUAWEI MOBILE",
|
| 1314 |
+ "Mass Storage",
|
| 1315 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1316 |
+ 0),
|
| 1317 |
+UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
|
| 1318 |
+ "HUAWEI MOBILE",
|
| 1319 |
+ "Mass Storage",
|
| 1320 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1321 |
+ 0),
|
| 1322 |
+UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000,
|
| 1323 |
+ "HUAWEI MOBILE",
|
| 1324 |
+ "Mass Storage",
|
| 1325 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1326 |
+ 0),
|
| 1327 |
+UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
|
| 1328 |
+ "HUAWEI MOBILE",
|
| 1329 |
+ "Mass Storage",
|
| 1330 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1331 |
+ 0),
|
| 1332 |
+UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
|
| 1333 |
+ "HUAWEI MOBILE",
|
| 1334 |
+ "Mass Storage",
|
| 1335 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1336 |
+ 0),
|
| 1337 |
+UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000,
|
| 1338 |
+ "HUAWEI MOBILE",
|
| 1339 |
+ "Mass Storage",
|
| 1340 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1341 |
+ 0),
|
| 1342 |
+UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
|
| 1343 |
+ "HUAWEI MOBILE",
|
| 1344 |
+ "Mass Storage",
|
| 1345 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1346 |
+ 0),
|
| 1347 |
+UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
|
| 1348 |
+ "HUAWEI MOBILE",
|
| 1349 |
+ "Mass Storage",
|
| 1350 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1351 |
+ 0),
|
| 1352 |
+UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000,
|
| 1353 |
+ "HUAWEI MOBILE",
|
| 1354 |
+ "Mass Storage",
|
| 1355 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1356 |
+ 0),
|
| 1357 |
+UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000,
|
| 1358 |
+ "HUAWEI MOBILE",
|
| 1359 |
+ "Mass Storage",
|
| 1360 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1361 |
+ 0),
|
| 1362 |
+UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000,
|
| 1363 |
+ "HUAWEI MOBILE",
|
| 1364 |
+ "Mass Storage",
|
| 1365 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1366 |
+ 0),
|
| 1367 |
+UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000,
|
| 1368 |
+ "HUAWEI MOBILE",
|
| 1369 |
+ "Mass Storage",
|
| 1370 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1371 |
+ 0),
|
| 1372 |
+UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000,
|
| 1373 |
+ "HUAWEI MOBILE",
|
| 1374 |
+ "Mass Storage",
|
| 1375 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1376 |
+ 0),
|
| 1377 |
+UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000,
|
| 1378 |
+ "HUAWEI MOBILE",
|
| 1379 |
+ "Mass Storage",
|
| 1380 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1381 |
+ 0),
|
| 1382 |
+UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
|
| 1383 |
+ "HUAWEI MOBILE",
|
| 1384 |
+ "Mass Storage",
|
| 1385 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1386 |
+ 0),
|
| 1387 |
+UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
|
| 1388 |
+ "HUAWEI MOBILE",
|
| 1389 |
+ "Mass Storage",
|
| 1390 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1391 |
+ 0),
|
| 1392 |
+UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
|
| 1393 |
+ "HUAWEI MOBILE",
|
| 1394 |
+ "Mass Storage",
|
| 1395 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1396 |
+ 0),
|
| 1397 |
+UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
|
| 1398 |
+ "HUAWEI MOBILE",
|
| 1399 |
+ "Mass Storage",
|
| 1400 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1401 |
+ 0),
|
| 1402 |
+UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
|
| 1403 |
+ "HUAWEI MOBILE",
|
| 1404 |
+ "Mass Storage",
|
| 1405 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1406 |
+ 0),
|
| 1407 |
+UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
|
| 1408 |
+ "HUAWEI MOBILE",
|
| 1409 |
+ "Mass Storage",
|
| 1410 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1411 |
+ 0),
|
| 1412 |
+UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
|
| 1413 |
+ "HUAWEI MOBILE",
|
| 1414 |
+ "Mass Storage",
|
| 1415 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1416 |
+ 0),
|
| 1417 |
+UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
|
| 1418 |
+ "HUAWEI MOBILE",
|
| 1419 |
+ "Mass Storage",
|
| 1420 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1421 |
+ 0),
|
| 1422 |
+UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
|
| 1423 |
+ "HUAWEI MOBILE",
|
| 1424 |
+ "Mass Storage",
|
| 1425 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1426 |
+ 0),
|
| 1427 |
+UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
|
| 1428 |
+ "HUAWEI MOBILE",
|
| 1429 |
+ "Mass Storage",
|
| 1430 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1431 |
+ 0),
|
| 1432 |
+UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000,
|
| 1433 |
+ "HUAWEI MOBILE",
|
| 1434 |
+ "Mass Storage",
|
| 1435 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1436 |
+ 0),
|
| 1437 |
+UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000,
|
| 1438 |
+ "HUAWEI MOBILE",
|
| 1439 |
+ "Mass Storage",
|
| 1440 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1441 |
+ 0),
|
| 1442 |
+UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000,
|
| 1443 |
+ "HUAWEI MOBILE",
|
| 1444 |
+ "Mass Storage",
|
| 1445 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1446 |
+ 0),
|
| 1447 |
+UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000,
|
| 1448 |
+ "HUAWEI MOBILE",
|
| 1449 |
+ "Mass Storage",
|
| 1450 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1451 |
+ 0),
|
| 1452 |
+UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000,
|
| 1453 |
+ "HUAWEI MOBILE",
|
| 1454 |
+ "Mass Storage",
|
| 1455 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1456 |
+ 0),
|
| 1457 |
+UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000,
|
| 1458 |
+ "HUAWEI MOBILE",
|
| 1459 |
+ "Mass Storage",
|
| 1460 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1461 |
+ 0),
|
| 1462 |
+UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000,
|
| 1463 |
+ "HUAWEI MOBILE",
|
| 1464 |
+ "Mass Storage",
|
| 1465 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1466 |
+ 0),
|
| 1467 |
+UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000,
|
| 1468 |
+ "HUAWEI MOBILE",
|
| 1469 |
+ "Mass Storage",
|
| 1470 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1471 |
+ 0),
|
| 1472 |
+UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000,
|
| 1473 |
+ "HUAWEI MOBILE",
|
| 1474 |
+ "Mass Storage",
|
| 1475 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1476 |
+ 0),
|
| 1477 |
+UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000,
|
| 1478 |
+ "HUAWEI MOBILE",
|
| 1479 |
+ "Mass Storage",
|
| 1480 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1481 |
+ 0),
|
| 1482 |
+UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000,
|
| 1483 |
+ "HUAWEI MOBILE",
|
| 1484 |
+ "Mass Storage",
|
| 1485 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1486 |
+ 0),
|
| 1487 |
+UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000,
|
| 1488 |
+ "HUAWEI MOBILE",
|
| 1489 |
+ "Mass Storage",
|
| 1490 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1491 |
+ 0),
|
| 1492 |
+UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000,
|
| 1493 |
+ "HUAWEI MOBILE",
|
| 1494 |
+ "Mass Storage",
|
| 1495 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1496 |
+ 0),
|
| 1497 |
+UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000,
|
| 1498 |
"HUAWEI MOBILE",
|
| 1499 |
"Mass Storage",
|
| 1500 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1501 |
0),
|
| 1502 |
-UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
|
| 1503 |
+UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000,
|
| 1504 |
"HUAWEI MOBILE",
|
| 1505 |
"Mass Storage",
|
| 1506 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1507 |
0),
|
| 1508 |
-UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
|
| 1509 |
+UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000,
|
| 1510 |
"HUAWEI MOBILE",
|
| 1511 |
"Mass Storage",
|
| 1512 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1513 |
0),
|
| 1514 |
-UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
|
| 1515 |
+UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000,
|
| 1516 |
"HUAWEI MOBILE",
|
| 1517 |
"Mass Storage",
|
| 1518 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1519 |
0),
|
| 1520 |
-UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
|
| 1521 |
+UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000,
|
| 1522 |
"HUAWEI MOBILE",
|
| 1523 |
"Mass Storage",
|
| 1524 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1525 |
0),
|
| 1526 |
-UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
|
| 1527 |
+UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000,
|
| 1528 |
"HUAWEI MOBILE",
|
| 1529 |
"Mass Storage",
|
| 1530 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1531 |
0),
|
| 1532 |
-UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
|
| 1533 |
+UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000,
|
| 1534 |
"HUAWEI MOBILE",
|
| 1535 |
"Mass Storage",
|
| 1536 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1537 |
0),
|
| 1538 |
-UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
|
| 1539 |
+UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000,
|
| 1540 |
"HUAWEI MOBILE",
|
| 1541 |
"Mass Storage",
|
| 1542 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1543 |
0),
|
| 1544 |
-UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
|
| 1545 |
+UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000,
|
| 1546 |
"HUAWEI MOBILE",
|
| 1547 |
"Mass Storage",
|
| 1548 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1549 |
0),
|
| 1550 |
-UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
|
| 1551 |
+UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000,
|
| 1552 |
"HUAWEI MOBILE",
|
| 1553 |
"Mass Storage",
|
| 1554 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1555 |
0),
|
| 1556 |
-UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
|
| 1557 |
+UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000,
|
| 1558 |
"HUAWEI MOBILE",
|
| 1559 |
"Mass Storage",
|
| 1560 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1561 |
0),
|
| 1562 |
-UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
|
| 1563 |
+UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000,
|
| 1564 |
"HUAWEI MOBILE",
|
| 1565 |
"Mass Storage",
|
| 1566 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1567 |
0),
|
| 1568 |
-UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
|
| 1569 |
+UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000,
|
| 1570 |
"HUAWEI MOBILE",
|
| 1571 |
"Mass Storage",
|
| 1572 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1573 |
0),
|
| 1574 |
-UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
|
| 1575 |
+UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000,
|
| 1576 |
"HUAWEI MOBILE",
|
| 1577 |
"Mass Storage",
|
| 1578 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1579 |
0),
|
| 1580 |
-UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
|
| 1581 |
+UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000,
|
| 1582 |
"HUAWEI MOBILE",
|
| 1583 |
"Mass Storage",
|
| 1584 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1585 |
0),
|
| 1586 |
-UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
|
| 1587 |
+UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000,
|
| 1588 |
"HUAWEI MOBILE",
|
| 1589 |
"Mass Storage",
|
| 1590 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1591 |
0),
|
| 1592 |
-UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
|
| 1593 |
+UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000,
|
| 1594 |
"HUAWEI MOBILE",
|
| 1595 |
"Mass Storage",
|
| 1596 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1597 |
0),
|
| 1598 |
-UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
|
| 1599 |
+UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000,
|
| 1600 |
"HUAWEI MOBILE",
|
| 1601 |
"Mass Storage",
|
| 1602 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1603 |
0),
|
| 1604 |
-UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
|
| 1605 |
+UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000,
|
| 1606 |
+ "HUAWEI MOBILE",
|
| 1607 |
+ "Mass Storage",
|
| 1608 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1609 |
+ 0),
|
| 1610 |
+UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000,
|
| 1611 |
+ "HUAWEI MOBILE",
|
| 1612 |
+ "Mass Storage",
|
| 1613 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1614 |
+ 0),
|
| 1615 |
+UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000,
|
| 1616 |
+ "HUAWEI MOBILE",
|
| 1617 |
+ "Mass Storage",
|
| 1618 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1619 |
+ 0),
|
| 1620 |
+UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000,
|
| 1621 |
+ "HUAWEI MOBILE",
|
| 1622 |
+ "Mass Storage",
|
| 1623 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1624 |
+ 0),
|
| 1625 |
+UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000,
|
| 1626 |
+ "HUAWEI MOBILE",
|
| 1627 |
+ "Mass Storage",
|
| 1628 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1629 |
+ 0),
|
| 1630 |
+UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000,
|
| 1631 |
+ "HUAWEI MOBILE",
|
| 1632 |
+ "Mass Storage",
|
| 1633 |
+ US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1634 |
+ 0),
|
| 1635 |
+UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000,
|
| 1636 |
"HUAWEI MOBILE",
|
| 1637 |
"Mass Storage",
|
| 1638 |
US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
|
| 1639 |
@@ -1834,6 +2117,15 @@ UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010,
|
| 1640 |
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
| 1641 |
US_FL_FIX_CAPACITY ),
|
| 1642 |
|
| 1643 |
+/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
|
| 1644 |
+ * Mio Moov 330
|
| 1645 |
+ */
|
| 1646 |
+UNUSUAL_DEV( 0x3340, 0xffff, 0x0000, 0x0000,
|
| 1647 |
+ "Mitac",
|
| 1648 |
+ "Mio DigiWalker USB Sync",
|
| 1649 |
+ US_SC_DEVICE,US_PR_DEVICE,NULL,
|
| 1650 |
+ US_FL_MAX_SECTORS_64 ),
|
| 1651 |
+
|
| 1652 |
/* Reported by Andrey Rahmatullin <wrar@altlinux.org> */
|
| 1653 |
UNUSUAL_DEV( 0x4102, 0x1020, 0x0100, 0x0100,
|
| 1654 |
"iRiver",
|
| 1655 |
diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c
|
| 1656 |
index 05a2810..8782ec1 100644
|
| 1657 |
--- a/drivers/watchdog/ib700wdt.c
|
| 1658 |
+++ b/drivers/watchdog/ib700wdt.c
|
| 1659 |
@@ -154,7 +154,7 @@ static int ibwdt_set_heartbeat(int t)
|
| 1660 |
return -EINVAL;
|
| 1661 |
|
| 1662 |
for (i = 0x0F; i > -1; i--)
|
| 1663 |
- if (wd_times[i] > t)
|
| 1664 |
+ if (wd_times[i] >= t)
|
| 1665 |
break;
|
| 1666 |
wd_margin = i;
|
| 1667 |
return 0;
|
| 1668 |
diff --git a/fs/binfmt_em86.c b/fs/binfmt_em86.c
|
| 1669 |
index f9c88d0..32fb00b 100644
|
| 1670 |
--- a/fs/binfmt_em86.c
|
| 1671 |
+++ b/fs/binfmt_em86.c
|
| 1672 |
@@ -43,7 +43,7 @@ static int load_em86(struct linux_binprm *bprm,struct pt_regs *regs)
|
| 1673 |
return -ENOEXEC;
|
| 1674 |
}
|
| 1675 |
|
| 1676 |
- bprm->sh_bang = 1; /* Well, the bang-shell is implicit... */
|
| 1677 |
+ bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
|
| 1678 |
allow_write_access(bprm->file);
|
| 1679 |
fput(bprm->file);
|
| 1680 |
bprm->file = NULL;
|
| 1681 |
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
|
| 1682 |
index 8d7e88e..f2744ab 100644
|
| 1683 |
--- a/fs/binfmt_misc.c
|
| 1684 |
+++ b/fs/binfmt_misc.c
|
| 1685 |
@@ -117,7 +117,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
| 1686 |
goto _ret;
|
| 1687 |
|
| 1688 |
retval = -ENOEXEC;
|
| 1689 |
- if (bprm->misc_bang)
|
| 1690 |
+ if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
|
| 1691 |
goto _ret;
|
| 1692 |
|
| 1693 |
/* to keep locking time low, we copy the interpreter string */
|
| 1694 |
@@ -197,7 +197,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
| 1695 |
if (retval < 0)
|
| 1696 |
goto _error;
|
| 1697 |
|
| 1698 |
- bprm->misc_bang = 1;
|
| 1699 |
+ bprm->recursion_depth++;
|
| 1700 |
|
| 1701 |
retval = search_binary_handler (bprm, regs);
|
| 1702 |
if (retval < 0)
|
| 1703 |
diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
|
| 1704 |
index 9e3963f..0834350 100644
|
| 1705 |
--- a/fs/binfmt_script.c
|
| 1706 |
+++ b/fs/binfmt_script.c
|
| 1707 |
@@ -22,14 +22,15 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
|
| 1708 |
char interp[BINPRM_BUF_SIZE];
|
| 1709 |
int retval;
|
| 1710 |
|
| 1711 |
- if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang))
|
| 1712 |
+ if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
|
| 1713 |
+ (bprm->recursion_depth > BINPRM_MAX_RECURSION))
|
| 1714 |
return -ENOEXEC;
|
| 1715 |
/*
|
| 1716 |
* This section does the #! interpretation.
|
| 1717 |
* Sorta complicated, but hopefully it will work. -TYT
|
| 1718 |
*/
|
| 1719 |
|
| 1720 |
- bprm->sh_bang = 1;
|
| 1721 |
+ bprm->recursion_depth++;
|
| 1722 |
allow_write_access(bprm->file);
|
| 1723 |
fput(bprm->file);
|
| 1724 |
bprm->file = NULL;
|
| 1725 |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
|
| 1726 |
index 6e2be4a..223647f 100644
|
| 1727 |
--- a/fs/cifs/connect.c
|
| 1728 |
+++ b/fs/cifs/connect.c
|
| 1729 |
@@ -128,7 +128,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
| 1730 |
struct mid_q_entry *mid_entry;
|
| 1731 |
|
| 1732 |
spin_lock(&GlobalMid_Lock);
|
| 1733 |
- if (kthread_should_stop()) {
|
| 1734 |
+ if (server->tcpStatus == CifsExiting) {
|
| 1735 |
/* the demux thread will exit normally
|
| 1736 |
next time through the loop */
|
| 1737 |
spin_unlock(&GlobalMid_Lock);
|
| 1738 |
@@ -182,7 +182,8 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
| 1739 |
spin_unlock(&GlobalMid_Lock);
|
| 1740 |
up(&server->tcpSem);
|
| 1741 |
|
| 1742 |
- while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) {
|
| 1743 |
+ while ((server->tcpStatus != CifsExiting) &&
|
| 1744 |
+ (server->tcpStatus != CifsGood)) {
|
| 1745 |
try_to_freeze();
|
| 1746 |
if (server->addr.sockAddr6.sin6_family == AF_INET6) {
|
| 1747 |
rc = ipv6_connect(&server->addr.sockAddr6,
|
| 1748 |
@@ -200,7 +201,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
| 1749 |
} else {
|
| 1750 |
atomic_inc(&tcpSesReconnectCount);
|
| 1751 |
spin_lock(&GlobalMid_Lock);
|
| 1752 |
- if (!kthread_should_stop())
|
| 1753 |
+ if (server->tcpStatus != CifsExiting)
|
| 1754 |
server->tcpStatus = CifsGood;
|
| 1755 |
server->sequence_number = 0;
|
| 1756 |
spin_unlock(&GlobalMid_Lock);
|
| 1757 |
@@ -355,7 +356,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
| 1758 |
GFP_KERNEL);
|
| 1759 |
|
| 1760 |
set_freezable();
|
| 1761 |
- while (!kthread_should_stop()) {
|
| 1762 |
+ while (server->tcpStatus != CifsExiting) {
|
| 1763 |
if (try_to_freeze())
|
| 1764 |
continue;
|
| 1765 |
if (bigbuf == NULL) {
|
| 1766 |
@@ -396,7 +397,7 @@ incomplete_rcv:
|
| 1767 |
kernel_recvmsg(csocket, &smb_msg,
|
| 1768 |
&iov, 1, pdu_length, 0 /* BB other flags? */);
|
| 1769 |
|
| 1770 |
- if (kthread_should_stop()) {
|
| 1771 |
+ if (server->tcpStatus == CifsExiting) {
|
| 1772 |
break;
|
| 1773 |
} else if (server->tcpStatus == CifsNeedReconnect) {
|
| 1774 |
cFYI(1, ("Reconnect after server stopped responding"));
|
| 1775 |
@@ -527,7 +528,7 @@ incomplete_rcv:
|
| 1776 |
total_read += length) {
|
| 1777 |
length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
|
| 1778 |
pdu_length - total_read, 0);
|
| 1779 |
- if (kthread_should_stop() ||
|
| 1780 |
+ if ((server->tcpStatus == CifsExiting) ||
|
| 1781 |
(length == -EINTR)) {
|
| 1782 |
/* then will exit */
|
| 1783 |
reconnect = 2;
|
| 1784 |
@@ -661,14 +662,6 @@ multi_t2_fnd:
|
| 1785 |
spin_unlock(&GlobalMid_Lock);
|
| 1786 |
wake_up_all(&server->response_q);
|
| 1787 |
|
| 1788 |
- /* don't exit until kthread_stop is called */
|
| 1789 |
- set_current_state(TASK_UNINTERRUPTIBLE);
|
| 1790 |
- while (!kthread_should_stop()) {
|
| 1791 |
- schedule();
|
| 1792 |
- set_current_state(TASK_UNINTERRUPTIBLE);
|
| 1793 |
- }
|
| 1794 |
- set_current_state(TASK_RUNNING);
|
| 1795 |
-
|
| 1796 |
/* check if we have blocked requests that need to free */
|
| 1797 |
/* Note that cifs_max_pending is normally 50, but
|
| 1798 |
can be set at module install time to as little as two */
|
| 1799 |
@@ -764,6 +757,7 @@ multi_t2_fnd:
|
| 1800 |
read_unlock(&cifs_tcp_ses_lock);
|
| 1801 |
|
| 1802 |
kfree(server->hostname);
|
| 1803 |
+ task_to_wake = xchg(&server->tsk, NULL);
|
| 1804 |
kfree(server);
|
| 1805 |
|
| 1806 |
length = atomic_dec_return(&tcpSesAllocCount);
|
| 1807 |
@@ -771,6 +765,16 @@ multi_t2_fnd:
|
| 1808 |
mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
|
| 1809 |
GFP_KERNEL);
|
| 1810 |
|
| 1811 |
+ /* if server->tsk was NULL then wait for a signal before exiting */
|
| 1812 |
+ if (!task_to_wake) {
|
| 1813 |
+ set_current_state(TASK_INTERRUPTIBLE);
|
| 1814 |
+ while (!signal_pending(current)) {
|
| 1815 |
+ schedule();
|
| 1816 |
+ set_current_state(TASK_INTERRUPTIBLE);
|
| 1817 |
+ }
|
| 1818 |
+ set_current_state(TASK_RUNNING);
|
| 1819 |
+ }
|
| 1820 |
+
|
| 1821 |
return 0;
|
| 1822 |
}
|
| 1823 |
|
| 1824 |
@@ -2310,7 +2314,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
|
| 1825 |
/* on error free sesinfo and tcon struct if needed */
|
| 1826 |
mount_fail_check:
|
| 1827 |
if (rc) {
|
| 1828 |
- /* If find_unc succeeded then rc == 0 so we can not end */
|
| 1829 |
+ /* If find_unc succeeded then rc == 0 so we can not end */
|
| 1830 |
/* up accidently freeing someone elses tcon struct */
|
| 1831 |
if (tcon)
|
| 1832 |
cifs_put_tcon(tcon);
|
| 1833 |
@@ -3715,8 +3719,10 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
|
| 1834 |
cERROR(1, ("Send error in SessSetup = %d", rc));
|
| 1835 |
} else {
|
| 1836 |
cFYI(1, ("CIFS Session Established successfully"));
|
| 1837 |
+ spin_lock(&GlobalMid_Lock);
|
| 1838 |
pSesInfo->status = CifsGood;
|
| 1839 |
pSesInfo->need_reconnect = false;
|
| 1840 |
+ spin_unlock(&GlobalMid_Lock);
|
| 1841 |
}
|
| 1842 |
|
| 1843 |
ss_err_exit:
|
| 1844 |
diff --git a/fs/exec.c b/fs/exec.c
|
| 1845 |
index cecee50..b266ace 100644
|
| 1846 |
--- a/fs/exec.c
|
| 1847 |
+++ b/fs/exec.c
|
| 1848 |
@@ -1164,6 +1164,7 @@ EXPORT_SYMBOL(remove_arg_zero);
|
| 1849 |
*/
|
| 1850 |
int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
|
| 1851 |
{
|
| 1852 |
+ unsigned int depth = bprm->recursion_depth;
|
| 1853 |
int try,retval;
|
| 1854 |
struct linux_binfmt *fmt;
|
| 1855 |
#ifdef __alpha__
|
| 1856 |
@@ -1224,8 +1225,15 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
|
| 1857 |
continue;
|
| 1858 |
read_unlock(&binfmt_lock);
|
| 1859 |
retval = fn(bprm, regs);
|
| 1860 |
+ /*
|
| 1861 |
+ * Restore the depth counter to its starting value
|
| 1862 |
+ * in this call, so we don't have to rely on every
|
| 1863 |
+ * load_binary function to restore it on return.
|
| 1864 |
+ */
|
| 1865 |
+ bprm->recursion_depth = depth;
|
| 1866 |
if (retval >= 0) {
|
| 1867 |
- tracehook_report_exec(fmt, bprm, regs);
|
| 1868 |
+ if (depth == 0)
|
| 1869 |
+ tracehook_report_exec(fmt, bprm, regs);
|
| 1870 |
put_binfmt(fmt);
|
| 1871 |
allow_write_access(bprm->file);
|
| 1872 |
if (bprm->file)
|
| 1873 |
diff --git a/fs/fcntl.c b/fs/fcntl.c
|
| 1874 |
index ac4f7db..549daf8 100644
|
| 1875 |
--- a/fs/fcntl.c
|
| 1876 |
+++ b/fs/fcntl.c
|
| 1877 |
@@ -19,6 +19,7 @@
|
| 1878 |
#include <linux/signal.h>
|
| 1879 |
#include <linux/rcupdate.h>
|
| 1880 |
#include <linux/pid_namespace.h>
|
| 1881 |
+#include <linux/smp_lock.h>
|
| 1882 |
|
| 1883 |
#include <asm/poll.h>
|
| 1884 |
#include <asm/siginfo.h>
|
| 1885 |
@@ -175,6 +176,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
|
| 1886 |
if (error)
|
| 1887 |
return error;
|
| 1888 |
|
| 1889 |
+ /*
|
| 1890 |
+ * We still need a lock here for now to keep multiple FASYNC calls
|
| 1891 |
+ * from racing with each other.
|
| 1892 |
+ */
|
| 1893 |
+ lock_kernel();
|
| 1894 |
if ((arg ^ filp->f_flags) & FASYNC) {
|
| 1895 |
if (filp->f_op && filp->f_op->fasync) {
|
| 1896 |
error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
|
| 1897 |
@@ -185,6 +191,7 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
|
| 1898 |
|
| 1899 |
filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
|
| 1900 |
out:
|
| 1901 |
+ unlock_kernel();
|
| 1902 |
return error;
|
| 1903 |
}
|
| 1904 |
|
| 1905 |
diff --git a/fs/ioctl.c b/fs/ioctl.c
|
| 1906 |
index 7db32b3..612e0b2 100644
|
| 1907 |
--- a/fs/ioctl.c
|
| 1908 |
+++ b/fs/ioctl.c
|
| 1909 |
@@ -123,11 +123,9 @@ static int ioctl_fioasync(unsigned int fd, struct file *filp,
|
| 1910 |
|
| 1911 |
/* Did FASYNC state change ? */
|
| 1912 |
if ((flag ^ filp->f_flags) & FASYNC) {
|
| 1913 |
- if (filp->f_op && filp->f_op->fasync) {
|
| 1914 |
- lock_kernel();
|
| 1915 |
+ if (filp->f_op && filp->f_op->fasync)
|
| 1916 |
error = filp->f_op->fasync(fd, filp, on);
|
| 1917 |
- unlock_kernel();
|
| 1918 |
- } else
|
| 1919 |
+ else
|
| 1920 |
error = -ENOTTY;
|
| 1921 |
}
|
| 1922 |
if (error)
|
| 1923 |
@@ -163,11 +161,17 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
|
| 1924 |
break;
|
| 1925 |
|
| 1926 |
case FIONBIO:
|
| 1927 |
+ /* BKL needed to avoid races tweaking f_flags */
|
| 1928 |
+ lock_kernel();
|
| 1929 |
error = ioctl_fionbio(filp, argp);
|
| 1930 |
+ unlock_kernel();
|
| 1931 |
break;
|
| 1932 |
|
| 1933 |
case FIOASYNC:
|
| 1934 |
+ /* BKL needed to avoid races tweaking f_flags */
|
| 1935 |
+ lock_kernel();
|
| 1936 |
error = ioctl_fioasync(fd, filp, argp);
|
| 1937 |
+ unlock_kernel();
|
| 1938 |
break;
|
| 1939 |
|
| 1940 |
case FIOQSIZE:
|
| 1941 |
diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c
|
| 1942 |
index a5432bb..fe85219 100644
|
| 1943 |
--- a/fs/jbd/checkpoint.c
|
| 1944 |
+++ b/fs/jbd/checkpoint.c
|
| 1945 |
@@ -93,7 +93,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh)
|
| 1946 |
int ret = 0;
|
| 1947 |
struct buffer_head *bh = jh2bh(jh);
|
| 1948 |
|
| 1949 |
- if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) {
|
| 1950 |
+ if (jh->b_jlist == BJ_None && !buffer_locked(bh) &&
|
| 1951 |
+ !buffer_dirty(bh) && !buffer_write_io_error(bh)) {
|
| 1952 |
JBUFFER_TRACE(jh, "remove from checkpoint list");
|
| 1953 |
ret = __journal_remove_checkpoint(jh) + 1;
|
| 1954 |
jbd_unlock_bh_state(bh);
|
| 1955 |
@@ -160,21 +161,25 @@ static void jbd_sync_bh(journal_t *journal, struct buffer_head *bh)
|
| 1956 |
* buffers. Note that we take the buffers in the opposite ordering
|
| 1957 |
* from the one in which they were submitted for IO.
|
| 1958 |
*
|
| 1959 |
+ * Return 0 on success, and return <0 if some buffers have failed
|
| 1960 |
+ * to be written out.
|
| 1961 |
+ *
|
| 1962 |
* Called with j_list_lock held.
|
| 1963 |
*/
|
| 1964 |
-static void __wait_cp_io(journal_t *journal, transaction_t *transaction)
|
| 1965 |
+static int __wait_cp_io(journal_t *journal, transaction_t *transaction)
|
| 1966 |
{
|
| 1967 |
struct journal_head *jh;
|
| 1968 |
struct buffer_head *bh;
|
| 1969 |
tid_t this_tid;
|
| 1970 |
int released = 0;
|
| 1971 |
+ int ret = 0;
|
| 1972 |
|
| 1973 |
this_tid = transaction->t_tid;
|
| 1974 |
restart:
|
| 1975 |
/* Did somebody clean up the transaction in the meanwhile? */
|
| 1976 |
if (journal->j_checkpoint_transactions != transaction ||
|
| 1977 |
transaction->t_tid != this_tid)
|
| 1978 |
- return;
|
| 1979 |
+ return ret;
|
| 1980 |
while (!released && transaction->t_checkpoint_io_list) {
|
| 1981 |
jh = transaction->t_checkpoint_io_list;
|
| 1982 |
bh = jh2bh(jh);
|
| 1983 |
@@ -194,6 +199,9 @@ restart:
|
| 1984 |
spin_lock(&journal->j_list_lock);
|
| 1985 |
goto restart;
|
| 1986 |
}
|
| 1987 |
+ if (unlikely(buffer_write_io_error(bh)))
|
| 1988 |
+ ret = -EIO;
|
| 1989 |
+
|
| 1990 |
/*
|
| 1991 |
* Now in whatever state the buffer currently is, we know that
|
| 1992 |
* it has been written out and so we can drop it from the list
|
| 1993 |
@@ -203,6 +211,8 @@ restart:
|
| 1994 |
journal_remove_journal_head(bh);
|
| 1995 |
__brelse(bh);
|
| 1996 |
}
|
| 1997 |
+
|
| 1998 |
+ return ret;
|
| 1999 |
}
|
| 2000 |
|
| 2001 |
#define NR_BATCH 64
|
| 2002 |
@@ -226,7 +236,8 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count)
|
| 2003 |
* Try to flush one buffer from the checkpoint list to disk.
|
| 2004 |
*
|
| 2005 |
* Return 1 if something happened which requires us to abort the current
|
| 2006 |
- * scan of the checkpoint list.
|
| 2007 |
+ * scan of the checkpoint list. Return <0 if the buffer has failed to
|
| 2008 |
+ * be written out.
|
| 2009 |
*
|
| 2010 |
* Called with j_list_lock held and drops it if 1 is returned
|
| 2011 |
* Called under jbd_lock_bh_state(jh2bh(jh)), and drops it
|
| 2012 |
@@ -256,6 +267,9 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
|
| 2013 |
log_wait_commit(journal, tid);
|
| 2014 |
ret = 1;
|
| 2015 |
} else if (!buffer_dirty(bh)) {
|
| 2016 |
+ ret = 1;
|
| 2017 |
+ if (unlikely(buffer_write_io_error(bh)))
|
| 2018 |
+ ret = -EIO;
|
| 2019 |
J_ASSERT_JH(jh, !buffer_jbddirty(bh));
|
| 2020 |
BUFFER_TRACE(bh, "remove from checkpoint");
|
| 2021 |
__journal_remove_checkpoint(jh);
|
| 2022 |
@@ -263,7 +277,6 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
|
| 2023 |
jbd_unlock_bh_state(bh);
|
| 2024 |
journal_remove_journal_head(bh);
|
| 2025 |
__brelse(bh);
|
| 2026 |
- ret = 1;
|
| 2027 |
} else {
|
| 2028 |
/*
|
| 2029 |
* Important: we are about to write the buffer, and
|
| 2030 |
@@ -295,6 +308,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
|
| 2031 |
* to disk. We submit larger chunks of data at once.
|
| 2032 |
*
|
| 2033 |
* The journal should be locked before calling this function.
|
| 2034 |
+ * Called with j_checkpoint_mutex held.
|
| 2035 |
*/
|
| 2036 |
int log_do_checkpoint(journal_t *journal)
|
| 2037 |
{
|
| 2038 |
@@ -318,6 +332,7 @@ int log_do_checkpoint(journal_t *journal)
|
| 2039 |
* OK, we need to start writing disk blocks. Take one transaction
|
| 2040 |
* and write it.
|
| 2041 |
*/
|
| 2042 |
+ result = 0;
|
| 2043 |
spin_lock(&journal->j_list_lock);
|
| 2044 |
if (!journal->j_checkpoint_transactions)
|
| 2045 |
goto out;
|
| 2046 |
@@ -334,7 +349,7 @@ restart:
|
| 2047 |
int batch_count = 0;
|
| 2048 |
struct buffer_head *bhs[NR_BATCH];
|
| 2049 |
struct journal_head *jh;
|
| 2050 |
- int retry = 0;
|
| 2051 |
+ int retry = 0, err;
|
| 2052 |
|
| 2053 |
while (!retry && transaction->t_checkpoint_list) {
|
| 2054 |
struct buffer_head *bh;
|
| 2055 |
@@ -347,6 +362,8 @@ restart:
|
| 2056 |
break;
|
| 2057 |
}
|
| 2058 |
retry = __process_buffer(journal, jh, bhs,&batch_count);
|
| 2059 |
+ if (retry < 0 && !result)
|
| 2060 |
+ result = retry;
|
| 2061 |
if (!retry && (need_resched() ||
|
| 2062 |
spin_needbreak(&journal->j_list_lock))) {
|
| 2063 |
spin_unlock(&journal->j_list_lock);
|
| 2064 |
@@ -371,14 +388,18 @@ restart:
|
| 2065 |
* Now we have cleaned up the first transaction's checkpoint
|
| 2066 |
* list. Let's clean up the second one
|
| 2067 |
*/
|
| 2068 |
- __wait_cp_io(journal, transaction);
|
| 2069 |
+ err = __wait_cp_io(journal, transaction);
|
| 2070 |
+ if (!result)
|
| 2071 |
+ result = err;
|
| 2072 |
}
|
| 2073 |
out:
|
| 2074 |
spin_unlock(&journal->j_list_lock);
|
| 2075 |
- result = cleanup_journal_tail(journal);
|
| 2076 |
if (result < 0)
|
| 2077 |
- return result;
|
| 2078 |
- return 0;
|
| 2079 |
+ journal_abort(journal, result);
|
| 2080 |
+ else
|
| 2081 |
+ result = cleanup_journal_tail(journal);
|
| 2082 |
+
|
| 2083 |
+ return (result < 0) ? result : 0;
|
| 2084 |
}
|
| 2085 |
|
| 2086 |
/*
|
| 2087 |
@@ -394,8 +415,9 @@ out:
|
| 2088 |
* This is the only part of the journaling code which really needs to be
|
| 2089 |
* aware of transaction aborts. Checkpointing involves writing to the
|
| 2090 |
* main filesystem area rather than to the journal, so it can proceed
|
| 2091 |
- * even in abort state, but we must not update the journal superblock if
|
| 2092 |
- * we have an abort error outstanding.
|
| 2093 |
+ * even in abort state, but we must not update the super block if
|
| 2094 |
+ * checkpointing may have failed. Otherwise, we would lose some metadata
|
| 2095 |
+ * buffers which should be written-back to the filesystem.
|
| 2096 |
*/
|
| 2097 |
|
| 2098 |
int cleanup_journal_tail(journal_t *journal)
|
| 2099 |
@@ -404,6 +426,9 @@ int cleanup_journal_tail(journal_t *journal)
|
| 2100 |
tid_t first_tid;
|
| 2101 |
unsigned long blocknr, freed;
|
| 2102 |
|
| 2103 |
+ if (is_journal_aborted(journal))
|
| 2104 |
+ return 1;
|
| 2105 |
+
|
| 2106 |
/* OK, work out the oldest transaction remaining in the log, and
|
| 2107 |
* the log block it starts at.
|
| 2108 |
*
|
| 2109 |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c
|
| 2110 |
index aa7143a..9e4fa52 100644
|
| 2111 |
--- a/fs/jbd/journal.c
|
| 2112 |
+++ b/fs/jbd/journal.c
|
| 2113 |
@@ -1121,9 +1121,12 @@ recovery_error:
|
| 2114 |
*
|
| 2115 |
* Release a journal_t structure once it is no longer in use by the
|
| 2116 |
* journaled object.
|
| 2117 |
+ * Return <0 if we couldn't clean up the journal.
|
| 2118 |
*/
|
| 2119 |
-void journal_destroy(journal_t *journal)
|
| 2120 |
+int journal_destroy(journal_t *journal)
|
| 2121 |
{
|
| 2122 |
+ int err = 0;
|
| 2123 |
+
|
| 2124 |
/* Wait for the commit thread to wake up and die. */
|
| 2125 |
journal_kill_thread(journal);
|
| 2126 |
|
| 2127 |
@@ -1146,11 +1149,16 @@ void journal_destroy(journal_t *journal)
|
| 2128 |
J_ASSERT(journal->j_checkpoint_transactions == NULL);
|
| 2129 |
spin_unlock(&journal->j_list_lock);
|
| 2130 |
|
| 2131 |
- /* We can now mark the journal as empty. */
|
| 2132 |
- journal->j_tail = 0;
|
| 2133 |
- journal->j_tail_sequence = ++journal->j_transaction_sequence;
|
| 2134 |
if (journal->j_sb_buffer) {
|
| 2135 |
- journal_update_superblock(journal, 1);
|
| 2136 |
+ if (!is_journal_aborted(journal)) {
|
| 2137 |
+ /* We can now mark the journal as empty. */
|
| 2138 |
+ journal->j_tail = 0;
|
| 2139 |
+ journal->j_tail_sequence =
|
| 2140 |
+ ++journal->j_transaction_sequence;
|
| 2141 |
+ journal_update_superblock(journal, 1);
|
| 2142 |
+ } else {
|
| 2143 |
+ err = -EIO;
|
| 2144 |
+ }
|
| 2145 |
brelse(journal->j_sb_buffer);
|
| 2146 |
}
|
| 2147 |
|
| 2148 |
@@ -1160,6 +1168,8 @@ void journal_destroy(journal_t *journal)
|
| 2149 |
journal_destroy_revoke(journal);
|
| 2150 |
kfree(journal->j_wbuf);
|
| 2151 |
kfree(journal);
|
| 2152 |
+
|
| 2153 |
+ return err;
|
| 2154 |
}
|
| 2155 |
|
| 2156 |
|
| 2157 |
@@ -1359,10 +1369,16 @@ int journal_flush(journal_t *journal)
|
| 2158 |
spin_lock(&journal->j_list_lock);
|
| 2159 |
while (!err && journal->j_checkpoint_transactions != NULL) {
|
| 2160 |
spin_unlock(&journal->j_list_lock);
|
| 2161 |
+ mutex_lock(&journal->j_checkpoint_mutex);
|
| 2162 |
err = log_do_checkpoint(journal);
|
| 2163 |
+ mutex_unlock(&journal->j_checkpoint_mutex);
|
| 2164 |
spin_lock(&journal->j_list_lock);
|
| 2165 |
}
|
| 2166 |
spin_unlock(&journal->j_list_lock);
|
| 2167 |
+
|
| 2168 |
+ if (is_journal_aborted(journal))
|
| 2169 |
+ return -EIO;
|
| 2170 |
+
|
| 2171 |
cleanup_journal_tail(journal);
|
| 2172 |
|
| 2173 |
/* Finally, mark the journal as really needing no recovery.
|
| 2174 |
@@ -1384,7 +1400,7 @@ int journal_flush(journal_t *journal)
|
| 2175 |
J_ASSERT(journal->j_head == journal->j_tail);
|
| 2176 |
J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence);
|
| 2177 |
spin_unlock(&journal->j_state_lock);
|
| 2178 |
- return err;
|
| 2179 |
+ return 0;
|
| 2180 |
}
|
| 2181 |
|
| 2182 |
/**
|
| 2183 |
diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c
|
| 2184 |
index 43bc5e5..db5e982 100644
|
| 2185 |
--- a/fs/jbd/recovery.c
|
| 2186 |
+++ b/fs/jbd/recovery.c
|
| 2187 |
@@ -223,7 +223,7 @@ do { \
|
| 2188 |
*/
|
| 2189 |
int journal_recover(journal_t *journal)
|
| 2190 |
{
|
| 2191 |
- int err;
|
| 2192 |
+ int err, err2;
|
| 2193 |
journal_superblock_t * sb;
|
| 2194 |
|
| 2195 |
struct recovery_info info;
|
| 2196 |
@@ -261,7 +261,10 @@ int journal_recover(journal_t *journal)
|
| 2197 |
journal->j_transaction_sequence = ++info.end_transaction;
|
| 2198 |
|
| 2199 |
journal_clear_revoke(journal);
|
| 2200 |
- sync_blockdev(journal->j_fs_dev);
|
| 2201 |
+ err2 = sync_blockdev(journal->j_fs_dev);
|
| 2202 |
+ if (!err)
|
| 2203 |
+ err = err2;
|
| 2204 |
+
|
| 2205 |
return err;
|
| 2206 |
}
|
| 2207 |
|
| 2208 |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
|
| 2209 |
index f3ada04..8b84227 100644
|
| 2210 |
--- a/fs/proc/task_mmu.c
|
| 2211 |
+++ b/fs/proc/task_mmu.c
|
| 2212 |
@@ -563,9 +563,9 @@ static u64 swap_pte_to_pagemap_entry(pte_t pte)
|
| 2213 |
return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
|
| 2214 |
}
|
| 2215 |
|
| 2216 |
-static unsigned long pte_to_pagemap_entry(pte_t pte)
|
| 2217 |
+static u64 pte_to_pagemap_entry(pte_t pte)
|
| 2218 |
{
|
| 2219 |
- unsigned long pme = 0;
|
| 2220 |
+ u64 pme = 0;
|
| 2221 |
if (is_swap_pte(pte))
|
| 2222 |
pme = PM_PFRAME(swap_pte_to_pagemap_entry(pte))
|
| 2223 |
| PM_PSHIFT(PAGE_SHIFT) | PM_SWAP;
|
| 2224 |
diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c
|
| 2225 |
index d700dac..c903130 100644
|
| 2226 |
--- a/fs/xfs/xfs_rename.c
|
| 2227 |
+++ b/fs/xfs/xfs_rename.c
|
| 2228 |
@@ -212,7 +212,7 @@ xfs_rename(
|
| 2229 |
if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
|
| 2230 |
(target_dp->i_d.di_projid != src_ip->i_d.di_projid))) {
|
| 2231 |
error = XFS_ERROR(EXDEV);
|
| 2232 |
- xfs_rename_unlock4(inodes, XFS_ILOCK_SHARED);
|
| 2233 |
+ xfs_rename_unlock4(inodes, XFS_ILOCK_EXCL);
|
| 2234 |
xfs_trans_cancel(tp, cancel_flags);
|
| 2235 |
goto std_return;
|
| 2236 |
}
|
| 2237 |
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
|
| 2238 |
index 826f623..12413a1 100644
|
| 2239 |
--- a/include/linux/binfmts.h
|
| 2240 |
+++ b/include/linux/binfmts.h
|
| 2241 |
@@ -36,6 +36,7 @@ struct linux_binprm{
|
| 2242 |
unsigned long p; /* current top of mem */
|
| 2243 |
unsigned int sh_bang:1,
|
| 2244 |
misc_bang:1;
|
| 2245 |
+ unsigned int recursion_depth;
|
| 2246 |
struct file * file;
|
| 2247 |
int e_uid, e_gid;
|
| 2248 |
kernel_cap_t cap_post_exec_permitted;
|
| 2249 |
@@ -58,6 +59,7 @@ struct linux_binprm{
|
| 2250 |
#define BINPRM_FLAGS_EXECFD_BIT 1
|
| 2251 |
#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
|
| 2252 |
|
| 2253 |
+#define BINPRM_MAX_RECURSION 4
|
| 2254 |
|
| 2255 |
/*
|
| 2256 |
* This structure defines the functions that are used to load the binary formats that
|
| 2257 |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
|
| 2258 |
index 53ea933..73f4532 100644
|
| 2259 |
--- a/include/linux/blkdev.h
|
| 2260 |
+++ b/include/linux/blkdev.h
|
| 2261 |
@@ -623,6 +623,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn;
|
| 2262 |
* default timeout for SG_IO if none specified
|
| 2263 |
*/
|
| 2264 |
#define BLK_DEFAULT_SG_TIMEOUT (60 * HZ)
|
| 2265 |
+#define BLK_MIN_SG_TIMEOUT (7 * HZ)
|
| 2266 |
|
| 2267 |
#ifdef CONFIG_BOUNCE
|
| 2268 |
extern int init_emergency_isa_pool(void);
|
| 2269 |
diff --git a/include/linux/jbd.h b/include/linux/jbd.h
|
| 2270 |
index 07a9b52..0be86be 100644
|
| 2271 |
--- a/include/linux/jbd.h
|
| 2272 |
+++ b/include/linux/jbd.h
|
| 2273 |
@@ -908,7 +908,7 @@ extern int journal_set_features
|
| 2274 |
(journal_t *, unsigned long, unsigned long, unsigned long);
|
| 2275 |
extern int journal_create (journal_t *);
|
| 2276 |
extern int journal_load (journal_t *journal);
|
| 2277 |
-extern void journal_destroy (journal_t *);
|
| 2278 |
+extern int journal_destroy (journal_t *);
|
| 2279 |
extern int journal_recover (journal_t *journal);
|
| 2280 |
extern int journal_wipe (journal_t *, int);
|
| 2281 |
extern int journal_skip_recovery (journal_t *);
|
| 2282 |
diff --git a/include/linux/pnp.h b/include/linux/pnp.h
|
| 2283 |
index be764e5..53b70fd 100644
|
| 2284 |
--- a/include/linux/pnp.h
|
| 2285 |
+++ b/include/linux/pnp.h
|
| 2286 |
@@ -22,9 +22,11 @@ struct pnp_dev;
|
| 2287 |
* Resource Management
|
| 2288 |
*/
|
| 2289 |
#ifdef CONFIG_PNP
|
| 2290 |
-struct resource *pnp_get_resource(struct pnp_dev *, unsigned int, unsigned int);
|
| 2291 |
+struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned long type,
|
| 2292 |
+ unsigned int num);
|
| 2293 |
#else
|
| 2294 |
-static inline struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned int type, unsigned int num)
|
| 2295 |
+static inline struct resource *pnp_get_resource(struct pnp_dev *dev,
|
| 2296 |
+ unsigned long type, unsigned int num)
|
| 2297 |
{
|
| 2298 |
return NULL;
|
| 2299 |
}
|
| 2300 |
diff --git a/kernel/fork.c b/kernel/fork.c
|
| 2301 |
index 7ce2ebe..d8ad2c6 100644
|
| 2302 |
--- a/kernel/fork.c
|
| 2303 |
+++ b/kernel/fork.c
|
| 2304 |
@@ -313,17 +313,20 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
| 2305 |
file = tmp->vm_file;
|
| 2306 |
if (file) {
|
| 2307 |
struct inode *inode = file->f_path.dentry->d_inode;
|
| 2308 |
+ struct address_space *mapping = file->f_mapping;
|
| 2309 |
+
|
| 2310 |
get_file(file);
|
| 2311 |
if (tmp->vm_flags & VM_DENYWRITE)
|
| 2312 |
atomic_dec(&inode->i_writecount);
|
| 2313 |
-
|
| 2314 |
- /* insert tmp into the share list, just after mpnt */
|
| 2315 |
- spin_lock(&file->f_mapping->i_mmap_lock);
|
| 2316 |
+ spin_lock(&mapping->i_mmap_lock);
|
| 2317 |
+ if (tmp->vm_flags & VM_SHARED)
|
| 2318 |
+ mapping->i_mmap_writable++;
|
| 2319 |
tmp->vm_truncate_count = mpnt->vm_truncate_count;
|
| 2320 |
- flush_dcache_mmap_lock(file->f_mapping);
|
| 2321 |
+ flush_dcache_mmap_lock(mapping);
|
| 2322 |
+ /* insert tmp into the share list, just after mpnt */
|
| 2323 |
vma_prio_tree_add(tmp, mpnt);
|
| 2324 |
- flush_dcache_mmap_unlock(file->f_mapping);
|
| 2325 |
- spin_unlock(&file->f_mapping->i_mmap_lock);
|
| 2326 |
+ flush_dcache_mmap_unlock(mapping);
|
| 2327 |
+ spin_unlock(&mapping->i_mmap_lock);
|
| 2328 |
}
|
| 2329 |
|
| 2330 |
/*
|
| 2331 |
diff --git a/kernel/sched.c b/kernel/sched.c
|
| 2332 |
index a992cbe..92c0a70 100644
|
| 2333 |
--- a/kernel/sched.c
|
| 2334 |
+++ b/kernel/sched.c
|
| 2335 |
@@ -6500,7 +6500,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
| 2336 |
req = list_entry(rq->migration_queue.next,
|
| 2337 |
struct migration_req, list);
|
| 2338 |
list_del_init(&req->list);
|
| 2339 |
+ spin_unlock_irq(&rq->lock);
|
| 2340 |
complete(&req->done);
|
| 2341 |
+ spin_lock_irq(&rq->lock);
|
| 2342 |
}
|
| 2343 |
spin_unlock_irq(&rq->lock);
|
| 2344 |
break;
|
| 2345 |
@@ -6802,15 +6804,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
|
| 2346 |
struct sched_domain *tmp;
|
| 2347 |
|
| 2348 |
/* Remove the sched domains which do not contribute to scheduling. */
|
| 2349 |
- for (tmp = sd; tmp; tmp = tmp->parent) {
|
| 2350 |
+ for (tmp = sd; tmp; ) {
|
| 2351 |
struct sched_domain *parent = tmp->parent;
|
| 2352 |
if (!parent)
|
| 2353 |
break;
|
| 2354 |
+
|
| 2355 |
if (sd_parent_degenerate(tmp, parent)) {
|
| 2356 |
tmp->parent = parent->parent;
|
| 2357 |
if (parent->parent)
|
| 2358 |
parent->parent->child = tmp;
|
| 2359 |
- }
|
| 2360 |
+ } else
|
| 2361 |
+ tmp = tmp->parent;
|
| 2362 |
}
|
| 2363 |
|
| 2364 |
if (sd && sd_degenerate(sd)) {
|
| 2365 |
diff --git a/net/atm/svc.c b/net/atm/svc.c
|
| 2366 |
index de1e4f2..8fb54dc 100644
|
| 2367 |
--- a/net/atm/svc.c
|
| 2368 |
+++ b/net/atm/svc.c
|
| 2369 |
@@ -293,7 +293,10 @@ static int svc_listen(struct socket *sock,int backlog)
|
| 2370 |
error = -EINVAL;
|
| 2371 |
goto out;
|
| 2372 |
}
|
| 2373 |
- vcc_insert_socket(sk);
|
| 2374 |
+ if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
|
| 2375 |
+ error = -EADDRINUSE;
|
| 2376 |
+ goto out;
|
| 2377 |
+ }
|
| 2378 |
set_bit(ATM_VF_WAITING, &vcc->flags);
|
| 2379 |
prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
|
| 2380 |
sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
|
| 2381 |
@@ -307,6 +310,7 @@ static int svc_listen(struct socket *sock,int backlog)
|
| 2382 |
goto out;
|
| 2383 |
}
|
| 2384 |
set_bit(ATM_VF_LISTEN,&vcc->flags);
|
| 2385 |
+ vcc_insert_socket(sk);
|
| 2386 |
sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
|
| 2387 |
error = -sk->sk_err;
|
| 2388 |
out:
|
| 2389 |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
| 2390 |
index 57e26fa..915e6b7 100644
|
| 2391 |
--- a/net/ipv4/udp.c
|
| 2392 |
+++ b/net/ipv4/udp.c
|
| 2393 |
@@ -302,7 +302,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
|
| 2394 |
return result;
|
| 2395 |
}
|
| 2396 |
|
| 2397 |
-static inline struct sock *udp_v4_mcast_next(struct sock *sk,
|
| 2398 |
+static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk,
|
| 2399 |
__be16 loc_port, __be32 loc_addr,
|
| 2400 |
__be16 rmt_port, __be32 rmt_addr,
|
| 2401 |
int dif)
|
| 2402 |
@@ -314,7 +314,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
|
| 2403 |
sk_for_each_from(s, node) {
|
| 2404 |
struct inet_sock *inet = inet_sk(s);
|
| 2405 |
|
| 2406 |
- if (s->sk_hash != hnum ||
|
| 2407 |
+ if (!net_eq(sock_net(s), net) ||
|
| 2408 |
+ s->sk_hash != hnum ||
|
| 2409 |
(inet->daddr && inet->daddr != rmt_addr) ||
|
| 2410 |
(inet->dport != rmt_port && inet->dport) ||
|
| 2411 |
(inet->rcv_saddr && inet->rcv_saddr != loc_addr) ||
|
| 2412 |
@@ -1097,15 +1098,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
|
| 2413 |
read_lock(&udp_hash_lock);
|
| 2414 |
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
|
| 2415 |
dif = skb->dev->ifindex;
|
| 2416 |
- sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
|
| 2417 |
+ sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
|
| 2418 |
if (sk) {
|
| 2419 |
struct sock *sknext = NULL;
|
| 2420 |
|
| 2421 |
do {
|
| 2422 |
struct sk_buff *skb1 = skb;
|
| 2423 |
|
| 2424 |
- sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr,
|
| 2425 |
- uh->source, saddr, dif);
|
| 2426 |
+ sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest,
|
| 2427 |
+ daddr, uh->source, saddr,
|
| 2428 |
+ dif);
|
| 2429 |
if (sknext)
|
| 2430 |
skb1 = skb_clone(skb, GFP_ATOMIC);
|
| 2431 |
|
| 2432 |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
| 2433 |
index a6aecf7..e53d101 100644
|
| 2434 |
--- a/net/ipv6/udp.c
|
| 2435 |
+++ b/net/ipv6/udp.c
|
| 2436 |
@@ -313,7 +313,7 @@ drop:
|
| 2437 |
return -1;
|
| 2438 |
}
|
| 2439 |
|
| 2440 |
-static struct sock *udp_v6_mcast_next(struct sock *sk,
|
| 2441 |
+static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
|
| 2442 |
__be16 loc_port, struct in6_addr *loc_addr,
|
| 2443 |
__be16 rmt_port, struct in6_addr *rmt_addr,
|
| 2444 |
int dif)
|
| 2445 |
@@ -325,7 +325,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
|
| 2446 |
sk_for_each_from(s, node) {
|
| 2447 |
struct inet_sock *inet = inet_sk(s);
|
| 2448 |
|
| 2449 |
- if (sock_net(s) != sock_net(sk))
|
| 2450 |
+ if (!net_eq(sock_net(s), net))
|
| 2451 |
continue;
|
| 2452 |
|
| 2453 |
if (s->sk_hash == num && s->sk_family == PF_INET6) {
|
| 2454 |
@@ -368,14 +368,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
|
| 2455 |
read_lock(&udp_hash_lock);
|
| 2456 |
sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
|
| 2457 |
dif = inet6_iif(skb);
|
| 2458 |
- sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
|
| 2459 |
+ sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
|
| 2460 |
if (!sk) {
|
| 2461 |
kfree_skb(skb);
|
| 2462 |
goto out;
|
| 2463 |
}
|
| 2464 |
|
| 2465 |
sk2 = sk;
|
| 2466 |
- while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr,
|
| 2467 |
+ while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr,
|
| 2468 |
uh->source, saddr, dif))) {
|
| 2469 |
struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC);
|
| 2470 |
if (buff) {
|
| 2471 |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
| 2472 |
index b0785ef..8e66fe0 100644
|
| 2473 |
--- a/net/unix/af_unix.c
|
| 2474 |
+++ b/net/unix/af_unix.c
|
| 2475 |
@@ -2230,7 +2230,7 @@ static int unix_net_init(struct net *net)
|
| 2476 |
#endif
|
| 2477 |
error = 0;
|
| 2478 |
out:
|
| 2479 |
- return 0;
|
| 2480 |
+ return error;
|
| 2481 |
}
|
| 2482 |
|
| 2483 |
static void unix_net_exit(struct net *net)
|
| 2484 |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
|
| 2485 |
index 2f283ea..de5ee8f 100644
|
| 2486 |
--- a/sound/pci/emu10k1/emu10k1_main.c
|
| 2487 |
+++ b/sound/pci/emu10k1/emu10k1_main.c
|
| 2488 |
@@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
| 2489 |
.ca0151_chip = 1,
|
| 2490 |
.spk71 = 1,
|
| 2491 |
.spdif_bug = 1,
|
| 2492 |
+ .invert_shared_spdif = 1, /* digital/analog switch swapped */
|
| 2493 |
.ac97_chip = 1} ,
|
| 2494 |
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
|
| 2495 |
.driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]",
|
| 2496 |
@@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
| 2497 |
.ca0151_chip = 1,
|
| 2498 |
.spk71 = 1,
|
| 2499 |
.spdif_bug = 1,
|
| 2500 |
+ .invert_shared_spdif = 1, /* digital/analog switch swapped */
|
| 2501 |
.ac97_chip = 1} ,
|
| 2502 |
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
|
| 2503 |
.driver = "Audigy2", .name = "Audigy 2 ZS [2001]",
|
| 2504 |
@@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
| 2505 |
.ca0151_chip = 1,
|
| 2506 |
.spk71 = 1,
|
| 2507 |
.spdif_bug = 1,
|
| 2508 |
+ .invert_shared_spdif = 1, /* digital/analog switch swapped */
|
| 2509 |
.ac97_chip = 1} ,
|
| 2510 |
/* Audigy 2 */
|
| 2511 |
/* Tested by James@superbug.co.uk 3rd July 2005 */
|
| 2512 |
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
|
| 2513 |
index 1e5aff5..2fe4ea1 100644
|
| 2514 |
--- a/sound/pci/hda/hda_proc.c
|
| 2515 |
+++ b/sound/pci/hda/hda_proc.c
|
| 2516 |
@@ -216,7 +216,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
|
| 2517 |
unsigned int caps, val;
|
| 2518 |
|
| 2519 |
caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
|
| 2520 |
- snd_iprintf(buffer, " Pincap 0x08%x:", caps);
|
| 2521 |
+ snd_iprintf(buffer, " Pincap 0x%08x:", caps);
|
| 2522 |
if (caps & AC_PINCAP_IN)
|
| 2523 |
snd_iprintf(buffer, " IN");
|
| 2524 |
if (caps & AC_PINCAP_OUT)
|
| 2525 |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
|
| 2526 |
index e8003d9..cb13307 100644
|
| 2527 |
--- a/sound/pci/hda/patch_analog.c
|
| 2528 |
+++ b/sound/pci/hda/patch_analog.c
|
| 2529 |
@@ -2247,8 +2247,12 @@ static struct hda_verb ad1988_spdif_init_verbs[] = {
|
| 2530 |
|
| 2531 |
/* AD1989 has no ADC -> SPDIF route */
|
| 2532 |
static struct hda_verb ad1989_spdif_init_verbs[] = {
|
| 2533 |
- /* SPDIF out pin */
|
| 2534 |
+ /* SPDIF-1 out pin */
|
| 2535 |
+ {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
| 2536 |
{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
|
| 2537 |
+ /* SPDIF-2/HDMI out pin */
|
| 2538 |
+ {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
| 2539 |
+ {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
|
| 2540 |
{ }
|
| 2541 |
};
|
| 2542 |
|
| 2543 |
@@ -2868,6 +2872,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = {
|
| 2544 |
SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
|
| 2545 |
SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
|
| 2546 |
SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG),
|
| 2547 |
+ SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG),
|
| 2548 |
{}
|
| 2549 |
};
|
| 2550 |
|
| 2551 |
@@ -3842,6 +3847,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
|
| 2552 |
|
| 2553 |
static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
|
| 2554 |
SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
|
| 2555 |
+ SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
|
| 2556 |
+ SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
|
| 2557 |
+ SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
|
| 2558 |
SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
|
| 2559 |
{}
|
| 2560 |
};
|
| 2561 |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
| 2562 |
index 6602516..a1a3a34 100644
|
| 2563 |
--- a/sound/pci/hda/patch_realtek.c
|
| 2564 |
+++ b/sound/pci/hda/patch_realtek.c
|
| 2565 |
@@ -100,6 +100,7 @@ enum {
|
| 2566 |
ALC262_BENQ_T31,
|
| 2567 |
ALC262_ULTRA,
|
| 2568 |
ALC262_LENOVO_3000,
|
| 2569 |
+ ALC262_NEC,
|
| 2570 |
ALC262_AUTO,
|
| 2571 |
ALC262_MODEL_LAST /* last tag */
|
| 2572 |
};
|
| 2573 |
@@ -291,6 +292,13 @@ struct alc_spec {
|
| 2574 |
/* for PLL fix */
|
| 2575 |
hda_nid_t pll_nid;
|
| 2576 |
unsigned int pll_coef_idx, pll_coef_bit;
|
| 2577 |
+
|
| 2578 |
+#ifdef SND_HDA_NEEDS_RESUME
|
| 2579 |
+#define ALC_MAX_PINS 16
|
| 2580 |
+ unsigned int num_pins;
|
| 2581 |
+ hda_nid_t pin_nids[ALC_MAX_PINS];
|
| 2582 |
+ unsigned int pin_cfgs[ALC_MAX_PINS];
|
| 2583 |
+#endif
|
| 2584 |
};
|
| 2585 |
|
| 2586 |
/*
|
| 2587 |
@@ -2722,6 +2730,64 @@ static void alc_free(struct hda_codec *codec)
|
| 2588 |
codec->spec = NULL; /* to be sure */
|
| 2589 |
}
|
| 2590 |
|
| 2591 |
+#ifdef SND_HDA_NEEDS_RESUME
|
| 2592 |
+static void store_pin_configs(struct hda_codec *codec)
|
| 2593 |
+{
|
| 2594 |
+ struct alc_spec *spec = codec->spec;
|
| 2595 |
+ hda_nid_t nid, end_nid;
|
| 2596 |
+
|
| 2597 |
+ end_nid = codec->start_nid + codec->num_nodes;
|
| 2598 |
+ for (nid = codec->start_nid; nid < end_nid; nid++) {
|
| 2599 |
+ unsigned int wid_caps = get_wcaps(codec, nid);
|
| 2600 |
+ unsigned int wid_type =
|
| 2601 |
+ (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
|
| 2602 |
+ if (wid_type != AC_WID_PIN)
|
| 2603 |
+ continue;
|
| 2604 |
+ if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids))
|
| 2605 |
+ break;
|
| 2606 |
+ spec->pin_nids[spec->num_pins] = nid;
|
| 2607 |
+ spec->pin_cfgs[spec->num_pins] =
|
| 2608 |
+ snd_hda_codec_read(codec, nid, 0,
|
| 2609 |
+ AC_VERB_GET_CONFIG_DEFAULT, 0);
|
| 2610 |
+ spec->num_pins++;
|
| 2611 |
+ }
|
| 2612 |
+}
|
| 2613 |
+
|
| 2614 |
+static void resume_pin_configs(struct hda_codec *codec)
|
| 2615 |
+{
|
| 2616 |
+ struct alc_spec *spec = codec->spec;
|
| 2617 |
+ int i;
|
| 2618 |
+
|
| 2619 |
+ for (i = 0; i < spec->num_pins; i++) {
|
| 2620 |
+ hda_nid_t pin_nid = spec->pin_nids[i];
|
| 2621 |
+ unsigned int pin_config = spec->pin_cfgs[i];
|
| 2622 |
+ snd_hda_codec_write(codec, pin_nid, 0,
|
| 2623 |
+ AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
|
| 2624 |
+ pin_config & 0x000000ff);
|
| 2625 |
+ snd_hda_codec_write(codec, pin_nid, 0,
|
| 2626 |
+ AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
|
| 2627 |
+ (pin_config & 0x0000ff00) >> 8);
|
| 2628 |
+ snd_hda_codec_write(codec, pin_nid, 0,
|
| 2629 |
+ AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
|
| 2630 |
+ (pin_config & 0x00ff0000) >> 16);
|
| 2631 |
+ snd_hda_codec_write(codec, pin_nid, 0,
|
| 2632 |
+ AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
|
| 2633 |
+ pin_config >> 24);
|
| 2634 |
+ }
|
| 2635 |
+}
|
| 2636 |
+
|
| 2637 |
+static int alc_resume(struct hda_codec *codec)
|
| 2638 |
+{
|
| 2639 |
+ resume_pin_configs(codec);
|
| 2640 |
+ codec->patch_ops.init(codec);
|
| 2641 |
+ snd_hda_codec_resume_amp(codec);
|
| 2642 |
+ snd_hda_codec_resume_cache(codec);
|
| 2643 |
+ return 0;
|
| 2644 |
+}
|
| 2645 |
+#else
|
| 2646 |
+#define store_pin_configs(codec)
|
| 2647 |
+#endif
|
| 2648 |
+
|
| 2649 |
/*
|
| 2650 |
*/
|
| 2651 |
static struct hda_codec_ops alc_patch_ops = {
|
| 2652 |
@@ -2730,6 +2796,9 @@ static struct hda_codec_ops alc_patch_ops = {
|
| 2653 |
.init = alc_init,
|
| 2654 |
.free = alc_free,
|
| 2655 |
.unsol_event = alc_unsol_event,
|
| 2656 |
+#ifdef SND_HDA_NEEDS_RESUME
|
| 2657 |
+ .resume = alc_resume,
|
| 2658 |
+#endif
|
| 2659 |
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
| 2660 |
.check_power_status = alc_check_power_status,
|
| 2661 |
#endif
|
| 2662 |
@@ -3776,6 +3845,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
|
| 2663 |
spec->num_mux_defs = 1;
|
| 2664 |
spec->input_mux = &spec->private_imux;
|
| 2665 |
|
| 2666 |
+ store_pin_configs(codec);
|
| 2667 |
return 1;
|
| 2668 |
}
|
| 2669 |
|
| 2670 |
@@ -5124,6 +5194,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
|
| 2671 |
}
|
| 2672 |
spec->num_mixers++;
|
| 2673 |
|
| 2674 |
+ store_pin_configs(codec);
|
| 2675 |
return 1;
|
| 2676 |
}
|
| 2677 |
|
| 2678 |
@@ -6554,6 +6625,7 @@ static int patch_alc882(struct hda_codec *codec)
|
| 2679 |
board_config = ALC885_MACPRO;
|
| 2680 |
break;
|
| 2681 |
case 0x106b1000: /* iMac 24 */
|
| 2682 |
+ case 0x106b2800: /* AppleTV */
|
| 2683 |
board_config = ALC885_IMAC24;
|
| 2684 |
break;
|
| 2685 |
case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
|
| 2686 |
@@ -6563,7 +6635,8 @@ static int patch_alc882(struct hda_codec *codec)
|
| 2687 |
break;
|
| 2688 |
default:
|
| 2689 |
/* ALC889A is handled better as ALC888-compatible */
|
| 2690 |
- if (codec->revision_id == 0x100103) {
|
| 2691 |
+ if (codec->revision_id == 0x100101 ||
|
| 2692 |
+ codec->revision_id == 0x100103) {
|
| 2693 |
alc_free(codec);
|
| 2694 |
return patch_alc883(codec);
|
| 2695 |
}
|
| 2696 |
@@ -7940,6 +8013,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
|
| 2697 |
static struct snd_pci_quirk alc883_cfg_tbl[] = {
|
| 2698 |
SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),
|
| 2699 |
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
|
| 2700 |
+ SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
|
| 2701 |
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
|
| 2702 |
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
|
| 2703 |
SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
|
| 2704 |
@@ -7990,6 +8064,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
|
| 2705 |
SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
|
| 2706 |
SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
|
| 2707 |
SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
|
| 2708 |
+ SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
|
| 2709 |
SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
|
| 2710 |
SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
|
| 2711 |
SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
|
| 2712 |
@@ -8948,6 +9023,41 @@ static void alc262_hippo1_unsol_event(struct hda_codec *codec,
|
| 2713 |
}
|
| 2714 |
|
| 2715 |
/*
|
| 2716 |
+ * nec model
|
| 2717 |
+ * 0x15 = headphone
|
| 2718 |
+ * 0x16 = internal speaker
|
| 2719 |
+ * 0x18 = external mic
|
| 2720 |
+ */
|
| 2721 |
+
|
| 2722 |
+static struct snd_kcontrol_new alc262_nec_mixer[] = {
|
| 2723 |
+ HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
|
| 2724 |
+ HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
|
| 2725 |
+
|
| 2726 |
+ HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
| 2727 |
+ HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
| 2728 |
+ HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
|
| 2729 |
+
|
| 2730 |
+ HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
| 2731 |
+ HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
| 2732 |
+ { } /* end */
|
| 2733 |
+};
|
| 2734 |
+
|
| 2735 |
+static struct hda_verb alc262_nec_verbs[] = {
|
| 2736 |
+ /* Unmute Speaker */
|
| 2737 |
+ {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
| 2738 |
+
|
| 2739 |
+ /* Headphone */
|
| 2740 |
+ {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
|
| 2741 |
+ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
| 2742 |
+
|
| 2743 |
+ /* External mic to headphone */
|
| 2744 |
+ {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
| 2745 |
+ /* External mic to speaker */
|
| 2746 |
+ {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
| 2747 |
+ {}
|
| 2748 |
+};
|
| 2749 |
+
|
| 2750 |
+/*
|
| 2751 |
* fujitsu model
|
| 2752 |
* 0x14 = headphone/spdif-out, 0x15 = internal speaker,
|
| 2753 |
* 0x1b = port replicator headphone out
|
| 2754 |
@@ -9693,6 +9803,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
|
| 2755 |
if (err < 0)
|
| 2756 |
return err;
|
| 2757 |
|
| 2758 |
+ store_pin_configs(codec);
|
| 2759 |
return 1;
|
| 2760 |
}
|
| 2761 |
|
| 2762 |
@@ -9731,11 +9842,13 @@ static const char *alc262_models[ALC262_MODEL_LAST] = {
|
| 2763 |
[ALC262_SONY_ASSAMD] = "sony-assamd",
|
| 2764 |
[ALC262_ULTRA] = "ultra",
|
| 2765 |
[ALC262_LENOVO_3000] = "lenovo-3000",
|
| 2766 |
+ [ALC262_NEC] = "nec",
|
| 2767 |
[ALC262_AUTO] = "auto",
|
| 2768 |
};
|
| 2769 |
|
| 2770 |
static struct snd_pci_quirk alc262_cfg_tbl[] = {
|
| 2771 |
SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
|
| 2772 |
+ SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
|
| 2773 |
SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC),
|
| 2774 |
SND_PCI_QUIRK(0x103c, 0x12ff, "HP xw4550", ALC262_HP_BPC),
|
| 2775 |
SND_PCI_QUIRK(0x103c, 0x1306, "HP xw8600", ALC262_HP_BPC),
|
| 2776 |
@@ -9946,6 +10059,16 @@ static struct alc_config_preset alc262_presets[] = {
|
| 2777 |
.input_mux = &alc262_fujitsu_capture_source,
|
| 2778 |
.unsol_event = alc262_lenovo_3000_unsol_event,
|
| 2779 |
},
|
| 2780 |
+ [ALC262_NEC] = {
|
| 2781 |
+ .mixers = { alc262_nec_mixer },
|
| 2782 |
+ .init_verbs = { alc262_nec_verbs },
|
| 2783 |
+ .num_dacs = ARRAY_SIZE(alc262_dac_nids),
|
| 2784 |
+ .dac_nids = alc262_dac_nids,
|
| 2785 |
+ .hp_nid = 0x03,
|
| 2786 |
+ .num_channel_mode = ARRAY_SIZE(alc262_modes),
|
| 2787 |
+ .channel_mode = alc262_modes,
|
| 2788 |
+ .input_mux = &alc262_capture_source,
|
| 2789 |
+ },
|
| 2790 |
};
|
| 2791 |
|
| 2792 |
static int patch_alc262(struct hda_codec *codec)
|
| 2793 |
@@ -10712,6 +10835,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
|
| 2794 |
if (err < 0)
|
| 2795 |
return err;
|
| 2796 |
|
| 2797 |
+ store_pin_configs(codec);
|
| 2798 |
return 1;
|
| 2799 |
}
|
| 2800 |
|
| 2801 |
@@ -10758,6 +10882,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
|
| 2802 |
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
|
| 2803 |
SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA),
|
| 2804 |
SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA),
|
| 2805 |
+ SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA),
|
| 2806 |
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
|
| 2807 |
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
|
| 2808 |
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
|
| 2809 |
@@ -10990,6 +11115,14 @@ static hda_nid_t alc269_adc_nids[1] = {
|
| 2810 |
0x08,
|
| 2811 |
};
|
| 2812 |
|
| 2813 |
+static hda_nid_t alc269_capsrc_nids[1] = {
|
| 2814 |
+ 0x23,
|
| 2815 |
+};
|
| 2816 |
+
|
| 2817 |
+/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
|
| 2818 |
+ * not a mux!
|
| 2819 |
+ */
|
| 2820 |
+
|
| 2821 |
static struct hda_input_mux alc269_eeepc_dmic_capture_source = {
|
| 2822 |
.num_items = 2,
|
| 2823 |
.items = {
|
| 2824 |
@@ -11356,6 +11489,10 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
| 2825 |
spec->init_verbs[spec->num_init_verbs++] = alc269_init_verbs;
|
| 2826 |
spec->num_mux_defs = 1;
|
| 2827 |
spec->input_mux = &spec->private_imux;
|
| 2828 |
+ /* set default input source */
|
| 2829 |
+ snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
|
| 2830 |
+ 0, AC_VERB_SET_CONNECT_SEL,
|
| 2831 |
+ spec->input_mux->items[0].index);
|
| 2832 |
|
| 2833 |
err = alc_auto_add_mic_boost(codec);
|
| 2834 |
if (err < 0)
|
| 2835 |
@@ -11364,6 +11501,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
| 2836 |
spec->mixers[spec->num_mixers] = alc269_capture_mixer;
|
| 2837 |
spec->num_mixers++;
|
| 2838 |
|
| 2839 |
+ store_pin_configs(codec);
|
| 2840 |
return 1;
|
| 2841 |
}
|
| 2842 |
|
| 2843 |
@@ -11488,6 +11626,7 @@ static int patch_alc269(struct hda_codec *codec)
|
| 2844 |
|
| 2845 |
spec->adc_nids = alc269_adc_nids;
|
| 2846 |
spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
|
| 2847 |
+ spec->capsrc_nids = alc269_capsrc_nids;
|
| 2848 |
|
| 2849 |
codec->patch_ops = alc_patch_ops;
|
| 2850 |
if (board_config == ALC269_AUTO)
|
| 2851 |
@@ -12431,6 +12570,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
|
| 2852 |
spec->mixers[spec->num_mixers] = alc861_capture_mixer;
|
| 2853 |
spec->num_mixers++;
|
| 2854 |
|
| 2855 |
+ store_pin_configs(codec);
|
| 2856 |
return 1;
|
| 2857 |
}
|
| 2858 |
|
| 2859 |
@@ -13542,6 +13682,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
|
| 2860 |
if (err < 0)
|
| 2861 |
return err;
|
| 2862 |
|
| 2863 |
+ store_pin_configs(codec);
|
| 2864 |
return 1;
|
| 2865 |
}
|
| 2866 |
|
| 2867 |
@@ -14789,6 +14930,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
|
| 2868 |
|
| 2869 |
spec->mixers[spec->num_mixers] = alc662_capture_mixer;
|
| 2870 |
spec->num_mixers++;
|
| 2871 |
+
|
| 2872 |
+ store_pin_configs(codec);
|
| 2873 |
return 1;
|
| 2874 |
}
|
| 2875 |
|
| 2876 |
@@ -14846,6 +14989,9 @@ static int patch_alc662(struct hda_codec *codec)
|
| 2877 |
if (codec->vendor_id == 0x10ec0663) {
|
| 2878 |
spec->stream_name_analog = "ALC663 Analog";
|
| 2879 |
spec->stream_name_digital = "ALC663 Digital";
|
| 2880 |
+ } else if (codec->vendor_id == 0x10ec0272) {
|
| 2881 |
+ spec->stream_name_analog = "ALC272 Analog";
|
| 2882 |
+ spec->stream_name_digital = "ALC272 Digital";
|
| 2883 |
} else {
|
| 2884 |
spec->stream_name_analog = "ALC662 Analog";
|
| 2885 |
spec->stream_name_digital = "ALC662 Digital";
|
| 2886 |
@@ -14883,6 +15029,7 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
|
| 2887 |
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
|
| 2888 |
{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
|
| 2889 |
{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
|
| 2890 |
+ { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
|
| 2891 |
{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
|
| 2892 |
.patch = patch_alc861 },
|
| 2893 |
{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
|
| 2894 |
@@ -14896,9 +15043,12 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
|
| 2895 |
{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
|
| 2896 |
{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
|
| 2897 |
{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 },
|
| 2898 |
+ { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
|
| 2899 |
+ .patch = patch_alc882 }, /* should be patch_alc883() in future */
|
| 2900 |
{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
|
| 2901 |
.patch = patch_alc882 }, /* should be patch_alc883() in future */
|
| 2902 |
{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
|
| 2903 |
+ { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 },
|
| 2904 |
{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 },
|
| 2905 |
{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 },
|
| 2906 |
{} /* terminator */
|
| 2907 |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
|
| 2908 |
index 732ce13..1d96aed 100644
|
| 2909 |
--- a/sound/pci/hda/patch_sigmatel.c
|
| 2910 |
+++ b/sound/pci/hda/patch_sigmatel.c
|
| 2911 |
@@ -105,6 +105,7 @@ enum {
|
| 2912 |
STAC_MACBOOK_PRO_V2,
|
| 2913 |
STAC_IMAC_INTEL,
|
| 2914 |
STAC_IMAC_INTEL_20,
|
| 2915 |
+ STAC_ECS_202,
|
| 2916 |
STAC_922X_DELL_D81,
|
| 2917 |
STAC_922X_DELL_D82,
|
| 2918 |
STAC_922X_DELL_M81,
|
| 2919 |
@@ -547,8 +548,8 @@ static struct hda_verb dell_eq_core_init[] = {
|
| 2920 |
{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
|
| 2921 |
/* setup audio connections */
|
| 2922 |
{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
|
| 2923 |
- { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
|
| 2924 |
- { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02},
|
| 2925 |
+ { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x02},
|
| 2926 |
+ { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x01},
|
| 2927 |
/* setup adcs to point to mixer */
|
| 2928 |
{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
|
| 2929 |
{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
|
| 2930 |
@@ -1310,7 +1311,7 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
|
| 2931 |
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
|
| 2932 |
"DFI LanParty", STAC_92HD73XX_REF),
|
| 2933 |
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
|
| 2934 |
- "unknown Dell", STAC_DELL_M6),
|
| 2935 |
+ "Dell Studio 1535", STAC_DELL_M6),
|
| 2936 |
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
|
| 2937 |
"unknown Dell", STAC_DELL_M6),
|
| 2938 |
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
|
| 2939 |
@@ -1323,6 +1324,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
|
| 2940 |
"unknown Dell", STAC_DELL_M6),
|
| 2941 |
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
|
| 2942 |
"unknown Dell", STAC_DELL_M6),
|
| 2943 |
+ SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
|
| 2944 |
+ "Dell Studio 15", STAC_DELL_M6),
|
| 2945 |
{} /* terminator */
|
| 2946 |
};
|
| 2947 |
|
| 2948 |
@@ -1478,6 +1481,11 @@ static unsigned int intel_mac_v5_pin_configs[10] = {
|
| 2949 |
0x400000fc, 0x400000fb,
|
| 2950 |
};
|
| 2951 |
|
| 2952 |
+static unsigned int ecs202_pin_configs[10] = {
|
| 2953 |
+ 0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
|
| 2954 |
+ 0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
|
| 2955 |
+ 0x9037012e, 0x40e000f2,
|
| 2956 |
+};
|
| 2957 |
|
| 2958 |
static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
|
| 2959 |
[STAC_D945_REF] = ref922x_pin_configs,
|
| 2960 |
@@ -1496,6 +1504,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
|
| 2961 |
[STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
|
| 2962 |
[STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
|
| 2963 |
[STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
|
| 2964 |
+ [STAC_ECS_202] = ecs202_pin_configs,
|
| 2965 |
[STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
|
| 2966 |
[STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,
|
| 2967 |
[STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
|
| 2968 |
@@ -1519,6 +1528,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
|
| 2969 |
[STAC_MACBOOK_PRO_V2] = "macbook-pro",
|
| 2970 |
[STAC_IMAC_INTEL] = "imac-intel",
|
| 2971 |
[STAC_IMAC_INTEL_20] = "imac-intel-20",
|
| 2972 |
+ [STAC_ECS_202] = "ecs202",
|
| 2973 |
[STAC_922X_DELL_D81] = "dell-d81",
|
| 2974 |
[STAC_922X_DELL_D82] = "dell-d82",
|
| 2975 |
[STAC_922X_DELL_M81] = "dell-m81",
|
| 2976 |
@@ -1605,6 +1615,33 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
|
| 2977 |
"unknown Dell", STAC_922X_DELL_D81),
|
| 2978 |
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
|
| 2979 |
"Dell XPS M1210", STAC_922X_DELL_M82),
|
| 2980 |
+ /* ECS/PC Chips boards */
|
| 2981 |
+ SND_PCI_QUIRK(0x1019, 0x2144,
|
| 2982 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2983 |
+ SND_PCI_QUIRK(0x1019, 0x2608,
|
| 2984 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2985 |
+ SND_PCI_QUIRK(0x1019, 0x2633,
|
| 2986 |
+ "ECS/PC chips P17G/1333", STAC_ECS_202),
|
| 2987 |
+ SND_PCI_QUIRK(0x1019, 0x2811,
|
| 2988 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2989 |
+ SND_PCI_QUIRK(0x1019, 0x2812,
|
| 2990 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2991 |
+ SND_PCI_QUIRK(0x1019, 0x2813,
|
| 2992 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2993 |
+ SND_PCI_QUIRK(0x1019, 0x2814,
|
| 2994 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2995 |
+ SND_PCI_QUIRK(0x1019, 0x2815,
|
| 2996 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2997 |
+ SND_PCI_QUIRK(0x1019, 0x2816,
|
| 2998 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 2999 |
+ SND_PCI_QUIRK(0x1019, 0x2817,
|
| 3000 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 3001 |
+ SND_PCI_QUIRK(0x1019, 0x2818,
|
| 3002 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 3003 |
+ SND_PCI_QUIRK(0x1019, 0x2819,
|
| 3004 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 3005 |
+ SND_PCI_QUIRK(0x1019, 0x2820,
|
| 3006 |
+ "ECS/PC chips", STAC_ECS_202),
|
| 3007 |
{} /* terminator */
|
| 3008 |
};
|
| 3009 |
|
| 3010 |
@@ -2468,7 +2505,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
|
| 3011 |
}
|
| 3012 |
}
|
| 3013 |
|
| 3014 |
- if (cfg->hp_outs > 1) {
|
| 3015 |
+ if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
|
| 3016 |
err = stac92xx_add_control(spec,
|
| 3017 |
STAC_CTL_WIDGET_HP_SWITCH,
|
| 3018 |
"Headphone as Line Out Switch", 0);
|