Contents of /trunk/kernel26-magellan/patches-2.6.31-r3/0101-2.6.31.2-all-fixes.patch
Parent Directory
|
Revision Log
Revision 946 -
(show annotations)
(download)
Thu Dec 10 13:02:09 2009 UTC (14 years, 5 months ago) by niro
File size: 250217 byte(s)
Thu Dec 10 13:02:09 2009 UTC (14 years, 5 months ago) by niro
File size: 250217 byte(s)
-2.6.31-magellan-r3: updated to linux-2.6.31.7
1 | diff --git a/MAINTAINERS b/MAINTAINERS |
2 | index 8dca9d8..2ccc21c 100644 |
3 | --- a/MAINTAINERS |
4 | +++ b/MAINTAINERS |
5 | @@ -897,6 +897,12 @@ W: http://wireless.kernel.org/en/users/Drivers/ar9170 |
6 | S: Maintained |
7 | F: drivers/net/wireless/ath/ar9170/ |
8 | |
9 | +ATK0110 HWMON DRIVER |
10 | +M: Luca Tettamanti <kronos.it@gmail.com> |
11 | +L: lm-sensors@lm-sensors.org |
12 | +S: Maintained |
13 | +F: drivers/hwmon/asus_atk0110.c |
14 | + |
15 | ATI_REMOTE2 DRIVER |
16 | M: Ville Syrjala <syrjala@sci.fi> |
17 | S: Maintained |
18 | diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c |
19 | index e302dae..8e059e5 100644 |
20 | --- a/arch/alpha/kernel/core_marvel.c |
21 | +++ b/arch/alpha/kernel/core_marvel.c |
22 | @@ -1016,7 +1016,7 @@ marvel_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *m |
23 | { |
24 | struct marvel_agp_aperture *aper = agp->aperture.sysdata; |
25 | return iommu_bind(aper->arena, aper->pg_start + pg_start, |
26 | - mem->page_count, mem->memory); |
27 | + mem->page_count, mem->pages); |
28 | } |
29 | |
30 | static int |
31 | diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c |
32 | index 319fcb7..7668649 100644 |
33 | --- a/arch/alpha/kernel/core_titan.c |
34 | +++ b/arch/alpha/kernel/core_titan.c |
35 | @@ -680,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *me |
36 | { |
37 | struct titan_agp_aperture *aper = agp->aperture.sysdata; |
38 | return iommu_bind(aper->arena, aper->pg_start + pg_start, |
39 | - mem->page_count, mem->memory); |
40 | + mem->page_count, mem->pages); |
41 | } |
42 | |
43 | static int |
44 | diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h |
45 | index 00edd04..85457b2 100644 |
46 | --- a/arch/alpha/kernel/pci_impl.h |
47 | +++ b/arch/alpha/kernel/pci_impl.h |
48 | @@ -198,7 +198,7 @@ extern unsigned long size_for_memory(unsigned long max); |
49 | |
50 | extern int iommu_reserve(struct pci_iommu_arena *, long, long); |
51 | extern int iommu_release(struct pci_iommu_arena *, long, long); |
52 | -extern int iommu_bind(struct pci_iommu_arena *, long, long, unsigned long *); |
53 | +extern int iommu_bind(struct pci_iommu_arena *, long, long, struct page **); |
54 | extern int iommu_unbind(struct pci_iommu_arena *, long, long); |
55 | |
56 | |
57 | diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c |
58 | index bfb880a..eadd63b 100644 |
59 | --- a/arch/alpha/kernel/pci_iommu.c |
60 | +++ b/arch/alpha/kernel/pci_iommu.c |
61 | @@ -880,7 +880,7 @@ iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count) |
62 | |
63 | int |
64 | iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, |
65 | - unsigned long *physaddrs) |
66 | + struct page **pages) |
67 | { |
68 | unsigned long flags; |
69 | unsigned long *ptes; |
70 | @@ -900,7 +900,7 @@ iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, |
71 | } |
72 | |
73 | for(i = 0, j = pg_start; i < pg_count; i++, j++) |
74 | - ptes[j] = mk_iommu_pte(physaddrs[i]); |
75 | + ptes[j] = mk_iommu_pte(page_to_phys(pages[i])); |
76 | |
77 | spin_unlock_irqrestore(&arena->lock, flags); |
78 | |
79 | diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c |
80 | index 2546c06..629e05d 100644 |
81 | --- a/arch/arm/mach-pxa/sharpsl_pm.c |
82 | +++ b/arch/arm/mach-pxa/sharpsl_pm.c |
83 | @@ -678,8 +678,8 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab |
84 | dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n"); |
85 | } |
86 | |
87 | - if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || (sharpsl_fatal_check() < 0) ) |
88 | - { |
89 | + if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || |
90 | + (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL))) { |
91 | dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n"); |
92 | corgi_goto_sleep(alarm_time, alarm_enable, state); |
93 | return 1; |
94 | diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h |
95 | index a7e210b..0cd2e34 100644 |
96 | --- a/arch/powerpc/include/asm/pte-common.h |
97 | +++ b/arch/powerpc/include/asm/pte-common.h |
98 | @@ -176,7 +176,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); |
99 | #define HAVE_PAGE_AGP |
100 | |
101 | /* Advertise support for _PAGE_SPECIAL */ |
102 | -#ifdef _PAGE_SPECIAL |
103 | +#if _PAGE_SPECIAL != 0 |
104 | #define __HAVE_ARCH_PTE_SPECIAL |
105 | #endif |
106 | |
107 | diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c |
108 | index 627767d..d8e6725 100644 |
109 | --- a/arch/powerpc/mm/pgtable.c |
110 | +++ b/arch/powerpc/mm/pgtable.c |
111 | @@ -30,6 +30,8 @@ |
112 | #include <asm/tlbflush.h> |
113 | #include <asm/tlb.h> |
114 | |
115 | +#include "mmu_decl.h" |
116 | + |
117 | static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); |
118 | static unsigned long pte_freelist_forced_free; |
119 | |
120 | @@ -119,7 +121,7 @@ void pte_free_finish(void) |
121 | /* |
122 | * Handle i/d cache flushing, called from set_pte_at() or ptep_set_access_flags() |
123 | */ |
124 | -static pte_t do_dcache_icache_coherency(pte_t pte) |
125 | +static pte_t do_dcache_icache_coherency(pte_t pte, unsigned long addr) |
126 | { |
127 | unsigned long pfn = pte_pfn(pte); |
128 | struct page *page; |
129 | @@ -128,6 +130,17 @@ static pte_t do_dcache_icache_coherency(pte_t pte) |
130 | return pte; |
131 | page = pfn_to_page(pfn); |
132 | |
133 | +#ifdef CONFIG_8xx |
134 | + /* On 8xx, cache control instructions (particularly |
135 | + * "dcbst" from flush_dcache_icache) fault as write |
136 | + * operation if there is an unpopulated TLB entry |
137 | + * for the address in question. To workaround that, |
138 | + * we invalidate the TLB here, thus avoiding dcbst |
139 | + * misbehaviour. |
140 | + */ |
141 | + _tlbil_va(addr, 0 /* 8xx doesn't care about PID */); |
142 | +#endif |
143 | + |
144 | if (!PageReserved(page) && !test_bit(PG_arch_1, &page->flags)) { |
145 | pr_devel("do_dcache_icache_coherency... flushing\n"); |
146 | flush_dcache_icache_page(page); |
147 | @@ -198,7 +211,7 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte |
148 | */ |
149 | pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS); |
150 | if (pte_need_exec_flush(pte, 1)) |
151 | - pte = do_dcache_icache_coherency(pte); |
152 | + pte = do_dcache_icache_coherency(pte, addr); |
153 | |
154 | /* Perform the setting of the PTE */ |
155 | __set_pte_at(mm, addr, ptep, pte, 0); |
156 | @@ -216,7 +229,7 @@ int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address, |
157 | { |
158 | int changed; |
159 | if (!dirty && pte_need_exec_flush(entry, 0)) |
160 | - entry = do_dcache_icache_coherency(entry); |
161 | + entry = do_dcache_icache_coherency(entry, address); |
162 | changed = !pte_same(*(ptep), entry); |
163 | if (changed) { |
164 | if (!(vma->vm_flags & VM_HUGETLB)) |
165 | diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h |
166 | index 83c1bc8..456a304 100644 |
167 | --- a/arch/x86/include/asm/elf.h |
168 | +++ b/arch/x86/include/asm/elf.h |
169 | @@ -299,6 +299,8 @@ do { \ |
170 | |
171 | #ifdef CONFIG_X86_32 |
172 | |
173 | +#define STACK_RND_MASK (0x7ff) |
174 | + |
175 | #define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO)) |
176 | |
177 | #define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled) |
178 | diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h |
179 | index 77a6850..03a0cbd 100644 |
180 | --- a/arch/x86/include/asm/uv/uv_hub.h |
181 | +++ b/arch/x86/include/asm/uv/uv_hub.h |
182 | @@ -422,7 +422,7 @@ static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) |
183 | unsigned long val; |
184 | |
185 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
186 | - ((apicid & 0x3f) << UVH_IPI_INT_APIC_ID_SHFT) | |
187 | + ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | |
188 | (vector << UVH_IPI_INT_VECTOR_SHFT); |
189 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
190 | } |
191 | diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
192 | index 2a50ef8..fde0cd3 100644 |
193 | --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
194 | +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
195 | @@ -605,9 +605,10 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, |
196 | return 0; |
197 | } |
198 | |
199 | -static void invalidate_entry(struct powernow_k8_data *data, unsigned int entry) |
200 | +static void invalidate_entry(struct cpufreq_frequency_table *powernow_table, |
201 | + unsigned int entry) |
202 | { |
203 | - data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; |
204 | + powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; |
205 | } |
206 | |
207 | static void print_basics(struct powernow_k8_data *data) |
208 | @@ -914,13 +915,13 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, |
209 | "bad value %d.\n", i, index); |
210 | printk(KERN_ERR PFX "Please report to BIOS " |
211 | "manufacturer\n"); |
212 | - invalidate_entry(data, i); |
213 | + invalidate_entry(powernow_table, i); |
214 | continue; |
215 | } |
216 | rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); |
217 | if (!(hi & HW_PSTATE_VALID_MASK)) { |
218 | dprintk("invalid pstate %d, ignoring\n", index); |
219 | - invalidate_entry(data, i); |
220 | + invalidate_entry(powernow_table, i); |
221 | continue; |
222 | } |
223 | |
224 | @@ -970,7 +971,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, |
225 | /* verify frequency is OK */ |
226 | if ((freq > (MAX_FREQ * 1000)) || (freq < (MIN_FREQ * 1000))) { |
227 | dprintk("invalid freq %u kHz, ignoring\n", freq); |
228 | - invalidate_entry(data, i); |
229 | + invalidate_entry(powernow_table, i); |
230 | continue; |
231 | } |
232 | |
233 | @@ -978,7 +979,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, |
234 | * BIOSs are using "off" to indicate invalid */ |
235 | if (vid == VID_OFF) { |
236 | dprintk("invalid vid %u, ignoring\n", vid); |
237 | - invalidate_entry(data, i); |
238 | + invalidate_entry(powernow_table, i); |
239 | continue; |
240 | } |
241 | |
242 | @@ -997,7 +998,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, |
243 | |
244 | dprintk("double low frequency table entry, " |
245 | "ignoring it.\n"); |
246 | - invalidate_entry(data, i); |
247 | + invalidate_entry(powernow_table, i); |
248 | continue; |
249 | } else |
250 | cntlofreq = i; |
251 | @@ -1009,7 +1010,7 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, |
252 | (unsigned int) |
253 | (data->acpi_data.states[i].core_frequency |
254 | * 1000)); |
255 | - invalidate_entry(data, i); |
256 | + invalidate_entry(powernow_table, i); |
257 | continue; |
258 | } |
259 | } |
260 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
261 | index a5cdb35..4712293 100644 |
262 | --- a/arch/x86/kvm/mmu.c |
263 | +++ b/arch/x86/kvm/mmu.c |
264 | @@ -2713,12 +2713,6 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu) |
265 | |
266 | ASSERT(vcpu); |
267 | |
268 | - if (vcpu->kvm->arch.n_requested_mmu_pages) |
269 | - vcpu->kvm->arch.n_free_mmu_pages = |
270 | - vcpu->kvm->arch.n_requested_mmu_pages; |
271 | - else |
272 | - vcpu->kvm->arch.n_free_mmu_pages = |
273 | - vcpu->kvm->arch.n_alloc_mmu_pages; |
274 | /* |
275 | * When emulating 32-bit mode, cr3 is only 32 bits even on x86_64. |
276 | * Therefore we need to allocate shadow page tables in the first |
277 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
278 | index b5fa966..6a768ff 100644 |
279 | --- a/arch/x86/kvm/vmx.c |
280 | +++ b/arch/x86/kvm/vmx.c |
281 | @@ -1569,7 +1569,6 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, |
282 | vcpu->arch.cr0 = cr0; |
283 | vmx_set_cr4(vcpu, vcpu->arch.cr4); |
284 | *hw_cr0 |= X86_CR0_PE | X86_CR0_PG; |
285 | - *hw_cr0 &= ~X86_CR0_WP; |
286 | } else if (!is_paging(vcpu)) { |
287 | /* From nonpaging to paging */ |
288 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, |
289 | @@ -1578,9 +1577,10 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0, |
290 | CPU_BASED_CR3_STORE_EXITING)); |
291 | vcpu->arch.cr0 = cr0; |
292 | vmx_set_cr4(vcpu, vcpu->arch.cr4); |
293 | - if (!(vcpu->arch.cr0 & X86_CR0_WP)) |
294 | - *hw_cr0 &= ~X86_CR0_WP; |
295 | } |
296 | + |
297 | + if (!(cr0 & X86_CR0_WP)) |
298 | + *hw_cr0 &= ~X86_CR0_WP; |
299 | } |
300 | |
301 | static void ept_update_paging_mode_cr4(unsigned long *hw_cr4, |
302 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
303 | index 3d36045..91a077f 100644 |
304 | --- a/arch/x86/kvm/x86.c |
305 | +++ b/arch/x86/kvm/x86.c |
306 | @@ -1448,6 +1448,10 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, |
307 | for (func = 0x80000001; func <= limit && nent < cpuid->nent; ++func) |
308 | do_cpuid_ent(&cpuid_entries[nent], func, 0, |
309 | &nent, cpuid->nent); |
310 | + r = -E2BIG; |
311 | + if (nent >= cpuid->nent) |
312 | + goto out_free; |
313 | + |
314 | r = -EFAULT; |
315 | if (copy_to_user(entries, cpuid_entries, |
316 | nent * sizeof(struct kvm_cpuid_entry2))) |
317 | @@ -3198,6 +3202,9 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu) |
318 | if (!kvm_x86_ops->update_cr8_intercept) |
319 | return; |
320 | |
321 | + if (!vcpu->arch.apic) |
322 | + return; |
323 | + |
324 | if (!vcpu->arch.apic->vapic_addr) |
325 | max_irr = kvm_lapic_find_highest_irr(vcpu); |
326 | else |
327 | @@ -4118,13 +4125,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, |
328 | |
329 | vcpu->arch.cr2 = sregs->cr2; |
330 | mmu_reset_needed |= vcpu->arch.cr3 != sregs->cr3; |
331 | - |
332 | - down_read(&vcpu->kvm->slots_lock); |
333 | - if (gfn_to_memslot(vcpu->kvm, sregs->cr3 >> PAGE_SHIFT)) |
334 | - vcpu->arch.cr3 = sregs->cr3; |
335 | - else |
336 | - set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests); |
337 | - up_read(&vcpu->kvm->slots_lock); |
338 | + vcpu->arch.cr3 = sregs->cr3; |
339 | |
340 | kvm_set_cr8(vcpu, sregs->cr8); |
341 | |
342 | diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile |
343 | index eefdeee..0088329 100644 |
344 | --- a/arch/x86/mm/Makefile |
345 | +++ b/arch/x86/mm/Makefile |
346 | @@ -1,6 +1,11 @@ |
347 | obj-y := init.o init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ |
348 | pat.o pgtable.o gup.o |
349 | |
350 | +# Make sure __phys_addr has no stackprotector |
351 | +nostackp := $(call cc-option, -fno-stack-protector) |
352 | +CFLAGS_ioremap.o := $(nostackp) |
353 | +CFLAGS_init.o := $(nostackp) |
354 | + |
355 | obj-$(CONFIG_SMP) += tlb.o |
356 | |
357 | obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o |
358 | diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c |
359 | index 1658296..c8191de 100644 |
360 | --- a/arch/x86/mm/mmap.c |
361 | +++ b/arch/x86/mm/mmap.c |
362 | @@ -29,13 +29,26 @@ |
363 | #include <linux/random.h> |
364 | #include <linux/limits.h> |
365 | #include <linux/sched.h> |
366 | +#include <asm/elf.h> |
367 | + |
368 | +static unsigned int stack_maxrandom_size(void) |
369 | +{ |
370 | + unsigned int max = 0; |
371 | + if ((current->flags & PF_RANDOMIZE) && |
372 | + !(current->personality & ADDR_NO_RANDOMIZE)) { |
373 | + max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT; |
374 | + } |
375 | + |
376 | + return max; |
377 | +} |
378 | + |
379 | |
380 | /* |
381 | * Top of mmap area (just below the process stack). |
382 | * |
383 | - * Leave an at least ~128 MB hole. |
384 | + * Leave an at least ~128 MB hole with possible stack randomization. |
385 | */ |
386 | -#define MIN_GAP (128*1024*1024) |
387 | +#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) |
388 | #define MAX_GAP (TASK_SIZE/6*5) |
389 | |
390 | /* |
391 | diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c |
392 | index e245775..fbb46d6 100644 |
393 | --- a/arch/x86/mm/pageattr.c |
394 | +++ b/arch/x86/mm/pageattr.c |
395 | @@ -143,6 +143,7 @@ void clflush_cache_range(void *vaddr, unsigned int size) |
396 | |
397 | mb(); |
398 | } |
399 | +EXPORT_SYMBOL_GPL(clflush_cache_range); |
400 | |
401 | static void __cpa_flush_all(void *arg) |
402 | { |
403 | diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile |
404 | index 7410640..3bb4fc2 100644 |
405 | --- a/arch/x86/xen/Makefile |
406 | +++ b/arch/x86/xen/Makefile |
407 | @@ -8,6 +8,7 @@ endif |
408 | # Make sure early boot has no stackprotector |
409 | nostackp := $(call cc-option, -fno-stack-protector) |
410 | CFLAGS_enlighten.o := $(nostackp) |
411 | +CFLAGS_mmu.o := $(nostackp) |
412 | |
413 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ |
414 | time.o xen-asm.o xen-asm_$(BITS).o \ |
415 | @@ -16,3 +17,4 @@ obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ |
416 | obj-$(CONFIG_SMP) += smp.o |
417 | obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o |
418 | obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o |
419 | + |
420 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
421 | index eb33aaa..3839a0f 100644 |
422 | --- a/arch/x86/xen/enlighten.c |
423 | +++ b/arch/x86/xen/enlighten.c |
424 | @@ -51,6 +51,7 @@ |
425 | #include <asm/pgtable.h> |
426 | #include <asm/tlbflush.h> |
427 | #include <asm/reboot.h> |
428 | +#include <asm/stackprotector.h> |
429 | |
430 | #include "xen-ops.h" |
431 | #include "mmu.h" |
432 | @@ -330,18 +331,28 @@ static void xen_load_gdt(const struct desc_ptr *dtr) |
433 | unsigned long frames[pages]; |
434 | int f; |
435 | |
436 | - /* A GDT can be up to 64k in size, which corresponds to 8192 |
437 | - 8-byte entries, or 16 4k pages.. */ |
438 | + /* |
439 | + * A GDT can be up to 64k in size, which corresponds to 8192 |
440 | + * 8-byte entries, or 16 4k pages.. |
441 | + */ |
442 | |
443 | BUG_ON(size > 65536); |
444 | BUG_ON(va & ~PAGE_MASK); |
445 | |
446 | for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { |
447 | int level; |
448 | - pte_t *ptep = lookup_address(va, &level); |
449 | + pte_t *ptep; |
450 | unsigned long pfn, mfn; |
451 | void *virt; |
452 | |
453 | + /* |
454 | + * The GDT is per-cpu and is in the percpu data area. |
455 | + * That can be virtually mapped, so we need to do a |
456 | + * page-walk to get the underlying MFN for the |
457 | + * hypercall. The page can also be in the kernel's |
458 | + * linear range, so we need to RO that mapping too. |
459 | + */ |
460 | + ptep = lookup_address(va, &level); |
461 | BUG_ON(ptep == NULL); |
462 | |
463 | pfn = pte_pfn(*ptep); |
464 | @@ -358,6 +369,44 @@ static void xen_load_gdt(const struct desc_ptr *dtr) |
465 | BUG(); |
466 | } |
467 | |
468 | +/* |
469 | + * load_gdt for early boot, when the gdt is only mapped once |
470 | + */ |
471 | +static __init void xen_load_gdt_boot(const struct desc_ptr *dtr) |
472 | +{ |
473 | + unsigned long va = dtr->address; |
474 | + unsigned int size = dtr->size + 1; |
475 | + unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; |
476 | + unsigned long frames[pages]; |
477 | + int f; |
478 | + |
479 | + /* |
480 | + * A GDT can be up to 64k in size, which corresponds to 8192 |
481 | + * 8-byte entries, or 16 4k pages.. |
482 | + */ |
483 | + |
484 | + BUG_ON(size > 65536); |
485 | + BUG_ON(va & ~PAGE_MASK); |
486 | + |
487 | + for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { |
488 | + pte_t pte; |
489 | + unsigned long pfn, mfn; |
490 | + |
491 | + pfn = virt_to_pfn(va); |
492 | + mfn = pfn_to_mfn(pfn); |
493 | + |
494 | + pte = pfn_pte(pfn, PAGE_KERNEL_RO); |
495 | + |
496 | + if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0)) |
497 | + BUG(); |
498 | + |
499 | + frames[f] = mfn; |
500 | + } |
501 | + |
502 | + if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) |
503 | + BUG(); |
504 | +} |
505 | + |
506 | static void load_TLS_descriptor(struct thread_struct *t, |
507 | unsigned int cpu, unsigned int i) |
508 | { |
509 | @@ -581,6 +630,29 @@ static void xen_write_gdt_entry(struct desc_struct *dt, int entry, |
510 | preempt_enable(); |
511 | } |
512 | |
513 | +/* |
514 | + * Version of write_gdt_entry for use at early boot-time needed to |
515 | + * update an entry as simply as possible. |
516 | + */ |
517 | +static __init void xen_write_gdt_entry_boot(struct desc_struct *dt, int entry, |
518 | + const void *desc, int type) |
519 | +{ |
520 | + switch (type) { |
521 | + case DESC_LDT: |
522 | + case DESC_TSS: |
523 | + /* ignore */ |
524 | + break; |
525 | + |
526 | + default: { |
527 | + xmaddr_t maddr = virt_to_machine(&dt[entry]); |
528 | + |
529 | + if (HYPERVISOR_update_descriptor(maddr.maddr, *(u64 *)desc)) |
530 | + dt[entry] = *(struct desc_struct *)desc; |
531 | + } |
532 | + |
533 | + } |
534 | +} |
535 | + |
536 | static void xen_load_sp0(struct tss_struct *tss, |
537 | struct thread_struct *thread) |
538 | { |
539 | @@ -965,6 +1037,23 @@ static const struct machine_ops __initdata xen_machine_ops = { |
540 | .emergency_restart = xen_emergency_restart, |
541 | }; |
542 | |
543 | +/* |
544 | + * Set up the GDT and segment registers for -fstack-protector. Until |
545 | + * we do this, we have to be careful not to call any stack-protected |
546 | + * function, which is most of the kernel. |
547 | + */ |
548 | +static void __init xen_setup_stackprotector(void) |
549 | +{ |
550 | + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot; |
551 | + pv_cpu_ops.load_gdt = xen_load_gdt_boot; |
552 | + |
553 | + setup_stack_canary_segment(0); |
554 | + switch_to_new_gdt(0); |
555 | + |
556 | + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry; |
557 | + pv_cpu_ops.load_gdt = xen_load_gdt; |
558 | +} |
559 | + |
560 | /* First C function to be called on Xen boot */ |
561 | asmlinkage void __init xen_start_kernel(void) |
562 | { |
563 | @@ -983,14 +1072,34 @@ asmlinkage void __init xen_start_kernel(void) |
564 | pv_apic_ops = xen_apic_ops; |
565 | pv_mmu_ops = xen_mmu_ops; |
566 | |
567 | -#ifdef CONFIG_X86_64 |
568 | /* |
569 | - * Setup percpu state. We only need to do this for 64-bit |
570 | - * because 32-bit already has %fs set properly. |
571 | + * Set up some pagetable state before starting to set any ptes. |
572 | */ |
573 | - load_percpu_segment(0); |
574 | + |
575 | + /* Prevent unwanted bits from being set in PTEs. */ |
576 | + __supported_pte_mask &= ~_PAGE_GLOBAL; |
577 | + if (!xen_initial_domain()) |
578 | + __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); |
579 | + |
580 | + __supported_pte_mask |= _PAGE_IOMAP; |
581 | + |
582 | +#ifdef CONFIG_X86_64 |
583 | + /* Work out if we support NX */ |
584 | + check_efer(); |
585 | #endif |
586 | |
587 | + xen_setup_features(); |
588 | + |
589 | + /* Get mfn list */ |
590 | + if (!xen_feature(XENFEAT_auto_translated_physmap)) |
591 | + xen_build_dynamic_phys_to_machine(); |
592 | + |
593 | + /* |
594 | + * Set up kernel GDT and segment registers, mainly so that |
595 | + * -fstack-protector code can be executed. |
596 | + */ |
597 | + xen_setup_stackprotector(); |
598 | + |
599 | xen_init_irq_ops(); |
600 | xen_init_cpuid_mask(); |
601 | |
602 | @@ -1001,8 +1110,6 @@ asmlinkage void __init xen_start_kernel(void) |
603 | set_xen_basic_apic_ops(); |
604 | #endif |
605 | |
606 | - xen_setup_features(); |
607 | - |
608 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |
609 | pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start; |
610 | pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit; |
611 | @@ -1019,22 +1126,8 @@ asmlinkage void __init xen_start_kernel(void) |
612 | |
613 | xen_smp_init(); |
614 | |
615 | - /* Get mfn list */ |
616 | - if (!xen_feature(XENFEAT_auto_translated_physmap)) |
617 | - xen_build_dynamic_phys_to_machine(); |
618 | - |
619 | pgd = (pgd_t *)xen_start_info->pt_base; |
620 | |
621 | - /* Prevent unwanted bits from being set in PTEs. */ |
622 | - __supported_pte_mask &= ~_PAGE_GLOBAL; |
623 | - if (!xen_initial_domain()) |
624 | - __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); |
625 | - |
626 | -#ifdef CONFIG_X86_64 |
627 | - /* Work out if we support NX */ |
628 | - check_efer(); |
629 | -#endif |
630 | - |
631 | /* Don't do the full vcpu_info placement stuff until we have a |
632 | possible map and a non-dummy shared_info. */ |
633 | per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; |
634 | diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c |
635 | index 429834e..fe03eee 100644 |
636 | --- a/arch/x86/xen/smp.c |
637 | +++ b/arch/x86/xen/smp.c |
638 | @@ -236,6 +236,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) |
639 | ctxt->user_regs.ss = __KERNEL_DS; |
640 | #ifdef CONFIG_X86_32 |
641 | ctxt->user_regs.fs = __KERNEL_PERCPU; |
642 | + ctxt->user_regs.gs = __KERNEL_STACK_CANARY; |
643 | #else |
644 | ctxt->gs_base_kernel = per_cpu_offset(cpu); |
645 | #endif |
646 | diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c |
647 | index 5601506..36a5141 100644 |
648 | --- a/arch/x86/xen/spinlock.c |
649 | +++ b/arch/x86/xen/spinlock.c |
650 | @@ -187,7 +187,6 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl |
651 | struct xen_spinlock *prev; |
652 | int irq = __get_cpu_var(lock_kicker_irq); |
653 | int ret; |
654 | - unsigned long flags; |
655 | u64 start; |
656 | |
657 | /* If kicker interrupts not initialized yet, just spin */ |
658 | @@ -199,16 +198,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl |
659 | /* announce we're spinning */ |
660 | prev = spinning_lock(xl); |
661 | |
662 | - flags = __raw_local_save_flags(); |
663 | - if (irq_enable) { |
664 | - ADD_STATS(taken_slow_irqenable, 1); |
665 | - raw_local_irq_enable(); |
666 | - } |
667 | - |
668 | ADD_STATS(taken_slow, 1); |
669 | ADD_STATS(taken_slow_nested, prev != NULL); |
670 | |
671 | do { |
672 | + unsigned long flags; |
673 | + |
674 | /* clear pending */ |
675 | xen_clear_irq_pending(irq); |
676 | |
677 | @@ -228,6 +223,12 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl |
678 | goto out; |
679 | } |
680 | |
681 | + flags = __raw_local_save_flags(); |
682 | + if (irq_enable) { |
683 | + ADD_STATS(taken_slow_irqenable, 1); |
684 | + raw_local_irq_enable(); |
685 | + } |
686 | + |
687 | /* |
688 | * Block until irq becomes pending. If we're |
689 | * interrupted at this point (after the trylock but |
690 | @@ -238,13 +239,15 @@ static noinline int xen_spin_lock_slow(struct raw_spinlock *lock, bool irq_enabl |
691 | * pending. |
692 | */ |
693 | xen_poll_irq(irq); |
694 | + |
695 | + raw_local_irq_restore(flags); |
696 | + |
697 | ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq)); |
698 | } while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */ |
699 | |
700 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
701 | |
702 | out: |
703 | - raw_local_irq_restore(flags); |
704 | unspinning_lock(xl, prev); |
705 | spin_time_accum_blocked(start); |
706 | |
707 | @@ -323,8 +326,13 @@ static void xen_spin_unlock(struct raw_spinlock *lock) |
708 | smp_wmb(); /* make sure no writes get moved after unlock */ |
709 | xl->lock = 0; /* release lock */ |
710 | |
711 | - /* make sure unlock happens before kick */ |
712 | - barrier(); |
713 | + /* |
714 | + * Make sure unlock happens before checking for waiting |
715 | + * spinners. We need a strong barrier to enforce the |
716 | + * write-read ordering to different memory locations, as the |
717 | + * CPU makes no implied guarantees about their ordering. |
718 | + */ |
719 | + mb(); |
720 | |
721 | if (unlikely(xl->spinners)) |
722 | xen_spin_unlock_slow(xl); |
723 | diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c |
724 | index 12158e0..da9d6d2 100644 |
725 | --- a/drivers/acpi/pci_slot.c |
726 | +++ b/drivers/acpi/pci_slot.c |
727 | @@ -57,7 +57,7 @@ ACPI_MODULE_NAME("pci_slot"); |
728 | MY_NAME , ## arg); \ |
729 | } while (0) |
730 | |
731 | -#define SLOT_NAME_SIZE 20 /* Inspired by #define in acpiphp.h */ |
732 | +#define SLOT_NAME_SIZE 21 /* Inspired by #define in acpiphp.h */ |
733 | |
734 | struct acpi_pci_slot { |
735 | acpi_handle root_handle; /* handle of the root bridge */ |
736 | @@ -149,7 +149,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) |
737 | return AE_OK; |
738 | } |
739 | |
740 | - snprintf(name, sizeof(name), "%u", (u32)sun); |
741 | + snprintf(name, sizeof(name), "%llu", sun); |
742 | pci_slot = pci_create_slot(pci_bus, device, name, NULL); |
743 | if (IS_ERR(pci_slot)) { |
744 | err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot)); |
745 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
746 | index fe3eba5..289c4f8 100644 |
747 | --- a/drivers/ata/ahci.c |
748 | +++ b/drivers/ata/ahci.c |
749 | @@ -2861,8 +2861,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
750 | if (ahci_asus_m2a_vm_32bit_only(pdev)) |
751 | hpriv->flags |= AHCI_HFLAG_32BIT_ONLY; |
752 | |
753 | - if (!(hpriv->flags & AHCI_HFLAG_NO_MSI)) |
754 | - pci_enable_msi(pdev); |
755 | + if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) |
756 | + pci_intx(pdev, 1); |
757 | |
758 | /* save initial config */ |
759 | ahci_save_initial_config(pdev, hpriv); |
760 | diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c |
761 | index 33a74f1..567f3f7 100644 |
762 | --- a/drivers/ata/pata_amd.c |
763 | +++ b/drivers/ata/pata_amd.c |
764 | @@ -307,6 +307,9 @@ static unsigned long nv_mode_filter(struct ata_device *dev, |
765 | limit |= ATA_MASK_PIO; |
766 | if (!(limit & (ATA_MASK_MWDMA | ATA_MASK_UDMA))) |
767 | limit |= ATA_MASK_MWDMA | ATA_MASK_UDMA; |
768 | + /* PIO4, MWDMA2, UDMA2 should always be supported regardless of |
769 | + cable detection result */ |
770 | + limit |= ata_pack_xfermask(ATA_PIO4, ATA_MWDMA2, ATA_UDMA2); |
771 | |
772 | ata_port_printk(ap, KERN_DEBUG, "nv_mode_filter: 0x%lx&0x%lx->0x%lx, " |
773 | "BIOS=0x%lx (0x%x) ACPI=0x%lx%s\n", |
774 | diff --git a/drivers/base/base.h b/drivers/base/base.h |
775 | index b528145..1e52c12 100644 |
776 | --- a/drivers/base/base.h |
777 | +++ b/drivers/base/base.h |
778 | @@ -104,7 +104,7 @@ extern int system_bus_init(void); |
779 | extern int cpu_dev_init(void); |
780 | |
781 | extern int bus_add_device(struct device *dev); |
782 | -extern void bus_attach_device(struct device *dev); |
783 | +extern void bus_probe_device(struct device *dev); |
784 | extern void bus_remove_device(struct device *dev); |
785 | |
786 | extern int bus_add_driver(struct device_driver *drv); |
787 | diff --git a/drivers/base/bus.c b/drivers/base/bus.c |
788 | index 4b04a15..973bf2a 100644 |
789 | --- a/drivers/base/bus.c |
790 | +++ b/drivers/base/bus.c |
791 | @@ -459,8 +459,9 @@ static inline void remove_deprecated_bus_links(struct device *dev) { } |
792 | * bus_add_device - add device to bus |
793 | * @dev: device being added |
794 | * |
795 | + * - Add device's bus attributes. |
796 | + * - Create links to device's bus. |
797 | * - Add the device to its bus's list of devices. |
798 | - * - Create link to device's bus. |
799 | */ |
800 | int bus_add_device(struct device *dev) |
801 | { |
802 | @@ -483,6 +484,7 @@ int bus_add_device(struct device *dev) |
803 | error = make_deprecated_bus_links(dev); |
804 | if (error) |
805 | goto out_deprecated; |
806 | + klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices); |
807 | } |
808 | return 0; |
809 | |
810 | @@ -498,24 +500,19 @@ out_put: |
811 | } |
812 | |
813 | /** |
814 | - * bus_attach_device - add device to bus |
815 | - * @dev: device tried to attach to a driver |
816 | + * bus_probe_device - probe drivers for a new device |
817 | + * @dev: device to probe |
818 | * |
819 | - * - Add device to bus's list of devices. |
820 | - * - Try to attach to driver. |
821 | + * - Automatically probe for a driver if the bus allows it. |
822 | */ |
823 | -void bus_attach_device(struct device *dev) |
824 | +void bus_probe_device(struct device *dev) |
825 | { |
826 | struct bus_type *bus = dev->bus; |
827 | - int ret = 0; |
828 | + int ret; |
829 | |
830 | - if (bus) { |
831 | - if (bus->p->drivers_autoprobe) |
832 | - ret = device_attach(dev); |
833 | + if (bus && bus->p->drivers_autoprobe) { |
834 | + ret = device_attach(dev); |
835 | WARN_ON(ret < 0); |
836 | - if (ret >= 0) |
837 | - klist_add_tail(&dev->p->knode_bus, |
838 | - &bus->p->klist_devices); |
839 | } |
840 | } |
841 | |
842 | diff --git a/drivers/base/core.c b/drivers/base/core.c |
843 | index 7ecb193..c34774d 100644 |
844 | --- a/drivers/base/core.c |
845 | +++ b/drivers/base/core.c |
846 | @@ -945,7 +945,7 @@ int device_add(struct device *dev) |
847 | BUS_NOTIFY_ADD_DEVICE, dev); |
848 | |
849 | kobject_uevent(&dev->kobj, KOBJ_ADD); |
850 | - bus_attach_device(dev); |
851 | + bus_probe_device(dev); |
852 | if (parent) |
853 | klist_add_tail(&dev->p->knode_parent, |
854 | &parent->p->klist_children); |
855 | diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c |
856 | index dee0f1f..6cf88b6 100644 |
857 | --- a/drivers/char/agp/intel-agp.c |
858 | +++ b/drivers/char/agp/intel-agp.c |
859 | @@ -679,23 +679,39 @@ static void intel_i830_setup_flush(void) |
860 | if (!intel_private.i8xx_page) |
861 | return; |
862 | |
863 | - /* make page uncached */ |
864 | - map_page_into_agp(intel_private.i8xx_page); |
865 | - |
866 | intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); |
867 | if (!intel_private.i8xx_flush_page) |
868 | intel_i830_fini_flush(); |
869 | } |
870 | |
871 | +static void |
872 | +do_wbinvd(void *null) |
873 | +{ |
874 | + wbinvd(); |
875 | +} |
876 | + |
877 | +/* The chipset_flush interface needs to get data that has already been |
878 | + * flushed out of the CPU all the way out to main memory, because the GPU |
879 | + * doesn't snoop those buffers. |
880 | + * |
881 | + * The 8xx series doesn't have the same lovely interface for flushing the |
882 | + * chipset write buffers that the later chips do. According to the 865 |
883 | + * specs, it's 64 octwords, or 1KB. So, to get those previous things in |
884 | + * that buffer out, we just fill 1KB and clflush it out, on the assumption |
885 | + * that it'll push whatever was in there out. It appears to work. |
886 | + */ |
887 | static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) |
888 | { |
889 | unsigned int *pg = intel_private.i8xx_flush_page; |
890 | - int i; |
891 | |
892 | - for (i = 0; i < 256; i += 2) |
893 | - *(pg + i) = i; |
894 | + memset(pg, 0, 1024); |
895 | |
896 | - wmb(); |
897 | + if (cpu_has_clflush) { |
898 | + clflush_cache_range(pg, 1024); |
899 | + } else { |
900 | + if (on_each_cpu(do_wbinvd, NULL, 1) != 0) |
901 | + printk(KERN_ERR "Timed out waiting for cache flush.\n"); |
902 | + } |
903 | } |
904 | |
905 | /* The intel i830 automatically initializes the agp aperture during POST. |
906 | diff --git a/drivers/char/pty.c b/drivers/char/pty.c |
907 | index b33d668..53761ce 100644 |
908 | --- a/drivers/char/pty.c |
909 | +++ b/drivers/char/pty.c |
910 | @@ -120,8 +120,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) |
911 | /* Stuff the data into the input queue of the other end */ |
912 | c = tty_insert_flip_string(to, buf, c); |
913 | /* And shovel */ |
914 | - tty_flip_buffer_push(to); |
915 | - tty_wakeup(tty); |
916 | + if (c) { |
917 | + tty_flip_buffer_push(to); |
918 | + tty_wakeup(tty); |
919 | + } |
920 | } |
921 | return c; |
922 | } |
923 | diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c |
924 | index a3afa0c..9fc9517 100644 |
925 | --- a/drivers/char/tty_io.c |
926 | +++ b/drivers/char/tty_io.c |
927 | @@ -1184,6 +1184,7 @@ int tty_init_termios(struct tty_struct *tty) |
928 | tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); |
929 | return 0; |
930 | } |
931 | +EXPORT_SYMBOL_GPL(tty_init_termios); |
932 | |
933 | /** |
934 | * tty_driver_install_tty() - install a tty entry in the driver |
935 | diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c |
936 | index 9769b11..549bd0f 100644 |
937 | --- a/drivers/char/tty_port.c |
938 | +++ b/drivers/char/tty_port.c |
939 | @@ -96,6 +96,14 @@ void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty) |
940 | } |
941 | EXPORT_SYMBOL(tty_port_tty_set); |
942 | |
943 | +static void tty_port_shutdown(struct tty_port *port) |
944 | +{ |
945 | + if (port->ops->shutdown && |
946 | + test_and_clear_bit(ASYNC_INITIALIZED, &port->flags)) |
947 | + port->ops->shutdown(port); |
948 | + |
949 | +} |
950 | + |
951 | /** |
952 | * tty_port_hangup - hangup helper |
953 | * @port: tty port |
954 | @@ -116,6 +124,7 @@ void tty_port_hangup(struct tty_port *port) |
955 | port->tty = NULL; |
956 | spin_unlock_irqrestore(&port->lock, flags); |
957 | wake_up_interruptible(&port->open_wait); |
958 | + tty_port_shutdown(port); |
959 | } |
960 | EXPORT_SYMBOL(tty_port_hangup); |
961 | |
962 | @@ -296,15 +305,17 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f |
963 | |
964 | if (port->count) { |
965 | spin_unlock_irqrestore(&port->lock, flags); |
966 | + if (port->ops->drop) |
967 | + port->ops->drop(port); |
968 | return 0; |
969 | } |
970 | - port->flags |= ASYNC_CLOSING; |
971 | + set_bit(ASYNC_CLOSING, &port->flags); |
972 | tty->closing = 1; |
973 | spin_unlock_irqrestore(&port->lock, flags); |
974 | /* Don't block on a stalled port, just pull the chain */ |
975 | if (tty->flow_stopped) |
976 | tty_driver_flush_buffer(tty); |
977 | - if (port->flags & ASYNC_INITIALIZED && |
978 | + if (test_bit(ASYNCB_INITIALIZED, &port->flags) && |
979 | port->closing_wait != ASYNC_CLOSING_WAIT_NONE) |
980 | tty_wait_until_sent(tty, port->closing_wait); |
981 | if (port->drain_delay) { |
982 | @@ -318,6 +329,9 @@ int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct f |
983 | timeout = 2 * HZ; |
984 | schedule_timeout_interruptible(timeout); |
985 | } |
986 | + /* Don't call port->drop for the last reference. Callers will want |
987 | + to drop the last active reference in ->shutdown() or the tty |
988 | + shutdown path */ |
989 | return 1; |
990 | } |
991 | EXPORT_SYMBOL(tty_port_close_start); |
992 | @@ -348,3 +362,14 @@ void tty_port_close_end(struct tty_port *port, struct tty_struct *tty) |
993 | spin_unlock_irqrestore(&port->lock, flags); |
994 | } |
995 | EXPORT_SYMBOL(tty_port_close_end); |
996 | + |
997 | +void tty_port_close(struct tty_port *port, struct tty_struct *tty, |
998 | + struct file *filp) |
999 | +{ |
1000 | + if (tty_port_close_start(port, tty, filp) == 0) |
1001 | + return; |
1002 | + tty_port_shutdown(port); |
1003 | + tty_port_close_end(port, tty); |
1004 | + tty_port_tty_set(port, NULL); |
1005 | +} |
1006 | +EXPORT_SYMBOL(tty_port_close); |
1007 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
1008 | index fc4b68a..c078d99 100644 |
1009 | --- a/drivers/gpu/drm/i915/i915_drv.c |
1010 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
1011 | @@ -94,8 +94,6 @@ static int i915_resume(struct drm_device *dev) |
1012 | struct drm_i915_private *dev_priv = dev->dev_private; |
1013 | int ret = 0; |
1014 | |
1015 | - pci_set_power_state(dev->pdev, PCI_D0); |
1016 | - pci_restore_state(dev->pdev); |
1017 | if (pci_enable_device(dev->pdev)) |
1018 | return -1; |
1019 | pci_set_master(dev->pdev); |
1020 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
1021 | index 80e5ba4..2b7aeee 100644 |
1022 | --- a/drivers/gpu/drm/i915/i915_gem.c |
1023 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
1024 | @@ -1151,27 +1151,21 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
1025 | mutex_lock(&dev->struct_mutex); |
1026 | if (!obj_priv->gtt_space) { |
1027 | ret = i915_gem_object_bind_to_gtt(obj, obj_priv->gtt_alignment); |
1028 | - if (ret) { |
1029 | - mutex_unlock(&dev->struct_mutex); |
1030 | - return VM_FAULT_SIGBUS; |
1031 | - } |
1032 | - |
1033 | - ret = i915_gem_object_set_to_gtt_domain(obj, write); |
1034 | - if (ret) { |
1035 | - mutex_unlock(&dev->struct_mutex); |
1036 | - return VM_FAULT_SIGBUS; |
1037 | - } |
1038 | + if (ret) |
1039 | + goto unlock; |
1040 | |
1041 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); |
1042 | + |
1043 | + ret = i915_gem_object_set_to_gtt_domain(obj, write); |
1044 | + if (ret) |
1045 | + goto unlock; |
1046 | } |
1047 | |
1048 | /* Need a new fence register? */ |
1049 | if (obj_priv->tiling_mode != I915_TILING_NONE) { |
1050 | ret = i915_gem_object_get_fence_reg(obj); |
1051 | - if (ret) { |
1052 | - mutex_unlock(&dev->struct_mutex); |
1053 | - return VM_FAULT_SIGBUS; |
1054 | - } |
1055 | + if (ret) |
1056 | + goto unlock; |
1057 | } |
1058 | |
1059 | pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + |
1060 | @@ -1179,18 +1173,18 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
1061 | |
1062 | /* Finally, remap it using the new GTT offset */ |
1063 | ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); |
1064 | - |
1065 | +unlock: |
1066 | mutex_unlock(&dev->struct_mutex); |
1067 | |
1068 | switch (ret) { |
1069 | + case 0: |
1070 | + case -ERESTARTSYS: |
1071 | + return VM_FAULT_NOPAGE; |
1072 | case -ENOMEM: |
1073 | case -EAGAIN: |
1074 | return VM_FAULT_OOM; |
1075 | - case -EFAULT: |
1076 | - case -EINVAL: |
1077 | - return VM_FAULT_SIGBUS; |
1078 | default: |
1079 | - return VM_FAULT_NOPAGE; |
1080 | + return VM_FAULT_SIGBUS; |
1081 | } |
1082 | } |
1083 | |
1084 | @@ -2506,16 +2500,6 @@ i915_gem_clflush_object(struct drm_gem_object *obj) |
1085 | if (obj_priv->pages == NULL) |
1086 | return; |
1087 | |
1088 | - /* XXX: The 865 in particular appears to be weird in how it handles |
1089 | - * cache flushing. We haven't figured it out, but the |
1090 | - * clflush+agp_chipset_flush doesn't appear to successfully get the |
1091 | - * data visible to the PGU, while wbinvd + agp_chipset_flush does. |
1092 | - */ |
1093 | - if (IS_I865G(obj->dev)) { |
1094 | - wbinvd(); |
1095 | - return; |
1096 | - } |
1097 | - |
1098 | drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); |
1099 | } |
1100 | |
1101 | @@ -3007,6 +2991,16 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, |
1102 | return -EINVAL; |
1103 | } |
1104 | |
1105 | + if (reloc->delta >= target_obj->size) { |
1106 | + DRM_ERROR("Relocation beyond target object bounds: " |
1107 | + "obj %p target %d delta %d size %d.\n", |
1108 | + obj, reloc->target_handle, |
1109 | + (int) reloc->delta, (int) target_obj->size); |
1110 | + drm_gem_object_unreference(target_obj); |
1111 | + i915_gem_object_unpin(obj); |
1112 | + return -EINVAL; |
1113 | + } |
1114 | + |
1115 | if (reloc->write_domain & I915_GEM_DOMAIN_CPU || |
1116 | reloc->read_domains & I915_GEM_DOMAIN_CPU) { |
1117 | DRM_ERROR("reloc with read/write CPU domains: " |
1118 | @@ -3837,7 +3831,8 @@ void i915_gem_free_object(struct drm_gem_object *obj) |
1119 | |
1120 | i915_gem_object_unbind(obj); |
1121 | |
1122 | - i915_gem_free_mmap_offset(obj); |
1123 | + if (obj_priv->mmap_offset) |
1124 | + i915_gem_free_mmap_offset(obj); |
1125 | |
1126 | kfree(obj_priv->page_cpu_valid); |
1127 | kfree(obj_priv->bit_17); |
1128 | diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c |
1129 | index a2d527b..e774a4a 100644 |
1130 | --- a/drivers/gpu/drm/i915/i915_gem_tiling.c |
1131 | +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c |
1132 | @@ -234,7 +234,13 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) |
1133 | uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; |
1134 | bool need_disable; |
1135 | |
1136 | - if (!IS_I9XX(dev)) { |
1137 | + if (IS_IGDNG(dev)) { |
1138 | + /* On IGDNG whatever DRAM config, GPU always do |
1139 | + * same swizzling setup. |
1140 | + */ |
1141 | + swizzle_x = I915_BIT_6_SWIZZLE_9_10; |
1142 | + swizzle_y = I915_BIT_6_SWIZZLE_9; |
1143 | + } else if (!IS_I9XX(dev)) { |
1144 | /* As far as we know, the 865 doesn't have these bit 6 |
1145 | * swizzling issues. |
1146 | */ |
1147 | @@ -317,13 +323,6 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) |
1148 | } |
1149 | } |
1150 | |
1151 | - /* FIXME: check with memory config on IGDNG */ |
1152 | - if (IS_IGDNG(dev)) { |
1153 | - DRM_ERROR("disable tiling on IGDNG...\n"); |
1154 | - swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; |
1155 | - swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; |
1156 | - } |
1157 | - |
1158 | dev_priv->mm.bit_6_swizzle_x = swizzle_x; |
1159 | dev_priv->mm.bit_6_swizzle_y = swizzle_y; |
1160 | } |
1161 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
1162 | index 2955083..106a1ae 100644 |
1163 | --- a/drivers/gpu/drm/i915/i915_reg.h |
1164 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
1165 | @@ -1733,6 +1733,7 @@ |
1166 | #define DISPPLANE_NO_LINE_DOUBLE 0 |
1167 | #define DISPPLANE_STEREO_POLARITY_FIRST 0 |
1168 | #define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) |
1169 | +#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* IGDNG */ |
1170 | #define DISPPLANE_TILED (1<<10) |
1171 | #define DSPAADDR 0x70184 |
1172 | #define DSPASTRIDE 0x70188 |
1173 | @@ -1867,6 +1868,8 @@ |
1174 | #define PF_ENABLE (1<<31) |
1175 | #define PFA_WIN_SZ 0x68074 |
1176 | #define PFB_WIN_SZ 0x68874 |
1177 | +#define PFA_WIN_POS 0x68070 |
1178 | +#define PFB_WIN_POS 0x68870 |
1179 | |
1180 | /* legacy palette */ |
1181 | #define LGC_PALETTE_A 0x4a000 |
1182 | @@ -1913,6 +1916,9 @@ |
1183 | #define GTIIR 0x44018 |
1184 | #define GTIER 0x4401c |
1185 | |
1186 | +#define DISP_ARB_CTL 0x45000 |
1187 | +#define DISP_TILE_SURFACE_SWIZZLING (1<<13) |
1188 | + |
1189 | /* PCH */ |
1190 | |
1191 | /* south display engine interrupt */ |
1192 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
1193 | index f806fcc..698a0ed 100644 |
1194 | --- a/drivers/gpu/drm/i915/intel_bios.c |
1195 | +++ b/drivers/gpu/drm/i915/intel_bios.c |
1196 | @@ -217,6 +217,9 @@ parse_general_features(struct drm_i915_private *dev_priv, |
1197 | if (IS_I85X(dev_priv->dev)) |
1198 | dev_priv->lvds_ssc_freq = |
1199 | general->ssc_freq ? 66 : 48; |
1200 | + else if (IS_IGDNG(dev_priv->dev)) |
1201 | + dev_priv->lvds_ssc_freq = |
1202 | + general->ssc_freq ? 100 : 120; |
1203 | else |
1204 | dev_priv->lvds_ssc_freq = |
1205 | general->ssc_freq ? 100 : 96; |
1206 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
1207 | index 590f81c..5ae4c1a 100644 |
1208 | --- a/drivers/gpu/drm/i915/intel_crt.c |
1209 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
1210 | @@ -151,13 +151,10 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) |
1211 | { |
1212 | struct drm_device *dev = connector->dev; |
1213 | struct drm_i915_private *dev_priv = dev->dev_private; |
1214 | - u32 adpa, temp; |
1215 | + u32 adpa; |
1216 | bool ret; |
1217 | |
1218 | - temp = adpa = I915_READ(PCH_ADPA); |
1219 | - |
1220 | - adpa &= ~ADPA_DAC_ENABLE; |
1221 | - I915_WRITE(PCH_ADPA, adpa); |
1222 | + adpa = I915_READ(PCH_ADPA); |
1223 | |
1224 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; |
1225 | |
1226 | @@ -184,8 +181,6 @@ static bool intel_igdng_crt_detect_hotplug(struct drm_connector *connector) |
1227 | else |
1228 | ret = false; |
1229 | |
1230 | - /* restore origin register */ |
1231 | - I915_WRITE(PCH_ADPA, temp); |
1232 | return ret; |
1233 | } |
1234 | |
1235 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
1236 | index 748ed50..8b5af29 100644 |
1237 | --- a/drivers/gpu/drm/i915/intel_display.c |
1238 | +++ b/drivers/gpu/drm/i915/intel_display.c |
1239 | @@ -818,7 +818,7 @@ intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, |
1240 | refclk, best_clock); |
1241 | |
1242 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
1243 | - if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == |
1244 | + if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == |
1245 | LVDS_CLKB_POWER_UP) |
1246 | clock.p2 = limit->p2.p2_fast; |
1247 | else |
1248 | @@ -1008,6 +1008,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, |
1249 | dspcntr &= ~DISPPLANE_TILED; |
1250 | } |
1251 | |
1252 | + if (IS_IGDNG(dev)) |
1253 | + /* must disable */ |
1254 | + dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; |
1255 | + |
1256 | I915_WRITE(dspcntr_reg, dspcntr); |
1257 | |
1258 | Start = obj_priv->gtt_offset; |
1259 | @@ -1154,6 +1158,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) |
1260 | int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; |
1261 | int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; |
1262 | int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; |
1263 | + int pf_win_pos = (pipe == 0) ? PFA_WIN_POS : PFB_WIN_POS; |
1264 | int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; |
1265 | int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; |
1266 | int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; |
1267 | @@ -1205,6 +1210,19 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) |
1268 | } |
1269 | } |
1270 | |
1271 | + /* Enable panel fitting for LVDS */ |
1272 | + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
1273 | + temp = I915_READ(pf_ctl_reg); |
1274 | + I915_WRITE(pf_ctl_reg, temp | PF_ENABLE); |
1275 | + |
1276 | + /* currently full aspect */ |
1277 | + I915_WRITE(pf_win_pos, 0); |
1278 | + |
1279 | + I915_WRITE(pf_win_size, |
1280 | + (dev_priv->panel_fixed_mode->hdisplay << 16) | |
1281 | + (dev_priv->panel_fixed_mode->vdisplay)); |
1282 | + } |
1283 | + |
1284 | /* Enable CPU pipe */ |
1285 | temp = I915_READ(pipeconf_reg); |
1286 | if ((temp & PIPEACONF_ENABLE) == 0) { |
1287 | @@ -1858,7 +1876,14 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz, |
1288 | { |
1289 | long entries_required, wm_size; |
1290 | |
1291 | - entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; |
1292 | + /* |
1293 | + * Note: we need to make sure we don't overflow for various clock & |
1294 | + * latency values. |
1295 | + * clocks go from a few thousand to several hundred thousand. |
1296 | + * latency is usually a few thousand |
1297 | + */ |
1298 | + entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) / |
1299 | + 1000; |
1300 | entries_required /= wm->cacheline_size; |
1301 | |
1302 | DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); |
1303 | @@ -2616,6 +2641,12 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1304 | |
1305 | intel_wait_for_vblank(dev); |
1306 | |
1307 | + if (IS_IGDNG(dev)) { |
1308 | + /* enable address swizzle for tiling buffer */ |
1309 | + temp = I915_READ(DISP_ARB_CTL); |
1310 | + I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING); |
1311 | + } |
1312 | + |
1313 | I915_WRITE(dspcntr_reg, dspcntr); |
1314 | |
1315 | /* Flush the plane changes */ |
1316 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
1317 | index 8df02ef..b7d091b 100644 |
1318 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
1319 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
1320 | @@ -305,6 +305,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, |
1321 | goto out; |
1322 | } |
1323 | |
1324 | + /* full screen scale for now */ |
1325 | + if (IS_IGDNG(dev)) |
1326 | + goto out; |
1327 | + |
1328 | /* 965+ wants fuzzy fitting */ |
1329 | if (IS_I965G(dev)) |
1330 | pfit_control |= (intel_crtc->pipe << PFIT_PIPE_SHIFT) | |
1331 | @@ -332,8 +336,10 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, |
1332 | * to register description and PRM. |
1333 | * Change the value here to see the borders for debugging |
1334 | */ |
1335 | - I915_WRITE(BCLRPAT_A, 0); |
1336 | - I915_WRITE(BCLRPAT_B, 0); |
1337 | + if (!IS_IGDNG(dev)) { |
1338 | + I915_WRITE(BCLRPAT_A, 0); |
1339 | + I915_WRITE(BCLRPAT_B, 0); |
1340 | + } |
1341 | |
1342 | switch (lvds_priv->fitting_mode) { |
1343 | case DRM_MODE_SCALE_NO_SCALE: |
1344 | @@ -582,7 +588,6 @@ static void intel_lvds_mode_set(struct drm_encoder *encoder, |
1345 | * settings. |
1346 | */ |
1347 | |
1348 | - /* No panel fitting yet, fixme */ |
1349 | if (IS_IGDNG(dev)) |
1350 | return; |
1351 | |
1352 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c |
1353 | index d3b74ba..66dc1a5 100644 |
1354 | --- a/drivers/gpu/drm/i915/intel_sdvo.c |
1355 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c |
1356 | @@ -114,6 +114,9 @@ struct intel_sdvo_priv { |
1357 | /* DDC bus used by this SDVO output */ |
1358 | uint8_t ddc_bus; |
1359 | |
1360 | + /* Mac mini hack -- use the same DDC as the analog connector */ |
1361 | + struct i2c_adapter *analog_ddc_bus; |
1362 | + |
1363 | int save_sdvo_mult; |
1364 | u16 save_active_outputs; |
1365 | struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2; |
1366 | @@ -1478,6 +1481,36 @@ intel_sdvo_multifunc_encoder(struct intel_output *intel_output) |
1367 | return (caps > 1); |
1368 | } |
1369 | |
1370 | +static struct drm_connector * |
1371 | +intel_find_analog_connector(struct drm_device *dev) |
1372 | +{ |
1373 | + struct drm_connector *connector; |
1374 | + struct intel_output *intel_output; |
1375 | + |
1376 | + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
1377 | + intel_output = to_intel_output(connector); |
1378 | + if (intel_output->type == INTEL_OUTPUT_ANALOG) |
1379 | + return connector; |
1380 | + } |
1381 | + return NULL; |
1382 | +} |
1383 | + |
1384 | +static int |
1385 | +intel_analog_is_connected(struct drm_device *dev) |
1386 | +{ |
1387 | + struct drm_connector *analog_connector; |
1388 | + analog_connector = intel_find_analog_connector(dev); |
1389 | + |
1390 | + if (!analog_connector) |
1391 | + return false; |
1392 | + |
1393 | + if (analog_connector->funcs->detect(analog_connector) == |
1394 | + connector_status_disconnected) |
1395 | + return false; |
1396 | + |
1397 | + return true; |
1398 | +} |
1399 | + |
1400 | enum drm_connector_status |
1401 | intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) |
1402 | { |
1403 | @@ -1488,6 +1521,15 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) |
1404 | |
1405 | edid = drm_get_edid(&intel_output->base, |
1406 | intel_output->ddc_bus); |
1407 | + |
1408 | + /* when there is no edid and no monitor is connected with VGA |
1409 | + * port, try to use the CRT ddc to read the EDID for DVI-connector |
1410 | + */ |
1411 | + if (edid == NULL && |
1412 | + sdvo_priv->analog_ddc_bus && |
1413 | + !intel_analog_is_connected(intel_output->base.dev)) |
1414 | + edid = drm_get_edid(&intel_output->base, |
1415 | + sdvo_priv->analog_ddc_bus); |
1416 | if (edid != NULL) { |
1417 | /* Don't report the output as connected if it's a DVI-I |
1418 | * connector with a non-digital EDID coming out. |
1419 | @@ -1540,31 +1582,32 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect |
1420 | static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) |
1421 | { |
1422 | struct intel_output *intel_output = to_intel_output(connector); |
1423 | + struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; |
1424 | + int num_modes; |
1425 | |
1426 | /* set the bus switch and get the modes */ |
1427 | - intel_ddc_get_modes(intel_output); |
1428 | + num_modes = intel_ddc_get_modes(intel_output); |
1429 | |
1430 | -#if 0 |
1431 | - struct drm_device *dev = encoder->dev; |
1432 | - struct drm_i915_private *dev_priv = dev->dev_private; |
1433 | - /* Mac mini hack. On this device, I get DDC through the analog, which |
1434 | - * load-detects as disconnected. I fail to DDC through the SDVO DDC, |
1435 | - * but it does load-detect as connected. So, just steal the DDC bits |
1436 | - * from analog when we fail at finding it the right way. |
1437 | + /* |
1438 | + * Mac mini hack. On this device, the DVI-I connector shares one DDC |
1439 | + * link between analog and digital outputs. So, if the regular SDVO |
1440 | + * DDC fails, check to see if the analog output is disconnected, in |
1441 | + * which case we'll look there for the digital DDC data. |
1442 | */ |
1443 | - crt = xf86_config->output[0]; |
1444 | - intel_output = crt->driver_private; |
1445 | - if (intel_output->type == I830_OUTPUT_ANALOG && |
1446 | - crt->funcs->detect(crt) == XF86OutputStatusDisconnected) { |
1447 | - I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A"); |
1448 | - edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus); |
1449 | - xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true); |
1450 | - } |
1451 | - if (edid_mon) { |
1452 | - xf86OutputSetEDID(output, edid_mon); |
1453 | - modes = xf86OutputGetEDIDModes(output); |
1454 | + if (num_modes == 0 && |
1455 | + sdvo_priv->analog_ddc_bus && |
1456 | + !intel_analog_is_connected(intel_output->base.dev)) { |
1457 | + struct i2c_adapter *digital_ddc_bus; |
1458 | + |
1459 | + /* Switch to the analog ddc bus and try that |
1460 | + */ |
1461 | + digital_ddc_bus = intel_output->ddc_bus; |
1462 | + intel_output->ddc_bus = sdvo_priv->analog_ddc_bus; |
1463 | + |
1464 | + (void) intel_ddc_get_modes(intel_output); |
1465 | + |
1466 | + intel_output->ddc_bus = digital_ddc_bus; |
1467 | } |
1468 | -#endif |
1469 | } |
1470 | |
1471 | /** |
1472 | @@ -1748,6 +1791,8 @@ static void intel_sdvo_destroy(struct drm_connector *connector) |
1473 | intel_i2c_destroy(intel_output->i2c_bus); |
1474 | if (intel_output->ddc_bus) |
1475 | intel_i2c_destroy(intel_output->ddc_bus); |
1476 | + if (sdvo_priv->analog_ddc_bus) |
1477 | + intel_i2c_destroy(sdvo_priv->analog_ddc_bus); |
1478 | |
1479 | if (sdvo_priv->sdvo_lvds_fixed_mode != NULL) |
1480 | drm_mode_destroy(connector->dev, |
1481 | @@ -2074,10 +2119,15 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) |
1482 | } |
1483 | |
1484 | /* setup the DDC bus. */ |
1485 | - if (output_device == SDVOB) |
1486 | + if (output_device == SDVOB) { |
1487 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS"); |
1488 | - else |
1489 | + sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, |
1490 | + "SDVOB/VGA DDC BUS"); |
1491 | + } else { |
1492 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS"); |
1493 | + sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA, |
1494 | + "SDVOC/VGA DDC BUS"); |
1495 | + } |
1496 | |
1497 | if (intel_output->ddc_bus == NULL) |
1498 | goto err_i2c; |
1499 | @@ -2143,6 +2193,8 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device) |
1500 | return true; |
1501 | |
1502 | err_i2c: |
1503 | + if (sdvo_priv->analog_ddc_bus != NULL) |
1504 | + intel_i2c_destroy(sdvo_priv->analog_ddc_bus); |
1505 | if (intel_output->ddc_bus != NULL) |
1506 | intel_i2c_destroy(intel_output->ddc_bus); |
1507 | if (intel_output->i2c_bus != NULL) |
1508 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
1509 | index 5eb10c2..047844d 100644 |
1510 | --- a/drivers/hid/hid-core.c |
1511 | +++ b/drivers/hid/hid-core.c |
1512 | @@ -1319,7 +1319,6 @@ static const struct hid_device_id hid_blacklist[] = { |
1513 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, |
1514 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, |
1515 | |
1516 | - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) }, |
1517 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, |
1518 | { } |
1519 | }; |
1520 | diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c |
1521 | index 8ff7e35..f33ac27 100644 |
1522 | --- a/drivers/isdn/gigaset/interface.c |
1523 | +++ b/drivers/isdn/gigaset/interface.c |
1524 | @@ -408,33 +408,28 @@ static int if_write_room(struct tty_struct *tty) |
1525 | return retval; |
1526 | } |
1527 | |
1528 | -/* FIXME: This function does not have error returns */ |
1529 | - |
1530 | static int if_chars_in_buffer(struct tty_struct *tty) |
1531 | { |
1532 | struct cardstate *cs; |
1533 | - int retval = -ENODEV; |
1534 | + int retval = 0; |
1535 | |
1536 | cs = (struct cardstate *) tty->driver_data; |
1537 | if (!cs) { |
1538 | pr_err("%s: no cardstate\n", __func__); |
1539 | - return -ENODEV; |
1540 | + return 0; |
1541 | } |
1542 | |
1543 | gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__); |
1544 | |
1545 | - if (mutex_lock_interruptible(&cs->mutex)) |
1546 | - return -ERESTARTSYS; // FIXME -EINTR? |
1547 | + mutex_lock(&cs->mutex); |
1548 | |
1549 | - if (!cs->connected) { |
1550 | + if (!cs->connected) |
1551 | gig_dbg(DEBUG_IF, "not connected"); |
1552 | - retval = -ENODEV; |
1553 | - } else if (!cs->open_count) |
1554 | + else if (!cs->open_count) |
1555 | dev_warn(cs->dev, "%s: device not opened\n", __func__); |
1556 | - else if (cs->mstate != MS_LOCKED) { |
1557 | + else if (cs->mstate != MS_LOCKED) |
1558 | dev_warn(cs->dev, "can't write to unlocked device\n"); |
1559 | - retval = -EBUSY; |
1560 | - } else |
1561 | + else |
1562 | retval = cs->ops->chars_in_buffer(cs); |
1563 | |
1564 | mutex_unlock(&cs->mutex); |
1565 | diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c |
1566 | index 1c2e544..ffe9306 100644 |
1567 | --- a/drivers/media/video/em28xx/em28xx-cards.c |
1568 | +++ b/drivers/media/video/em28xx/em28xx-cards.c |
1569 | @@ -2170,8 +2170,6 @@ static int em28xx_hint_board(struct em28xx *dev) |
1570 | /* ----------------------------------------------------------------------- */ |
1571 | void em28xx_register_i2c_ir(struct em28xx *dev) |
1572 | { |
1573 | - struct i2c_board_info info; |
1574 | - struct IR_i2c_init_data init_data; |
1575 | const unsigned short addr_list[] = { |
1576 | 0x30, 0x47, I2C_CLIENT_END |
1577 | }; |
1578 | @@ -2179,9 +2177,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev) |
1579 | if (disable_ir) |
1580 | return; |
1581 | |
1582 | - memset(&info, 0, sizeof(struct i2c_board_info)); |
1583 | - memset(&init_data, 0, sizeof(struct IR_i2c_init_data)); |
1584 | - strlcpy(info.type, "ir_video", I2C_NAME_SIZE); |
1585 | + memset(&dev->info, 0, sizeof(&dev->info)); |
1586 | + memset(&dev->init_data, 0, sizeof(dev->init_data)); |
1587 | + strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE); |
1588 | |
1589 | /* detect & configure */ |
1590 | switch (dev->model) { |
1591 | @@ -2191,19 +2189,19 @@ void em28xx_register_i2c_ir(struct em28xx *dev) |
1592 | break; |
1593 | case (EM2800_BOARD_TERRATEC_CINERGY_200): |
1594 | case (EM2820_BOARD_TERRATEC_CINERGY_250): |
1595 | - init_data.ir_codes = ir_codes_em_terratec; |
1596 | - init_data.get_key = em28xx_get_key_terratec; |
1597 | - init_data.name = "i2c IR (EM28XX Terratec)"; |
1598 | + dev->init_data.ir_codes = ir_codes_em_terratec; |
1599 | + dev->init_data.get_key = em28xx_get_key_terratec; |
1600 | + dev->init_data.name = "i2c IR (EM28XX Terratec)"; |
1601 | break; |
1602 | case (EM2820_BOARD_PINNACLE_USB_2): |
1603 | - init_data.ir_codes = ir_codes_pinnacle_grey; |
1604 | - init_data.get_key = em28xx_get_key_pinnacle_usb_grey; |
1605 | - init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; |
1606 | + dev->init_data.ir_codes = ir_codes_pinnacle_grey; |
1607 | + dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey; |
1608 | + dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; |
1609 | break; |
1610 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): |
1611 | - init_data.ir_codes = ir_codes_hauppauge_new; |
1612 | - init_data.get_key = em28xx_get_key_em_haup; |
1613 | - init_data.name = "i2c IR (EM2840 Hauppauge)"; |
1614 | + dev->init_data.ir_codes = ir_codes_hauppauge_new; |
1615 | + dev->init_data.get_key = em28xx_get_key_em_haup; |
1616 | + dev->init_data.name = "i2c IR (EM2840 Hauppauge)"; |
1617 | break; |
1618 | case (EM2820_BOARD_MSI_VOX_USB_2): |
1619 | break; |
1620 | @@ -2215,9 +2213,9 @@ void em28xx_register_i2c_ir(struct em28xx *dev) |
1621 | break; |
1622 | } |
1623 | |
1624 | - if (init_data.name) |
1625 | - info.platform_data = &init_data; |
1626 | - i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); |
1627 | + if (dev->init_data.name) |
1628 | + dev->info.platform_data = &dev->init_data; |
1629 | + i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list); |
1630 | } |
1631 | |
1632 | void em28xx_card_setup(struct em28xx *dev) |
1633 | diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h |
1634 | index a2add61..cb2a70a 100644 |
1635 | --- a/drivers/media/video/em28xx/em28xx.h |
1636 | +++ b/drivers/media/video/em28xx/em28xx.h |
1637 | @@ -595,6 +595,10 @@ struct em28xx { |
1638 | struct delayed_work sbutton_query_work; |
1639 | |
1640 | struct em28xx_dvb *dvb; |
1641 | + |
1642 | + /* I2C keyboard data */ |
1643 | + struct i2c_board_info info; |
1644 | + struct IR_i2c_init_data init_data; |
1645 | }; |
1646 | |
1647 | struct em28xx_ops { |
1648 | diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c |
1649 | index 6e219c2..69e48ce 100644 |
1650 | --- a/drivers/media/video/saa7134/saa7134-input.c |
1651 | +++ b/drivers/media/video/saa7134/saa7134-input.c |
1652 | @@ -684,8 +684,6 @@ void saa7134_input_fini(struct saa7134_dev *dev) |
1653 | |
1654 | void saa7134_probe_i2c_ir(struct saa7134_dev *dev) |
1655 | { |
1656 | - struct i2c_board_info info; |
1657 | - struct IR_i2c_init_data init_data; |
1658 | const unsigned short addr_list[] = { |
1659 | 0x7a, 0x47, 0x71, 0x2d, |
1660 | I2C_CLIENT_END |
1661 | @@ -705,32 +703,32 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) |
1662 | return; |
1663 | } |
1664 | |
1665 | - memset(&info, 0, sizeof(struct i2c_board_info)); |
1666 | - memset(&init_data, 0, sizeof(struct IR_i2c_init_data)); |
1667 | - strlcpy(info.type, "ir_video", I2C_NAME_SIZE); |
1668 | + memset(&dev->info, 0, sizeof(dev->info)); |
1669 | + memset(&dev->init_data, 0, sizeof(dev->init_data)); |
1670 | + strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE); |
1671 | |
1672 | switch (dev->board) { |
1673 | case SAA7134_BOARD_PINNACLE_PCTV_110i: |
1674 | case SAA7134_BOARD_PINNACLE_PCTV_310i: |
1675 | - init_data.name = "Pinnacle PCTV"; |
1676 | + dev->init_data.name = "Pinnacle PCTV"; |
1677 | if (pinnacle_remote == 0) { |
1678 | - init_data.get_key = get_key_pinnacle_color; |
1679 | - init_data.ir_codes = ir_codes_pinnacle_color; |
1680 | + dev->init_data.get_key = get_key_pinnacle_color; |
1681 | + dev->init_data.ir_codes = ir_codes_pinnacle_color; |
1682 | } else { |
1683 | - init_data.get_key = get_key_pinnacle_grey; |
1684 | - init_data.ir_codes = ir_codes_pinnacle_grey; |
1685 | + dev->init_data.get_key = get_key_pinnacle_grey; |
1686 | + dev->init_data.ir_codes = ir_codes_pinnacle_grey; |
1687 | } |
1688 | break; |
1689 | case SAA7134_BOARD_UPMOST_PURPLE_TV: |
1690 | - init_data.name = "Purple TV"; |
1691 | - init_data.get_key = get_key_purpletv; |
1692 | - init_data.ir_codes = ir_codes_purpletv; |
1693 | + dev->init_data.name = "Purple TV"; |
1694 | + dev->init_data.get_key = get_key_purpletv; |
1695 | + dev->init_data.ir_codes = ir_codes_purpletv; |
1696 | break; |
1697 | case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS: |
1698 | - init_data.name = "MSI TV@nywhere Plus"; |
1699 | - init_data.get_key = get_key_msi_tvanywhere_plus; |
1700 | - init_data.ir_codes = ir_codes_msi_tvanywhere_plus; |
1701 | - info.addr = 0x30; |
1702 | + dev->init_data.name = "MSI TV@nywhere Plus"; |
1703 | + dev->init_data.get_key = get_key_msi_tvanywhere_plus; |
1704 | + dev->init_data.ir_codes = ir_codes_msi_tvanywhere_plus; |
1705 | + dev->info.addr = 0x30; |
1706 | /* MSI TV@nywhere Plus controller doesn't seem to |
1707 | respond to probes unless we read something from |
1708 | an existing device. Weird... |
1709 | @@ -741,9 +739,9 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) |
1710 | (1 == rc) ? "yes" : "no"); |
1711 | break; |
1712 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: |
1713 | - init_data.name = "HVR 1110"; |
1714 | - init_data.get_key = get_key_hvr1110; |
1715 | - init_data.ir_codes = ir_codes_hauppauge_new; |
1716 | + dev->init_data.name = "HVR 1110"; |
1717 | + dev->init_data.get_key = get_key_hvr1110; |
1718 | + dev->init_data.ir_codes = ir_codes_hauppauge_new; |
1719 | break; |
1720 | case SAA7134_BOARD_BEHOLD_607FM_MK3: |
1721 | case SAA7134_BOARD_BEHOLD_607FM_MK5: |
1722 | @@ -757,26 +755,26 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev) |
1723 | case SAA7134_BOARD_BEHOLD_M63: |
1724 | case SAA7134_BOARD_BEHOLD_M6_EXTRA: |
1725 | case SAA7134_BOARD_BEHOLD_H6: |
1726 | - init_data.name = "BeholdTV"; |
1727 | - init_data.get_key = get_key_beholdm6xx; |
1728 | - init_data.ir_codes = ir_codes_behold; |
1729 | + dev->init_data.name = "BeholdTV"; |
1730 | + dev->init_data.get_key = get_key_beholdm6xx; |
1731 | + dev->init_data.ir_codes = ir_codes_behold; |
1732 | break; |
1733 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_501: |
1734 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: |
1735 | - info.addr = 0x40; |
1736 | + dev->info.addr = 0x40; |
1737 | break; |
1738 | } |
1739 | |
1740 | - if (init_data.name) |
1741 | - info.platform_data = &init_data; |
1742 | + if (dev->init_data.name) |
1743 | + dev->info.platform_data = &dev->init_data; |
1744 | /* No need to probe if address is known */ |
1745 | - if (info.addr) { |
1746 | - i2c_new_device(&dev->i2c_adap, &info); |
1747 | + if (dev->info.addr) { |
1748 | + i2c_new_device(&dev->i2c_adap, &dev->info); |
1749 | return; |
1750 | } |
1751 | |
1752 | /* Address not known, fallback to probing */ |
1753 | - i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); |
1754 | + i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list); |
1755 | } |
1756 | |
1757 | static int saa7134_rc5_irq(struct saa7134_dev *dev) |
1758 | diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h |
1759 | index fb564f1..4d85f5c 100644 |
1760 | --- a/drivers/media/video/saa7134/saa7134.h |
1761 | +++ b/drivers/media/video/saa7134/saa7134.h |
1762 | @@ -584,6 +584,10 @@ struct saa7134_dev { |
1763 | int nosignal; |
1764 | unsigned int insuspend; |
1765 | |
1766 | + /* I2C keyboard data */ |
1767 | + struct i2c_board_info info; |
1768 | + struct IR_i2c_init_data init_data; |
1769 | + |
1770 | /* SAA7134_MPEG_* */ |
1771 | struct saa7134_ts ts; |
1772 | struct saa7134_dmaqueue ts_q; |
1773 | diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c |
1774 | index 5d0ba4f..9ad7bb4 100644 |
1775 | --- a/drivers/message/fusion/mptbase.c |
1776 | +++ b/drivers/message/fusion/mptbase.c |
1777 | @@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr) |
1778 | { |
1779 | SGESimple64_t *pSge = (SGESimple64_t *) pAddr; |
1780 | pSge->Address.Low = cpu_to_le32 |
1781 | - (lower_32_bits((unsigned long)(dma_addr))); |
1782 | + (lower_32_bits(dma_addr)); |
1783 | pSge->Address.High = cpu_to_le32 |
1784 | - (upper_32_bits((unsigned long)dma_addr)); |
1785 | + (upper_32_bits(dma_addr)); |
1786 | pSge->FlagsLength = cpu_to_le32 |
1787 | ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); |
1788 | } |
1789 | @@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr) |
1790 | u32 tmp; |
1791 | |
1792 | pSge->Address.Low = cpu_to_le32 |
1793 | - (lower_32_bits((unsigned long)(dma_addr))); |
1794 | - tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); |
1795 | + (lower_32_bits(dma_addr)); |
1796 | + tmp = (u32)(upper_32_bits(dma_addr)); |
1797 | |
1798 | /* |
1799 | * 1078 errata workaround for the 36GB limitation |
1800 | @@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) |
1801 | pChain->NextChainOffset = next; |
1802 | |
1803 | pChain->Address.Low = cpu_to_le32(tmp); |
1804 | - tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); |
1805 | + tmp = (u32)(upper_32_bits(dma_addr)); |
1806 | pChain->Address.High = cpu_to_le32(tmp); |
1807 | } |
1808 | |
1809 | diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c |
1810 | index 13e7d7b..dd8b6b3 100644 |
1811 | --- a/drivers/mfd/ab3100-core.c |
1812 | +++ b/drivers/mfd/ab3100-core.c |
1813 | @@ -643,7 +643,7 @@ struct ab3100_init_setting { |
1814 | u8 setting; |
1815 | }; |
1816 | |
1817 | -static const struct ab3100_init_setting __initdata |
1818 | +static const struct ab3100_init_setting __initconst |
1819 | ab3100_init_settings[] = { |
1820 | { |
1821 | .abreg = AB3100_MCA, |
1822 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c |
1823 | index 06084db..72f2df1 100644 |
1824 | --- a/drivers/mmc/core/mmc.c |
1825 | +++ b/drivers/mmc/core/mmc.c |
1826 | @@ -180,11 +180,11 @@ static int mmc_read_ext_csd(struct mmc_card *card) |
1827 | |
1828 | err = mmc_send_ext_csd(card, ext_csd); |
1829 | if (err) { |
1830 | - /* |
1831 | - * We all hosts that cannot perform the command |
1832 | - * to fail more gracefully |
1833 | - */ |
1834 | - if (err != -EINVAL) |
1835 | + /* If the host or the card can't do the switch, |
1836 | + * fail more gracefully. */ |
1837 | + if ((err != -EINVAL) |
1838 | + && (err != -ENOSYS) |
1839 | + && (err != -EFAULT)) |
1840 | goto out; |
1841 | |
1842 | /* |
1843 | diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c |
1844 | index cd81c39..65c32bf 100644 |
1845 | --- a/drivers/mmc/core/sd.c |
1846 | +++ b/drivers/mmc/core/sd.c |
1847 | @@ -210,11 +210,11 @@ static int mmc_read_switch(struct mmc_card *card) |
1848 | |
1849 | err = mmc_sd_switch(card, 0, 0, 1, status); |
1850 | if (err) { |
1851 | - /* |
1852 | - * We all hosts that cannot perform the command |
1853 | - * to fail more gracefully |
1854 | - */ |
1855 | - if (err != -EINVAL) |
1856 | + /* If the host or the card can't do the switch, |
1857 | + * fail more gracefully. */ |
1858 | + if ((err != -EINVAL) |
1859 | + && (err != -ENOSYS) |
1860 | + && (err != -EFAULT)) |
1861 | goto out; |
1862 | |
1863 | printk(KERN_WARNING "%s: problem reading switch " |
1864 | diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c |
1865 | index 61ea833..94bb61e 100644 |
1866 | --- a/drivers/mtd/chips/cfi_cmdset_0002.c |
1867 | +++ b/drivers/mtd/chips/cfi_cmdset_0002.c |
1868 | @@ -282,16 +282,6 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd, void *param) |
1869 | } |
1870 | } |
1871 | |
1872 | -static void fixup_M29W128G_write_buffer(struct mtd_info *mtd, void *param) |
1873 | -{ |
1874 | - struct map_info *map = mtd->priv; |
1875 | - struct cfi_private *cfi = map->fldrv_priv; |
1876 | - if (cfi->cfiq->BufWriteTimeoutTyp) { |
1877 | - pr_warning("Don't use write buffer on ST flash M29W128G\n"); |
1878 | - cfi->cfiq->BufWriteTimeoutTyp = 0; |
1879 | - } |
1880 | -} |
1881 | - |
1882 | static struct cfi_fixup cfi_fixup_table[] = { |
1883 | { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, |
1884 | #ifdef AMD_BOOTLOC_BUG |
1885 | @@ -308,7 +298,6 @@ static struct cfi_fixup cfi_fixup_table[] = { |
1886 | { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, }, |
1887 | { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, }, |
1888 | { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, }, |
1889 | - { CFI_MFR_ST, 0x227E, fixup_M29W128G_write_buffer, NULL, }, |
1890 | #if !FORCE_WORD_WRITE |
1891 | { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, |
1892 | #endif |
1893 | diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c |
1894 | index 34d40e2..c5a84fd 100644 |
1895 | --- a/drivers/mtd/chips/cfi_util.c |
1896 | +++ b/drivers/mtd/chips/cfi_util.c |
1897 | @@ -81,6 +81,10 @@ void __xipram cfi_qry_mode_off(uint32_t base, struct map_info *map, |
1898 | { |
1899 | cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); |
1900 | cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL); |
1901 | + /* M29W128G flashes require an additional reset command |
1902 | + when exit qry mode */ |
1903 | + if ((cfi->mfr == CFI_MFR_ST) && (cfi->id == 0x227E || cfi->id == 0x7E)) |
1904 | + cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); |
1905 | } |
1906 | EXPORT_SYMBOL_GPL(cfi_qry_mode_off); |
1907 | |
1908 | diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c |
1909 | index 89bf85a..40b5658 100644 |
1910 | --- a/drivers/mtd/nand/ndfc.c |
1911 | +++ b/drivers/mtd/nand/ndfc.c |
1912 | @@ -102,8 +102,8 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd, |
1913 | wmb(); |
1914 | ecc = in_be32(ndfc->ndfcbase + NDFC_ECC); |
1915 | /* The NDFC uses Smart Media (SMC) bytes order */ |
1916 | - ecc_code[0] = p[2]; |
1917 | - ecc_code[1] = p[1]; |
1918 | + ecc_code[0] = p[1]; |
1919 | + ecc_code[1] = p[2]; |
1920 | ecc_code[2] = p[3]; |
1921 | |
1922 | return 0; |
1923 | diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c |
1924 | index 3e164f0..62d6a78 100644 |
1925 | --- a/drivers/mtd/ofpart.c |
1926 | +++ b/drivers/mtd/ofpart.c |
1927 | @@ -46,21 +46,12 @@ int __devinit of_mtd_parse_partitions(struct device *dev, |
1928 | const u32 *reg; |
1929 | int len; |
1930 | |
1931 | - /* check if this is a partition node */ |
1932 | - partname = of_get_property(pp, "name", &len); |
1933 | - if (strcmp(partname, "partition") != 0) { |
1934 | + reg = of_get_property(pp, "reg", &len); |
1935 | + if (!reg) { |
1936 | nr_parts--; |
1937 | continue; |
1938 | } |
1939 | |
1940 | - reg = of_get_property(pp, "reg", &len); |
1941 | - if (!reg || (len != 2 * sizeof(u32))) { |
1942 | - of_node_put(pp); |
1943 | - dev_err(dev, "Invalid 'reg' on %s\n", node->full_name); |
1944 | - kfree(*pparts); |
1945 | - *pparts = NULL; |
1946 | - return -EINVAL; |
1947 | - } |
1948 | (*pparts)[i].offset = reg[0]; |
1949 | (*pparts)[i].size = reg[1]; |
1950 | |
1951 | @@ -75,6 +66,14 @@ int __devinit of_mtd_parse_partitions(struct device *dev, |
1952 | i++; |
1953 | } |
1954 | |
1955 | + if (!i) { |
1956 | + of_node_put(pp); |
1957 | + dev_err(dev, "No valid partition found on %s\n", node->full_name); |
1958 | + kfree(*pparts); |
1959 | + *pparts = NULL; |
1960 | + return -EINVAL; |
1961 | + } |
1962 | + |
1963 | return nr_parts; |
1964 | } |
1965 | EXPORT_SYMBOL(of_mtd_parse_partitions); |
1966 | diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c |
1967 | index a10c1d7..460bb88 100644 |
1968 | --- a/drivers/net/can/vcan.c |
1969 | +++ b/drivers/net/can/vcan.c |
1970 | @@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) |
1971 | skb->dev = dev; |
1972 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
1973 | |
1974 | - netif_rx(skb); |
1975 | + netif_rx_ni(skb); |
1976 | } |
1977 | |
1978 | static int vcan_tx(struct sk_buff *skb, struct net_device *dev) |
1979 | diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c |
1980 | index 1f9ec29..65a43c8 100644 |
1981 | --- a/drivers/net/usb/kaweth.c |
1982 | +++ b/drivers/net/usb/kaweth.c |
1983 | @@ -263,6 +263,7 @@ static int kaweth_control(struct kaweth_device *kaweth, |
1984 | int timeout) |
1985 | { |
1986 | struct usb_ctrlrequest *dr; |
1987 | + int retval; |
1988 | |
1989 | dbg("kaweth_control()"); |
1990 | |
1991 | @@ -278,18 +279,21 @@ static int kaweth_control(struct kaweth_device *kaweth, |
1992 | return -ENOMEM; |
1993 | } |
1994 | |
1995 | - dr->bRequestType= requesttype; |
1996 | + dr->bRequestType = requesttype; |
1997 | dr->bRequest = request; |
1998 | dr->wValue = cpu_to_le16(value); |
1999 | dr->wIndex = cpu_to_le16(index); |
2000 | dr->wLength = cpu_to_le16(size); |
2001 | |
2002 | - return kaweth_internal_control_msg(kaweth->dev, |
2003 | - pipe, |
2004 | - dr, |
2005 | - data, |
2006 | - size, |
2007 | - timeout); |
2008 | + retval = kaweth_internal_control_msg(kaweth->dev, |
2009 | + pipe, |
2010 | + dr, |
2011 | + data, |
2012 | + size, |
2013 | + timeout); |
2014 | + |
2015 | + kfree(dr); |
2016 | + return retval; |
2017 | } |
2018 | |
2019 | /**************************************************************** |
2020 | diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c |
2021 | index 007eb85..1084ca6 100644 |
2022 | --- a/drivers/net/wireless/ath/ar9170/usb.c |
2023 | +++ b/drivers/net/wireless/ath/ar9170/usb.c |
2024 | @@ -64,6 +64,8 @@ static struct usb_device_id ar9170_usb_ids[] = { |
2025 | { USB_DEVICE(0x0cf3, 0x9170) }, |
2026 | /* Atheros TG121N */ |
2027 | { USB_DEVICE(0x0cf3, 0x1001) }, |
2028 | + /* TP-Link TL-WN821N v2 */ |
2029 | + { USB_DEVICE(0x0cf3, 0x1002) }, |
2030 | /* Cace Airpcap NX */ |
2031 | { USB_DEVICE(0xcace, 0x0300) }, |
2032 | /* D-Link DWA 160A */ |
2033 | diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h |
2034 | index 6358233..778baf7 100644 |
2035 | --- a/drivers/net/wireless/ath/ath5k/ath5k.h |
2036 | +++ b/drivers/net/wireless/ath/ath5k/ath5k.h |
2037 | @@ -1164,6 +1164,7 @@ extern void ath5k_unregister_leds(struct ath5k_softc *sc); |
2038 | |
2039 | /* Reset Functions */ |
2040 | extern int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial); |
2041 | +extern int ath5k_hw_on_hold(struct ath5k_hw *ah); |
2042 | extern int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, struct ieee80211_channel *channel, bool change_channel); |
2043 | /* Power management functions */ |
2044 | extern int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, bool set_chip, u16 sleep_duration); |
2045 | diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c |
2046 | index c41ef58..605b8f6 100644 |
2047 | --- a/drivers/net/wireless/ath/ath5k/attach.c |
2048 | +++ b/drivers/net/wireless/ath/ath5k/attach.c |
2049 | @@ -145,7 +145,7 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) |
2050 | goto err_free; |
2051 | |
2052 | /* Bring device out of sleep and reset it's units */ |
2053 | - ret = ath5k_hw_nic_wakeup(ah, CHANNEL_B, true); |
2054 | + ret = ath5k_hw_nic_wakeup(ah, 0, true); |
2055 | if (ret) |
2056 | goto err_free; |
2057 | |
2058 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c |
2059 | index ba6d225..753f50e 100644 |
2060 | --- a/drivers/net/wireless/ath/ath5k/base.c |
2061 | +++ b/drivers/net/wireless/ath/ath5k/base.c |
2062 | @@ -666,7 +666,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state) |
2063 | |
2064 | ath5k_led_off(sc); |
2065 | |
2066 | - free_irq(pdev->irq, sc); |
2067 | pci_save_state(pdev); |
2068 | pci_disable_device(pdev); |
2069 | pci_set_power_state(pdev, PCI_D3hot); |
2070 | @@ -694,18 +693,8 @@ ath5k_pci_resume(struct pci_dev *pdev) |
2071 | */ |
2072 | pci_write_config_byte(pdev, 0x41, 0); |
2073 | |
2074 | - err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); |
2075 | - if (err) { |
2076 | - ATH5K_ERR(sc, "request_irq failed\n"); |
2077 | - goto err_no_irq; |
2078 | - } |
2079 | - |
2080 | ath5k_led_enable(sc); |
2081 | return 0; |
2082 | - |
2083 | -err_no_irq: |
2084 | - pci_disable_device(pdev); |
2085 | - return err; |
2086 | } |
2087 | #endif /* CONFIG_PM */ |
2088 | |
2089 | @@ -2445,27 +2434,29 @@ ath5k_stop_hw(struct ath5k_softc *sc) |
2090 | ret = ath5k_stop_locked(sc); |
2091 | if (ret == 0 && !test_bit(ATH_STAT_INVALID, sc->status)) { |
2092 | /* |
2093 | - * Set the chip in full sleep mode. Note that we are |
2094 | - * careful to do this only when bringing the interface |
2095 | - * completely to a stop. When the chip is in this state |
2096 | - * it must be carefully woken up or references to |
2097 | - * registers in the PCI clock domain may freeze the bus |
2098 | - * (and system). This varies by chip and is mostly an |
2099 | - * issue with newer parts that go to sleep more quickly. |
2100 | - */ |
2101 | - if (sc->ah->ah_mac_srev >= 0x78) { |
2102 | - /* |
2103 | - * XXX |
2104 | - * don't put newer MAC revisions > 7.8 to sleep because |
2105 | - * of the above mentioned problems |
2106 | - */ |
2107 | - ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mac version > 7.8, " |
2108 | - "not putting device to sleep\n"); |
2109 | - } else { |
2110 | - ATH5K_DBG(sc, ATH5K_DEBUG_RESET, |
2111 | - "putting device to full sleep\n"); |
2112 | - ath5k_hw_set_power(sc->ah, AR5K_PM_FULL_SLEEP, true, 0); |
2113 | - } |
2114 | + * Don't set the card in full sleep mode! |
2115 | + * |
2116 | + * a) When the device is in this state it must be carefully |
2117 | + * woken up or references to registers in the PCI clock |
2118 | + * domain may freeze the bus (and system). This varies |
2119 | + * by chip and is mostly an issue with newer parts |
2120 | + * (madwifi sources mentioned srev >= 0x78) that go to |
2121 | + * sleep more quickly. |
2122 | + * |
2123 | + * b) On older chips full sleep results a weird behaviour |
2124 | + * during wakeup. I tested various cards with srev < 0x78 |
2125 | + * and they don't wake up after module reload, a second |
2126 | + * module reload is needed to bring the card up again. |
2127 | + * |
2128 | + * Until we figure out what's going on don't enable |
2129 | + * full chip reset on any chip (this is what Legacy HAL |
2130 | + * and Sam's HAL do anyway). Instead Perform a full reset |
2131 | + * on the device (same as initial state after attach) and |
2132 | + * leave it idle (keep MAC/BB on warm reset) */ |
2133 | + ret = ath5k_hw_on_hold(sc->ah); |
2134 | + |
2135 | + ATH5K_DBG(sc, ATH5K_DEBUG_RESET, |
2136 | + "putting device to sleep\n"); |
2137 | } |
2138 | ath5k_txbuf_free(sc, sc->bbuf); |
2139 | |
2140 | diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c |
2141 | index bd0a97a..4980621 100644 |
2142 | --- a/drivers/net/wireless/ath/ath5k/reset.c |
2143 | +++ b/drivers/net/wireless/ath/ath5k/reset.c |
2144 | @@ -258,29 +258,35 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, |
2145 | if (!set_chip) |
2146 | goto commit; |
2147 | |
2148 | - /* Preserve sleep duration */ |
2149 | data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL); |
2150 | + |
2151 | + /* If card is down we 'll get 0xffff... so we |
2152 | + * need to clean this up before we write the register |
2153 | + */ |
2154 | if (data & 0xffc00000) |
2155 | data = 0; |
2156 | else |
2157 | - data = data & 0xfffcffff; |
2158 | + /* Preserve sleep duration etc */ |
2159 | + data = data & ~AR5K_SLEEP_CTL_SLE; |
2160 | |
2161 | - ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); |
2162 | + ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE, |
2163 | + AR5K_SLEEP_CTL); |
2164 | udelay(15); |
2165 | |
2166 | - for (i = 50; i > 0; i--) { |
2167 | + for (i = 200; i > 0; i--) { |
2168 | /* Check if the chip did wake up */ |
2169 | if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) & |
2170 | AR5K_PCICFG_SPWR_DN) == 0) |
2171 | break; |
2172 | |
2173 | /* Wait a bit and retry */ |
2174 | - udelay(200); |
2175 | - ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); |
2176 | + udelay(50); |
2177 | + ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE, |
2178 | + AR5K_SLEEP_CTL); |
2179 | } |
2180 | |
2181 | /* Fail if the chip didn't wake up */ |
2182 | - if (i <= 0) |
2183 | + if (i == 0) |
2184 | return -EIO; |
2185 | |
2186 | break; |
2187 | @@ -297,6 +303,64 @@ commit: |
2188 | } |
2189 | |
2190 | /* |
2191 | + * Put device on hold |
2192 | + * |
2193 | + * Put MAC and Baseband on warm reset and |
2194 | + * keep that state (don't clean sleep control |
2195 | + * register). After this MAC and Baseband are |
2196 | + * disabled and a full reset is needed to come |
2197 | + * back. This way we save as much power as possible |
2198 | + * without puting the card on full sleep. |
2199 | + */ |
2200 | +int ath5k_hw_on_hold(struct ath5k_hw *ah) |
2201 | +{ |
2202 | + struct pci_dev *pdev = ah->ah_sc->pdev; |
2203 | + u32 bus_flags; |
2204 | + int ret; |
2205 | + |
2206 | + /* Make sure device is awake */ |
2207 | + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); |
2208 | + if (ret) { |
2209 | + ATH5K_ERR(ah->ah_sc, "failed to wakeup the MAC Chip\n"); |
2210 | + return ret; |
2211 | + } |
2212 | + |
2213 | + /* |
2214 | + * Put chipset on warm reset... |
2215 | + * |
2216 | + * Note: puting PCI core on warm reset on PCI-E cards |
2217 | + * results card to hang and always return 0xffff... so |
2218 | + * we ingore that flag for PCI-E cards. On PCI cards |
2219 | + * this flag gets cleared after 64 PCI clocks. |
2220 | + */ |
2221 | + bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; |
2222 | + |
2223 | + if (ah->ah_version == AR5K_AR5210) { |
2224 | + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2225 | + AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | |
2226 | + AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); |
2227 | + mdelay(2); |
2228 | + } else { |
2229 | + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2230 | + AR5K_RESET_CTL_BASEBAND | bus_flags); |
2231 | + } |
2232 | + |
2233 | + if (ret) { |
2234 | + ATH5K_ERR(ah->ah_sc, "failed to put device on warm reset\n"); |
2235 | + return -EIO; |
2236 | + } |
2237 | + |
2238 | + /* ...wakeup again!*/ |
2239 | + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); |
2240 | + if (ret) { |
2241 | + ATH5K_ERR(ah->ah_sc, "failed to put device on hold\n"); |
2242 | + return ret; |
2243 | + } |
2244 | + |
2245 | + return ret; |
2246 | +} |
2247 | + |
2248 | +/* |
2249 | * Bring up MAC + PHY Chips and program PLL |
2250 | * TODO: Half/Quarter rate support |
2251 | */ |
2252 | @@ -319,6 +383,50 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial) |
2253 | return ret; |
2254 | } |
2255 | |
2256 | + /* |
2257 | + * Put chipset on warm reset... |
2258 | + * |
2259 | + * Note: puting PCI core on warm reset on PCI-E cards |
2260 | + * results card to hang and always return 0xffff... so |
2261 | + * we ingore that flag for PCI-E cards. On PCI cards |
2262 | + * this flag gets cleared after 64 PCI clocks. |
2263 | + */ |
2264 | + bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; |
2265 | + |
2266 | + if (ah->ah_version == AR5K_AR5210) { |
2267 | + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2268 | + AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | |
2269 | + AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); |
2270 | + mdelay(2); |
2271 | + } else { |
2272 | + ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2273 | + AR5K_RESET_CTL_BASEBAND | bus_flags); |
2274 | + } |
2275 | + |
2276 | + if (ret) { |
2277 | + ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n"); |
2278 | + return -EIO; |
2279 | + } |
2280 | + |
2281 | + /* ...wakeup again!...*/ |
2282 | + ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); |
2283 | + if (ret) { |
2284 | + ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n"); |
2285 | + return ret; |
2286 | + } |
2287 | + |
2288 | + /* ...clear reset control register and pull device out of |
2289 | + * warm reset */ |
2290 | + if (ath5k_hw_nic_reset(ah, 0)) { |
2291 | + ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n"); |
2292 | + return -EIO; |
2293 | + } |
2294 | + |
2295 | + /* On initialization skip PLL programming since we don't have |
2296 | + * a channel / mode set yet */ |
2297 | + if (initial) |
2298 | + return 0; |
2299 | + |
2300 | if (ah->ah_version != AR5K_AR5210) { |
2301 | /* |
2302 | * Get channel mode flags |
2303 | @@ -384,39 +492,6 @@ int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial) |
2304 | AR5K_PHY_TURBO); |
2305 | } |
2306 | |
2307 | - /* reseting PCI on PCI-E cards results card to hang |
2308 | - * and always return 0xffff... so we ingore that flag |
2309 | - * for PCI-E cards */ |
2310 | - bus_flags = (pdev->is_pcie) ? 0 : AR5K_RESET_CTL_PCI; |
2311 | - |
2312 | - /* Reset chipset */ |
2313 | - if (ah->ah_version == AR5K_AR5210) { |
2314 | - ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2315 | - AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA | |
2316 | - AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI); |
2317 | - mdelay(2); |
2318 | - } else { |
2319 | - ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU | |
2320 | - AR5K_RESET_CTL_BASEBAND | bus_flags); |
2321 | - } |
2322 | - if (ret) { |
2323 | - ATH5K_ERR(ah->ah_sc, "failed to reset the MAC Chip\n"); |
2324 | - return -EIO; |
2325 | - } |
2326 | - |
2327 | - /* ...wakeup again!*/ |
2328 | - ret = ath5k_hw_set_power(ah, AR5K_PM_AWAKE, true, 0); |
2329 | - if (ret) { |
2330 | - ATH5K_ERR(ah->ah_sc, "failed to resume the MAC Chip\n"); |
2331 | - return ret; |
2332 | - } |
2333 | - |
2334 | - /* ...final warm reset */ |
2335 | - if (ath5k_hw_nic_reset(ah, 0)) { |
2336 | - ATH5K_ERR(ah->ah_sc, "failed to warm reset the MAC Chip\n"); |
2337 | - return -EIO; |
2338 | - } |
2339 | - |
2340 | if (ah->ah_version != AR5K_AR5210) { |
2341 | |
2342 | /* ...update PLL if needed */ |
2343 | diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c |
2344 | index 7da52f1..d83d430 100644 |
2345 | --- a/drivers/net/wireless/iwlwifi/iwl-1000.c |
2346 | +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c |
2347 | @@ -46,7 +46,7 @@ |
2348 | #include "iwl-5000-hw.h" |
2349 | |
2350 | /* Highest firmware API version supported */ |
2351 | -#define IWL1000_UCODE_API_MAX 2 |
2352 | +#define IWL1000_UCODE_API_MAX 3 |
2353 | |
2354 | /* Lowest firmware API version supported */ |
2355 | #define IWL1000_UCODE_API_MIN 1 |
2356 | @@ -62,12 +62,14 @@ struct iwl_cfg iwl1000_bgn_cfg = { |
2357 | .ucode_api_min = IWL1000_UCODE_API_MIN, |
2358 | .sku = IWL_SKU_G|IWL_SKU_N, |
2359 | .ops = &iwl5000_ops, |
2360 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2361 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2362 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2363 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2364 | .mod_params = &iwl50_mod_params, |
2365 | .valid_tx_ant = ANT_A, |
2366 | .valid_rx_ant = ANT_AB, |
2367 | .need_pll_cfg = true, |
2368 | + .max_ll_items = OTP_MAX_LL_ITEMS_1000, |
2369 | + .shadow_ram_support = false, |
2370 | }; |
2371 | |
2372 | diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c |
2373 | index 46288e7..b73ab6c 100644 |
2374 | --- a/drivers/net/wireless/iwlwifi/iwl-3945.c |
2375 | +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c |
2376 | @@ -2784,11 +2784,50 @@ static int iwl3945_load_bsm(struct iwl_priv *priv) |
2377 | return 0; |
2378 | } |
2379 | |
2380 | +#define IWL3945_UCODE_GET(item) \ |
2381 | +static u32 iwl3945_ucode_get_##item(const struct iwl_ucode_header *ucode,\ |
2382 | + u32 api_ver) \ |
2383 | +{ \ |
2384 | + return le32_to_cpu(ucode->u.v1.item); \ |
2385 | +} |
2386 | + |
2387 | +static u32 iwl3945_ucode_get_header_size(u32 api_ver) |
2388 | +{ |
2389 | + return UCODE_HEADER_SIZE(1); |
2390 | +} |
2391 | +static u32 iwl3945_ucode_get_build(const struct iwl_ucode_header *ucode, |
2392 | + u32 api_ver) |
2393 | +{ |
2394 | + return 0; |
2395 | +} |
2396 | +static u8 *iwl3945_ucode_get_data(const struct iwl_ucode_header *ucode, |
2397 | + u32 api_ver) |
2398 | +{ |
2399 | + return (u8 *) ucode->u.v1.data; |
2400 | +} |
2401 | + |
2402 | +IWL3945_UCODE_GET(inst_size); |
2403 | +IWL3945_UCODE_GET(data_size); |
2404 | +IWL3945_UCODE_GET(init_size); |
2405 | +IWL3945_UCODE_GET(init_data_size); |
2406 | +IWL3945_UCODE_GET(boot_size); |
2407 | + |
2408 | static struct iwl_hcmd_ops iwl3945_hcmd = { |
2409 | .rxon_assoc = iwl3945_send_rxon_assoc, |
2410 | .commit_rxon = iwl3945_commit_rxon, |
2411 | }; |
2412 | |
2413 | +static struct iwl_ucode_ops iwl3945_ucode = { |
2414 | + .get_header_size = iwl3945_ucode_get_header_size, |
2415 | + .get_build = iwl3945_ucode_get_build, |
2416 | + .get_inst_size = iwl3945_ucode_get_inst_size, |
2417 | + .get_data_size = iwl3945_ucode_get_data_size, |
2418 | + .get_init_size = iwl3945_ucode_get_init_size, |
2419 | + .get_init_data_size = iwl3945_ucode_get_init_data_size, |
2420 | + .get_boot_size = iwl3945_ucode_get_boot_size, |
2421 | + .get_data = iwl3945_ucode_get_data, |
2422 | +}; |
2423 | + |
2424 | static struct iwl_lib_ops iwl3945_lib = { |
2425 | .txq_attach_buf_to_tfd = iwl3945_hw_txq_attach_buf_to_tfd, |
2426 | .txq_free_tfd = iwl3945_hw_txq_free_tfd, |
2427 | @@ -2829,6 +2868,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = { |
2428 | }; |
2429 | |
2430 | static struct iwl_ops iwl3945_ops = { |
2431 | + .ucode = &iwl3945_ucode, |
2432 | .lib = &iwl3945_lib, |
2433 | .hcmd = &iwl3945_hcmd, |
2434 | .utils = &iwl3945_hcmd_utils, |
2435 | diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c |
2436 | index 8f3d4bc..157ee15 100644 |
2437 | --- a/drivers/net/wireless/iwlwifi/iwl-4965.c |
2438 | +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c |
2439 | @@ -2221,12 +2221,50 @@ static void iwl4965_cancel_deferred_work(struct iwl_priv *priv) |
2440 | cancel_work_sync(&priv->txpower_work); |
2441 | } |
2442 | |
2443 | +#define IWL4965_UCODE_GET(item) \ |
2444 | +static u32 iwl4965_ucode_get_##item(const struct iwl_ucode_header *ucode,\ |
2445 | + u32 api_ver) \ |
2446 | +{ \ |
2447 | + return le32_to_cpu(ucode->u.v1.item); \ |
2448 | +} |
2449 | + |
2450 | +static u32 iwl4965_ucode_get_header_size(u32 api_ver) |
2451 | +{ |
2452 | + return UCODE_HEADER_SIZE(1); |
2453 | +} |
2454 | +static u32 iwl4965_ucode_get_build(const struct iwl_ucode_header *ucode, |
2455 | + u32 api_ver) |
2456 | +{ |
2457 | + return 0; |
2458 | +} |
2459 | +static u8 *iwl4965_ucode_get_data(const struct iwl_ucode_header *ucode, |
2460 | + u32 api_ver) |
2461 | +{ |
2462 | + return (u8 *) ucode->u.v1.data; |
2463 | +} |
2464 | + |
2465 | +IWL4965_UCODE_GET(inst_size); |
2466 | +IWL4965_UCODE_GET(data_size); |
2467 | +IWL4965_UCODE_GET(init_size); |
2468 | +IWL4965_UCODE_GET(init_data_size); |
2469 | +IWL4965_UCODE_GET(boot_size); |
2470 | + |
2471 | static struct iwl_hcmd_ops iwl4965_hcmd = { |
2472 | .rxon_assoc = iwl4965_send_rxon_assoc, |
2473 | .commit_rxon = iwl_commit_rxon, |
2474 | .set_rxon_chain = iwl_set_rxon_chain, |
2475 | }; |
2476 | |
2477 | +static struct iwl_ucode_ops iwl4965_ucode = { |
2478 | + .get_header_size = iwl4965_ucode_get_header_size, |
2479 | + .get_build = iwl4965_ucode_get_build, |
2480 | + .get_inst_size = iwl4965_ucode_get_inst_size, |
2481 | + .get_data_size = iwl4965_ucode_get_data_size, |
2482 | + .get_init_size = iwl4965_ucode_get_init_size, |
2483 | + .get_init_data_size = iwl4965_ucode_get_init_data_size, |
2484 | + .get_boot_size = iwl4965_ucode_get_boot_size, |
2485 | + .get_data = iwl4965_ucode_get_data, |
2486 | +}; |
2487 | static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { |
2488 | .get_hcmd_size = iwl4965_get_hcmd_size, |
2489 | .build_addsta_hcmd = iwl4965_build_addsta_hcmd, |
2490 | @@ -2287,6 +2325,7 @@ static struct iwl_lib_ops iwl4965_lib = { |
2491 | }; |
2492 | |
2493 | static struct iwl_ops iwl4965_ops = { |
2494 | + .ucode = &iwl4965_ucode, |
2495 | .lib = &iwl4965_lib, |
2496 | .hcmd = &iwl4965_hcmd, |
2497 | .utils = &iwl4965_hcmd_utils, |
2498 | diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c |
2499 | index b3c648c..a9ea3b5 100644 |
2500 | --- a/drivers/net/wireless/iwlwifi/iwl-5000.c |
2501 | +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c |
2502 | @@ -239,6 +239,13 @@ static void iwl5000_nic_config(struct iwl_priv *priv) |
2503 | APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS, |
2504 | ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS); |
2505 | |
2506 | + if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_1000) { |
2507 | + /* Setting digital SVR for 1000 card to 1.32V */ |
2508 | + iwl_set_bits_mask_prph(priv, APMG_DIGITAL_SVR_REG, |
2509 | + APMG_SVR_DIGITAL_VOLTAGE_1_32, |
2510 | + ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); |
2511 | + } |
2512 | + |
2513 | spin_unlock_irqrestore(&priv->lock, flags); |
2514 | } |
2515 | |
2516 | @@ -1426,6 +1433,44 @@ int iwl5000_calc_rssi(struct iwl_priv *priv, |
2517 | return max_rssi - agc - IWL49_RSSI_OFFSET; |
2518 | } |
2519 | |
2520 | +#define IWL5000_UCODE_GET(item) \ |
2521 | +static u32 iwl5000_ucode_get_##item(const struct iwl_ucode_header *ucode,\ |
2522 | + u32 api_ver) \ |
2523 | +{ \ |
2524 | + if (api_ver <= 2) \ |
2525 | + return le32_to_cpu(ucode->u.v1.item); \ |
2526 | + return le32_to_cpu(ucode->u.v2.item); \ |
2527 | +} |
2528 | + |
2529 | +static u32 iwl5000_ucode_get_header_size(u32 api_ver) |
2530 | +{ |
2531 | + if (api_ver <= 2) |
2532 | + return UCODE_HEADER_SIZE(1); |
2533 | + return UCODE_HEADER_SIZE(2); |
2534 | +} |
2535 | + |
2536 | +static u32 iwl5000_ucode_get_build(const struct iwl_ucode_header *ucode, |
2537 | + u32 api_ver) |
2538 | +{ |
2539 | + if (api_ver <= 2) |
2540 | + return 0; |
2541 | + return le32_to_cpu(ucode->u.v2.build); |
2542 | +} |
2543 | + |
2544 | +static u8 *iwl5000_ucode_get_data(const struct iwl_ucode_header *ucode, |
2545 | + u32 api_ver) |
2546 | +{ |
2547 | + if (api_ver <= 2) |
2548 | + return (u8 *) ucode->u.v1.data; |
2549 | + return (u8 *) ucode->u.v2.data; |
2550 | +} |
2551 | + |
2552 | +IWL5000_UCODE_GET(inst_size); |
2553 | +IWL5000_UCODE_GET(data_size); |
2554 | +IWL5000_UCODE_GET(init_size); |
2555 | +IWL5000_UCODE_GET(init_data_size); |
2556 | +IWL5000_UCODE_GET(boot_size); |
2557 | + |
2558 | struct iwl_hcmd_ops iwl5000_hcmd = { |
2559 | .rxon_assoc = iwl5000_send_rxon_assoc, |
2560 | .commit_rxon = iwl_commit_rxon, |
2561 | @@ -1441,6 +1486,17 @@ struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { |
2562 | .calc_rssi = iwl5000_calc_rssi, |
2563 | }; |
2564 | |
2565 | +struct iwl_ucode_ops iwl5000_ucode = { |
2566 | + .get_header_size = iwl5000_ucode_get_header_size, |
2567 | + .get_build = iwl5000_ucode_get_build, |
2568 | + .get_inst_size = iwl5000_ucode_get_inst_size, |
2569 | + .get_data_size = iwl5000_ucode_get_data_size, |
2570 | + .get_init_size = iwl5000_ucode_get_init_size, |
2571 | + .get_init_data_size = iwl5000_ucode_get_init_data_size, |
2572 | + .get_boot_size = iwl5000_ucode_get_boot_size, |
2573 | + .get_data = iwl5000_ucode_get_data, |
2574 | +}; |
2575 | + |
2576 | struct iwl_lib_ops iwl5000_lib = { |
2577 | .set_hw_params = iwl5000_hw_set_hw_params, |
2578 | .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, |
2579 | @@ -1542,12 +1598,14 @@ static struct iwl_lib_ops iwl5150_lib = { |
2580 | }; |
2581 | |
2582 | struct iwl_ops iwl5000_ops = { |
2583 | + .ucode = &iwl5000_ucode, |
2584 | .lib = &iwl5000_lib, |
2585 | .hcmd = &iwl5000_hcmd, |
2586 | .utils = &iwl5000_hcmd_utils, |
2587 | }; |
2588 | |
2589 | static struct iwl_ops iwl5150_ops = { |
2590 | + .ucode = &iwl5000_ucode, |
2591 | .lib = &iwl5150_lib, |
2592 | .hcmd = &iwl5000_hcmd, |
2593 | .utils = &iwl5000_hcmd_utils, |
2594 | diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c |
2595 | index bd438d8..e4a405f 100644 |
2596 | --- a/drivers/net/wireless/iwlwifi/iwl-6000.c |
2597 | +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c |
2598 | @@ -46,8 +46,8 @@ |
2599 | #include "iwl-5000-hw.h" |
2600 | |
2601 | /* Highest firmware API version supported */ |
2602 | -#define IWL6000_UCODE_API_MAX 2 |
2603 | -#define IWL6050_UCODE_API_MAX 2 |
2604 | +#define IWL6000_UCODE_API_MAX 3 |
2605 | +#define IWL6050_UCODE_API_MAX 3 |
2606 | |
2607 | /* Lowest firmware API version supported */ |
2608 | #define IWL6000_UCODE_API_MIN 1 |
2609 | @@ -69,6 +69,7 @@ static struct iwl_hcmd_utils_ops iwl6000_hcmd_utils = { |
2610 | }; |
2611 | |
2612 | static struct iwl_ops iwl6000_ops = { |
2613 | + .ucode = &iwl5000_ucode, |
2614 | .lib = &iwl5000_lib, |
2615 | .hcmd = &iwl5000_hcmd, |
2616 | .utils = &iwl6000_hcmd_utils, |
2617 | @@ -81,13 +82,15 @@ struct iwl_cfg iwl6000_2ag_cfg = { |
2618 | .ucode_api_min = IWL6000_UCODE_API_MIN, |
2619 | .sku = IWL_SKU_A|IWL_SKU_G, |
2620 | .ops = &iwl6000_ops, |
2621 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2622 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2623 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2624 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2625 | .mod_params = &iwl50_mod_params, |
2626 | .valid_tx_ant = ANT_BC, |
2627 | .valid_rx_ant = ANT_BC, |
2628 | .need_pll_cfg = false, |
2629 | + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
2630 | + .shadow_ram_support = true, |
2631 | }; |
2632 | |
2633 | struct iwl_cfg iwl6000_2agn_cfg = { |
2634 | @@ -97,13 +100,15 @@ struct iwl_cfg iwl6000_2agn_cfg = { |
2635 | .ucode_api_min = IWL6000_UCODE_API_MIN, |
2636 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
2637 | .ops = &iwl6000_ops, |
2638 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2639 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2640 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2641 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2642 | .mod_params = &iwl50_mod_params, |
2643 | .valid_tx_ant = ANT_AB, |
2644 | .valid_rx_ant = ANT_AB, |
2645 | .need_pll_cfg = false, |
2646 | + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
2647 | + .shadow_ram_support = true, |
2648 | }; |
2649 | |
2650 | struct iwl_cfg iwl6050_2agn_cfg = { |
2651 | @@ -113,13 +118,15 @@ struct iwl_cfg iwl6050_2agn_cfg = { |
2652 | .ucode_api_min = IWL6050_UCODE_API_MIN, |
2653 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
2654 | .ops = &iwl6000_ops, |
2655 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2656 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2657 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2658 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2659 | .mod_params = &iwl50_mod_params, |
2660 | .valid_tx_ant = ANT_AB, |
2661 | .valid_rx_ant = ANT_AB, |
2662 | .need_pll_cfg = false, |
2663 | + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
2664 | + .shadow_ram_support = true, |
2665 | }; |
2666 | |
2667 | struct iwl_cfg iwl6000_3agn_cfg = { |
2668 | @@ -129,13 +136,15 @@ struct iwl_cfg iwl6000_3agn_cfg = { |
2669 | .ucode_api_min = IWL6000_UCODE_API_MIN, |
2670 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
2671 | .ops = &iwl6000_ops, |
2672 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2673 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2674 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2675 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2676 | .mod_params = &iwl50_mod_params, |
2677 | .valid_tx_ant = ANT_ABC, |
2678 | .valid_rx_ant = ANT_ABC, |
2679 | .need_pll_cfg = false, |
2680 | + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
2681 | + .shadow_ram_support = true, |
2682 | }; |
2683 | |
2684 | struct iwl_cfg iwl6050_3agn_cfg = { |
2685 | @@ -145,13 +154,15 @@ struct iwl_cfg iwl6050_3agn_cfg = { |
2686 | .ucode_api_min = IWL6050_UCODE_API_MIN, |
2687 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
2688 | .ops = &iwl6000_ops, |
2689 | - .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
2690 | + .eeprom_size = OTP_LOW_IMAGE_SIZE, |
2691 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, |
2692 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
2693 | .mod_params = &iwl50_mod_params, |
2694 | .valid_tx_ant = ANT_ABC, |
2695 | .valid_rx_ant = ANT_ABC, |
2696 | .need_pll_cfg = false, |
2697 | + .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
2698 | + .shadow_ram_support = true, |
2699 | }; |
2700 | |
2701 | MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); |
2702 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c |
2703 | index 355f50e..2a577ae 100644 |
2704 | --- a/drivers/net/wireless/iwlwifi/iwl-agn.c |
2705 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c |
2706 | @@ -1348,7 +1348,7 @@ static void iwl_nic_start(struct iwl_priv *priv) |
2707 | */ |
2708 | static int iwl_read_ucode(struct iwl_priv *priv) |
2709 | { |
2710 | - struct iwl_ucode *ucode; |
2711 | + struct iwl_ucode_header *ucode; |
2712 | int ret = -EINVAL, index; |
2713 | const struct firmware *ucode_raw; |
2714 | const char *name_pre = priv->cfg->fw_name_pre; |
2715 | @@ -1357,7 +1357,8 @@ static int iwl_read_ucode(struct iwl_priv *priv) |
2716 | char buf[25]; |
2717 | u8 *src; |
2718 | size_t len; |
2719 | - u32 api_ver, inst_size, data_size, init_size, init_data_size, boot_size; |
2720 | + u32 api_ver, build; |
2721 | + u32 inst_size, data_size, init_size, init_data_size, boot_size; |
2722 | |
2723 | /* Ask kernel firmware_class module to get the boot firmware off disk. |
2724 | * request_firmware() is synchronous, file is in memory on return. */ |
2725 | @@ -1387,23 +1388,26 @@ static int iwl_read_ucode(struct iwl_priv *priv) |
2726 | if (ret < 0) |
2727 | goto error; |
2728 | |
2729 | - /* Make sure that we got at least our header! */ |
2730 | - if (ucode_raw->size < sizeof(*ucode)) { |
2731 | + /* Make sure that we got at least the v1 header! */ |
2732 | + if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) { |
2733 | IWL_ERR(priv, "File size way too small!\n"); |
2734 | ret = -EINVAL; |
2735 | goto err_release; |
2736 | } |
2737 | |
2738 | /* Data from ucode file: header followed by uCode images */ |
2739 | - ucode = (void *)ucode_raw->data; |
2740 | + ucode = (struct iwl_ucode_header *)ucode_raw->data; |
2741 | |
2742 | priv->ucode_ver = le32_to_cpu(ucode->ver); |
2743 | api_ver = IWL_UCODE_API(priv->ucode_ver); |
2744 | - inst_size = le32_to_cpu(ucode->inst_size); |
2745 | - data_size = le32_to_cpu(ucode->data_size); |
2746 | - init_size = le32_to_cpu(ucode->init_size); |
2747 | - init_data_size = le32_to_cpu(ucode->init_data_size); |
2748 | - boot_size = le32_to_cpu(ucode->boot_size); |
2749 | + build = priv->cfg->ops->ucode->get_build(ucode, api_ver); |
2750 | + inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver); |
2751 | + data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver); |
2752 | + init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver); |
2753 | + init_data_size = |
2754 | + priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver); |
2755 | + boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver); |
2756 | + src = priv->cfg->ops->ucode->get_data(ucode, api_ver); |
2757 | |
2758 | /* api_ver should match the api version forming part of the |
2759 | * firmware filename ... but we don't check for that and only rely |
2760 | @@ -1429,6 +1433,9 @@ static int iwl_read_ucode(struct iwl_priv *priv) |
2761 | IWL_UCODE_API(priv->ucode_ver), |
2762 | IWL_UCODE_SERIAL(priv->ucode_ver)); |
2763 | |
2764 | + if (build) |
2765 | + IWL_DEBUG_INFO(priv, "Build %u\n", build); |
2766 | + |
2767 | IWL_DEBUG_INFO(priv, "f/w package hdr ucode version raw = 0x%x\n", |
2768 | priv->ucode_ver); |
2769 | IWL_DEBUG_INFO(priv, "f/w package hdr runtime inst size = %u\n", |
2770 | @@ -1443,12 +1450,14 @@ static int iwl_read_ucode(struct iwl_priv *priv) |
2771 | boot_size); |
2772 | |
2773 | /* Verify size of file vs. image size info in file's header */ |
2774 | - if (ucode_raw->size < sizeof(*ucode) + |
2775 | + if (ucode_raw->size != |
2776 | + priv->cfg->ops->ucode->get_header_size(api_ver) + |
2777 | inst_size + data_size + init_size + |
2778 | init_data_size + boot_size) { |
2779 | |
2780 | - IWL_DEBUG_INFO(priv, "uCode file size %d too small\n", |
2781 | - (int)ucode_raw->size); |
2782 | + IWL_DEBUG_INFO(priv, |
2783 | + "uCode file size %d does not match expected size\n", |
2784 | + (int)ucode_raw->size); |
2785 | ret = -EINVAL; |
2786 | goto err_release; |
2787 | } |
2788 | @@ -1528,42 +1537,42 @@ static int iwl_read_ucode(struct iwl_priv *priv) |
2789 | /* Copy images into buffers for card's bus-master reads ... */ |
2790 | |
2791 | /* Runtime instructions (first block of data in file) */ |
2792 | - src = &ucode->data[0]; |
2793 | - len = priv->ucode_code.len; |
2794 | + len = inst_size; |
2795 | IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode instr len %Zd\n", len); |
2796 | memcpy(priv->ucode_code.v_addr, src, len); |
2797 | + src += len; |
2798 | + |
2799 | IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n", |
2800 | priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr); |
2801 | |
2802 | /* Runtime data (2nd block) |
2803 | * NOTE: Copy into backup buffer will be done in iwl_up() */ |
2804 | - src = &ucode->data[inst_size]; |
2805 | - len = priv->ucode_data.len; |
2806 | + len = data_size; |
2807 | IWL_DEBUG_INFO(priv, "Copying (but not loading) uCode data len %Zd\n", len); |
2808 | memcpy(priv->ucode_data.v_addr, src, len); |
2809 | memcpy(priv->ucode_data_backup.v_addr, src, len); |
2810 | + src += len; |
2811 | |
2812 | /* Initialization instructions (3rd block) */ |
2813 | if (init_size) { |
2814 | - src = &ucode->data[inst_size + data_size]; |
2815 | - len = priv->ucode_init.len; |
2816 | + len = init_size; |
2817 | IWL_DEBUG_INFO(priv, "Copying (but not loading) init instr len %Zd\n", |
2818 | len); |
2819 | memcpy(priv->ucode_init.v_addr, src, len); |
2820 | + src += len; |
2821 | } |
2822 | |
2823 | /* Initialization data (4th block) */ |
2824 | if (init_data_size) { |
2825 | - src = &ucode->data[inst_size + data_size + init_size]; |
2826 | - len = priv->ucode_init_data.len; |
2827 | + len = init_data_size; |
2828 | IWL_DEBUG_INFO(priv, "Copying (but not loading) init data len %Zd\n", |
2829 | len); |
2830 | memcpy(priv->ucode_init_data.v_addr, src, len); |
2831 | + src += len; |
2832 | } |
2833 | |
2834 | /* Bootstrap instructions (5th block) */ |
2835 | - src = &ucode->data[inst_size + data_size + init_size + init_data_size]; |
2836 | - len = priv->ucode_boot.len; |
2837 | + len = boot_size; |
2838 | IWL_DEBUG_INFO(priv, "Copying (but not loading) boot instr len %Zd\n", len); |
2839 | memcpy(priv->ucode_boot.v_addr, src, len); |
2840 | |
2841 | @@ -2206,7 +2215,7 @@ static void iwl_mac_stop(struct ieee80211_hw *hw) |
2842 | |
2843 | priv->is_open = 0; |
2844 | |
2845 | - if (iwl_is_ready_rf(priv)) { |
2846 | + if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) { |
2847 | /* stop mac, cancel any scan request and clear |
2848 | * RXON_FILTER_ASSOC_MSK BIT |
2849 | */ |
2850 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h |
2851 | index dabf663..1e51891 100644 |
2852 | --- a/drivers/net/wireless/iwlwifi/iwl-core.h |
2853 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.h |
2854 | @@ -116,6 +116,17 @@ struct iwl_temp_ops { |
2855 | void (*set_ct_kill)(struct iwl_priv *priv); |
2856 | }; |
2857 | |
2858 | +struct iwl_ucode_ops { |
2859 | + u32 (*get_header_size)(u32); |
2860 | + u32 (*get_build)(const struct iwl_ucode_header *, u32); |
2861 | + u32 (*get_inst_size)(const struct iwl_ucode_header *, u32); |
2862 | + u32 (*get_data_size)(const struct iwl_ucode_header *, u32); |
2863 | + u32 (*get_init_size)(const struct iwl_ucode_header *, u32); |
2864 | + u32 (*get_init_data_size)(const struct iwl_ucode_header *, u32); |
2865 | + u32 (*get_boot_size)(const struct iwl_ucode_header *, u32); |
2866 | + u8 * (*get_data)(const struct iwl_ucode_header *, u32); |
2867 | +}; |
2868 | + |
2869 | struct iwl_lib_ops { |
2870 | /* set hw dependent parameters */ |
2871 | int (*set_hw_params)(struct iwl_priv *priv); |
2872 | @@ -171,6 +182,7 @@ struct iwl_lib_ops { |
2873 | }; |
2874 | |
2875 | struct iwl_ops { |
2876 | + const struct iwl_ucode_ops *ucode; |
2877 | const struct iwl_lib_ops *lib; |
2878 | const struct iwl_hcmd_ops *hcmd; |
2879 | const struct iwl_hcmd_utils_ops *utils; |
2880 | @@ -195,6 +207,8 @@ struct iwl_mod_params { |
2881 | * filename is constructed as fw_name_pre<api>.ucode. |
2882 | * @ucode_api_max: Highest version of uCode API supported by driver. |
2883 | * @ucode_api_min: Lowest version of uCode API supported by driver. |
2884 | + * @max_ll_items: max number of OTP blocks |
2885 | + * @shadow_ram_support: shadow support for OTP memory |
2886 | * |
2887 | * We enable the driver to be backward compatible wrt API version. The |
2888 | * driver specifies which APIs it supports (with @ucode_api_max being the |
2889 | @@ -231,6 +245,8 @@ struct iwl_cfg { |
2890 | u8 valid_rx_ant; |
2891 | bool need_pll_cfg; |
2892 | bool use_isr_legacy; |
2893 | + const u16 max_ll_items; |
2894 | + const bool shadow_ram_support; |
2895 | }; |
2896 | |
2897 | /*************************** |
2898 | diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h |
2899 | index 650e20a..e8c8607 100644 |
2900 | --- a/drivers/net/wireless/iwlwifi/iwl-dev.h |
2901 | +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h |
2902 | @@ -66,6 +66,7 @@ extern struct iwl_cfg iwl1000_bgn_cfg; |
2903 | /* shared structures from iwl-5000.c */ |
2904 | extern struct iwl_mod_params iwl50_mod_params; |
2905 | extern struct iwl_ops iwl5000_ops; |
2906 | +extern struct iwl_ucode_ops iwl5000_ucode; |
2907 | extern struct iwl_lib_ops iwl5000_lib; |
2908 | extern struct iwl_hcmd_ops iwl5000_hcmd; |
2909 | extern struct iwl_hcmd_utils_ops iwl5000_hcmd_utils; |
2910 | @@ -525,15 +526,29 @@ struct fw_desc { |
2911 | }; |
2912 | |
2913 | /* uCode file layout */ |
2914 | -struct iwl_ucode { |
2915 | - __le32 ver; /* major/minor/API/serial */ |
2916 | - __le32 inst_size; /* bytes of runtime instructions */ |
2917 | - __le32 data_size; /* bytes of runtime data */ |
2918 | - __le32 init_size; /* bytes of initialization instructions */ |
2919 | - __le32 init_data_size; /* bytes of initialization data */ |
2920 | - __le32 boot_size; /* bytes of bootstrap instructions */ |
2921 | - u8 data[0]; /* data in same order as "size" elements */ |
2922 | +struct iwl_ucode_header { |
2923 | + __le32 ver; /* major/minor/API/serial */ |
2924 | + union { |
2925 | + struct { |
2926 | + __le32 inst_size; /* bytes of runtime code */ |
2927 | + __le32 data_size; /* bytes of runtime data */ |
2928 | + __le32 init_size; /* bytes of init code */ |
2929 | + __le32 init_data_size; /* bytes of init data */ |
2930 | + __le32 boot_size; /* bytes of bootstrap code */ |
2931 | + u8 data[0]; /* in same order as sizes */ |
2932 | + } v1; |
2933 | + struct { |
2934 | + __le32 build; /* build number */ |
2935 | + __le32 inst_size; /* bytes of runtime code */ |
2936 | + __le32 data_size; /* bytes of runtime data */ |
2937 | + __le32 init_size; /* bytes of init code */ |
2938 | + __le32 init_data_size; /* bytes of init data */ |
2939 | + __le32 boot_size; /* bytes of bootstrap code */ |
2940 | + u8 data[0]; /* in same order as sizes */ |
2941 | + } v2; |
2942 | + } u; |
2943 | }; |
2944 | +#define UCODE_HEADER_SIZE(ver) ((ver) == 1 ? 24 : 28) |
2945 | |
2946 | struct iwl4965_ibss_seq { |
2947 | u8 mac[ETH_ALEN]; |
2948 | @@ -820,6 +835,18 @@ enum iwl_nvm_type { |
2949 | NVM_DEVICE_TYPE_OTP, |
2950 | }; |
2951 | |
2952 | +/* |
2953 | + * Two types of OTP memory access modes |
2954 | + * IWL_OTP_ACCESS_ABSOLUTE - absolute address mode, |
2955 | + * based on physical memory addressing |
2956 | + * IWL_OTP_ACCESS_RELATIVE - relative address mode, |
2957 | + * based on logical memory addressing |
2958 | + */ |
2959 | +enum iwl_access_mode { |
2960 | + IWL_OTP_ACCESS_ABSOLUTE, |
2961 | + IWL_OTP_ACCESS_RELATIVE, |
2962 | +}; |
2963 | + |
2964 | /* interrupt statistics */ |
2965 | struct isr_statistics { |
2966 | u32 hw; |
2967 | diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c |
2968 | index 7d7554a..e8c0e82 100644 |
2969 | --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c |
2970 | +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c |
2971 | @@ -152,6 +152,19 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv) |
2972 | } |
2973 | EXPORT_SYMBOL(iwlcore_eeprom_verify_signature); |
2974 | |
2975 | +static void iwl_set_otp_access(struct iwl_priv *priv, enum iwl_access_mode mode) |
2976 | +{ |
2977 | + u32 otpgp; |
2978 | + |
2979 | + otpgp = iwl_read32(priv, CSR_OTP_GP_REG); |
2980 | + if (mode == IWL_OTP_ACCESS_ABSOLUTE) |
2981 | + iwl_clear_bit(priv, CSR_OTP_GP_REG, |
2982 | + CSR_OTP_GP_REG_OTP_ACCESS_MODE); |
2983 | + else |
2984 | + iwl_set_bit(priv, CSR_OTP_GP_REG, |
2985 | + CSR_OTP_GP_REG_OTP_ACCESS_MODE); |
2986 | +} |
2987 | + |
2988 | static int iwlcore_get_nvm_type(struct iwl_priv *priv) |
2989 | { |
2990 | u32 otpgp; |
2991 | @@ -249,6 +262,124 @@ static int iwl_init_otp_access(struct iwl_priv *priv) |
2992 | return ret; |
2993 | } |
2994 | |
2995 | +static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, u16 *eeprom_data) |
2996 | +{ |
2997 | + int ret = 0; |
2998 | + u32 r; |
2999 | + u32 otpgp; |
3000 | + |
3001 | + _iwl_write32(priv, CSR_EEPROM_REG, |
3002 | + CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); |
3003 | + ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG, |
3004 | + CSR_EEPROM_REG_READ_VALID_MSK, |
3005 | + IWL_EEPROM_ACCESS_TIMEOUT); |
3006 | + if (ret < 0) { |
3007 | + IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); |
3008 | + return ret; |
3009 | + } |
3010 | + r = _iwl_read_direct32(priv, CSR_EEPROM_REG); |
3011 | + /* check for ECC errors: */ |
3012 | + otpgp = iwl_read32(priv, CSR_OTP_GP_REG); |
3013 | + if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { |
3014 | + /* stop in this case */ |
3015 | + /* set the uncorrectable OTP ECC bit for acknowledgement */ |
3016 | + iwl_set_bit(priv, CSR_OTP_GP_REG, |
3017 | + CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK); |
3018 | + IWL_ERR(priv, "Uncorrectable OTP ECC error, abort OTP read\n"); |
3019 | + return -EINVAL; |
3020 | + } |
3021 | + if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) { |
3022 | + /* continue in this case */ |
3023 | + /* set the correctable OTP ECC bit for acknowledgement */ |
3024 | + iwl_set_bit(priv, CSR_OTP_GP_REG, |
3025 | + CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK); |
3026 | + IWL_ERR(priv, "Correctable OTP ECC error, continue read\n"); |
3027 | + } |
3028 | + *eeprom_data = le16_to_cpu((__force __le16)(r >> 16)); |
3029 | + return 0; |
3030 | +} |
3031 | + |
3032 | +/* |
3033 | + * iwl_is_otp_empty: check for empty OTP |
3034 | + */ |
3035 | +static bool iwl_is_otp_empty(struct iwl_priv *priv) |
3036 | +{ |
3037 | + u16 next_link_addr = 0, link_value; |
3038 | + bool is_empty = false; |
3039 | + |
3040 | + /* locate the beginning of OTP link list */ |
3041 | + if (!iwl_read_otp_word(priv, next_link_addr, &link_value)) { |
3042 | + if (!link_value) { |
3043 | + IWL_ERR(priv, "OTP is empty\n"); |
3044 | + is_empty = true; |
3045 | + } |
3046 | + } else { |
3047 | + IWL_ERR(priv, "Unable to read first block of OTP list.\n"); |
3048 | + is_empty = true; |
3049 | + } |
3050 | + |
3051 | + return is_empty; |
3052 | +} |
3053 | + |
3054 | + |
3055 | +/* |
3056 | + * iwl_find_otp_image: find EEPROM image in OTP |
3057 | + * finding the OTP block that contains the EEPROM image. |
3058 | + * the last valid block on the link list (the block _before_ the last block) |
3059 | + * is the block we should read and used to configure the device. |
3060 | + * If all the available OTP blocks are full, the last block will be the block |
3061 | + * we should read and used to configure the device. |
3062 | + * only perform this operation if shadow RAM is disabled |
3063 | + */ |
3064 | +static int iwl_find_otp_image(struct iwl_priv *priv, |
3065 | + u16 *validblockaddr) |
3066 | +{ |
3067 | + u16 next_link_addr = 0, link_value = 0, valid_addr; |
3068 | + int ret = 0; |
3069 | + int usedblocks = 0; |
3070 | + |
3071 | + /* set addressing mode to absolute to traverse the link list */ |
3072 | + iwl_set_otp_access(priv, IWL_OTP_ACCESS_ABSOLUTE); |
3073 | + |
3074 | + /* checking for empty OTP or error */ |
3075 | + if (iwl_is_otp_empty(priv)) |
3076 | + return -EINVAL; |
3077 | + |
3078 | + /* |
3079 | + * start traverse link list |
3080 | + * until reach the max number of OTP blocks |
3081 | + * different devices have different number of OTP blocks |
3082 | + */ |
3083 | + do { |
3084 | + /* save current valid block address |
3085 | + * check for more block on the link list |
3086 | + */ |
3087 | + valid_addr = next_link_addr; |
3088 | + next_link_addr = link_value; |
3089 | + IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n", |
3090 | + usedblocks, next_link_addr); |
3091 | + if (iwl_read_otp_word(priv, next_link_addr, &link_value)) |
3092 | + return -EINVAL; |
3093 | + if (!link_value) { |
3094 | + /* |
3095 | + * reach the end of link list, |
3096 | + * set address point to the starting address |
3097 | + * of the image |
3098 | + */ |
3099 | + goto done; |
3100 | + } |
3101 | + /* more in the link list, continue */ |
3102 | + usedblocks++; |
3103 | + } while (usedblocks < priv->cfg->max_ll_items); |
3104 | + /* OTP full, use last block */ |
3105 | + IWL_DEBUG_INFO(priv, "OTP is full, use last block\n"); |
3106 | +done: |
3107 | + *validblockaddr = valid_addr; |
3108 | + /* skip first 2 bytes (link list pointer) */ |
3109 | + *validblockaddr += 2; |
3110 | + return ret; |
3111 | +} |
3112 | + |
3113 | /** |
3114 | * iwl_eeprom_init - read EEPROM contents |
3115 | * |
3116 | @@ -263,14 +394,13 @@ int iwl_eeprom_init(struct iwl_priv *priv) |
3117 | int sz; |
3118 | int ret; |
3119 | u16 addr; |
3120 | - u32 otpgp; |
3121 | + u16 validblockaddr = 0; |
3122 | + u16 cache_addr = 0; |
3123 | |
3124 | priv->nvm_device_type = iwlcore_get_nvm_type(priv); |
3125 | |
3126 | /* allocate eeprom */ |
3127 | - if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) |
3128 | - priv->cfg->eeprom_size = |
3129 | - OTP_BLOCK_SIZE * OTP_LOWER_BLOCKS_TOTAL; |
3130 | + IWL_DEBUG_INFO(priv, "NVM size = %d\n", priv->cfg->eeprom_size); |
3131 | sz = priv->cfg->eeprom_size; |
3132 | priv->eeprom = kzalloc(sz, GFP_KERNEL); |
3133 | if (!priv->eeprom) { |
3134 | @@ -298,46 +428,31 @@ int iwl_eeprom_init(struct iwl_priv *priv) |
3135 | if (ret) { |
3136 | IWL_ERR(priv, "Failed to initialize OTP access.\n"); |
3137 | ret = -ENOENT; |
3138 | - goto err; |
3139 | + goto done; |
3140 | } |
3141 | _iwl_write32(priv, CSR_EEPROM_GP, |
3142 | iwl_read32(priv, CSR_EEPROM_GP) & |
3143 | ~CSR_EEPROM_GP_IF_OWNER_MSK); |
3144 | - /* clear */ |
3145 | - _iwl_write32(priv, CSR_OTP_GP_REG, |
3146 | - iwl_read32(priv, CSR_OTP_GP_REG) | |
3147 | + |
3148 | + iwl_set_bit(priv, CSR_OTP_GP_REG, |
3149 | CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK | |
3150 | CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK); |
3151 | - |
3152 | - for (addr = 0; addr < sz; addr += sizeof(u16)) { |
3153 | - u32 r; |
3154 | - |
3155 | - _iwl_write32(priv, CSR_EEPROM_REG, |
3156 | - CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); |
3157 | - |
3158 | - ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG, |
3159 | - CSR_EEPROM_REG_READ_VALID_MSK, |
3160 | - IWL_EEPROM_ACCESS_TIMEOUT); |
3161 | - if (ret < 0) { |
3162 | - IWL_ERR(priv, "Time out reading OTP[%d]\n", addr); |
3163 | + /* traversing the linked list if no shadow ram supported */ |
3164 | + if (!priv->cfg->shadow_ram_support) { |
3165 | + if (iwl_find_otp_image(priv, &validblockaddr)) { |
3166 | + ret = -ENOENT; |
3167 | goto done; |
3168 | } |
3169 | - r = _iwl_read_direct32(priv, CSR_EEPROM_REG); |
3170 | - /* check for ECC errors: */ |
3171 | - otpgp = iwl_read32(priv, CSR_OTP_GP_REG); |
3172 | - if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { |
3173 | - /* stop in this case */ |
3174 | - IWL_ERR(priv, "Uncorrectable OTP ECC error, Abort OTP read\n"); |
3175 | + } |
3176 | + for (addr = validblockaddr; addr < validblockaddr + sz; |
3177 | + addr += sizeof(u16)) { |
3178 | + u16 eeprom_data; |
3179 | + |
3180 | + ret = iwl_read_otp_word(priv, addr, &eeprom_data); |
3181 | + if (ret) |
3182 | goto done; |
3183 | - } |
3184 | - if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) { |
3185 | - /* continue in this case */ |
3186 | - _iwl_write32(priv, CSR_OTP_GP_REG, |
3187 | - iwl_read32(priv, CSR_OTP_GP_REG) | |
3188 | - CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK); |
3189 | - IWL_ERR(priv, "Correctable OTP ECC error, continue read\n"); |
3190 | - } |
3191 | - e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); |
3192 | + e[cache_addr / 2] = eeprom_data; |
3193 | + cache_addr += sizeof(u16); |
3194 | } |
3195 | } else { |
3196 | /* eeprom is an array of 16bit values */ |
3197 | diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h |
3198 | index 195b4ef..7899885 100644 |
3199 | --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h |
3200 | +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h |
3201 | @@ -180,8 +180,14 @@ struct iwl_eeprom_channel { |
3202 | #define EEPROM_5050_EEPROM_VERSION (0x21E) |
3203 | |
3204 | /* OTP */ |
3205 | -#define OTP_LOWER_BLOCKS_TOTAL (3) |
3206 | -#define OTP_BLOCK_SIZE (0x400) |
3207 | +/* lower blocks contain EEPROM image and calibration data */ |
3208 | +#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */ |
3209 | +/* high blocks contain PAPD data */ |
3210 | +#define OTP_HIGH_IMAGE_SIZE_6x00 (6 * 512 * sizeof(u16)) /* 6 KB */ |
3211 | +#define OTP_HIGH_IMAGE_SIZE_1000 (0x200 * sizeof(u16)) /* 1024 bytes */ |
3212 | +#define OTP_MAX_LL_ITEMS_1000 (3) /* OTP blocks for 1000 */ |
3213 | +#define OTP_MAX_LL_ITEMS_6x00 (4) /* OTP blocks for 6x00 */ |
3214 | +#define OTP_MAX_LL_ITEMS_6x50 (7) /* OTP blocks for 6x50 */ |
3215 | |
3216 | /* 2.4 GHz */ |
3217 | extern const u8 iwl_eeprom_band_1[14]; |
3218 | diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h |
3219 | index 3b9cac3..d393e8f 100644 |
3220 | --- a/drivers/net/wireless/iwlwifi/iwl-prph.h |
3221 | +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h |
3222 | @@ -80,6 +80,8 @@ |
3223 | #define APMG_RFKILL_REG (APMG_BASE + 0x0014) |
3224 | #define APMG_RTC_INT_STT_REG (APMG_BASE + 0x001c) |
3225 | #define APMG_RTC_INT_MSK_REG (APMG_BASE + 0x0020) |
3226 | +#define APMG_DIGITAL_SVR_REG (APMG_BASE + 0x0058) |
3227 | +#define APMG_ANALOG_SVR_REG (APMG_BASE + 0x006C) |
3228 | |
3229 | #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) |
3230 | #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) |
3231 | @@ -91,7 +93,8 @@ |
3232 | #define APMG_PS_CTRL_VAL_PWR_SRC_VMAIN (0x00000000) |
3233 | #define APMG_PS_CTRL_VAL_PWR_SRC_MAX (0x01000000) /* 3945 only */ |
3234 | #define APMG_PS_CTRL_VAL_PWR_SRC_VAUX (0x02000000) |
3235 | - |
3236 | +#define APMG_SVR_VOLTAGE_CONFIG_BIT_MSK (0x000001E0) /* bit 8:5 */ |
3237 | +#define APMG_SVR_DIGITAL_VOLTAGE_1_32 (0x00000060) |
3238 | |
3239 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) |
3240 | |
3241 | diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c |
3242 | index e26875d..474fd49 100644 |
3243 | --- a/drivers/net/wireless/iwlwifi/iwl-scan.c |
3244 | +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c |
3245 | @@ -799,7 +799,8 @@ void iwl_bg_abort_scan(struct work_struct *work) |
3246 | { |
3247 | struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); |
3248 | |
3249 | - if (!iwl_is_ready(priv)) |
3250 | + if (!test_bit(STATUS_READY, &priv->status) || |
3251 | + !test_bit(STATUS_GEO_CONFIGURED, &priv->status)) |
3252 | return; |
3253 | |
3254 | mutex_lock(&priv->mutex); |
3255 | diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c |
3256 | index 5238433..054d6c7 100644 |
3257 | --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c |
3258 | +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c |
3259 | @@ -2111,7 +2111,7 @@ static void iwl3945_nic_start(struct iwl_priv *priv) |
3260 | */ |
3261 | static int iwl3945_read_ucode(struct iwl_priv *priv) |
3262 | { |
3263 | - struct iwl_ucode *ucode; |
3264 | + const struct iwl_ucode_header *ucode; |
3265 | int ret = -EINVAL, index; |
3266 | const struct firmware *ucode_raw; |
3267 | /* firmware file name contains uCode/driver compatibility version */ |
3268 | @@ -2152,22 +2152,24 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) |
3269 | goto error; |
3270 | |
3271 | /* Make sure that we got at least our header! */ |
3272 | - if (ucode_raw->size < sizeof(*ucode)) { |
3273 | + if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) { |
3274 | IWL_ERR(priv, "File size way too small!\n"); |
3275 | ret = -EINVAL; |
3276 | goto err_release; |
3277 | } |
3278 | |
3279 | /* Data from ucode file: header followed by uCode images */ |
3280 | - ucode = (void *)ucode_raw->data; |
3281 | + ucode = (struct iwl_ucode_header *)ucode_raw->data; |
3282 | |
3283 | priv->ucode_ver = le32_to_cpu(ucode->ver); |
3284 | api_ver = IWL_UCODE_API(priv->ucode_ver); |
3285 | - inst_size = le32_to_cpu(ucode->inst_size); |
3286 | - data_size = le32_to_cpu(ucode->data_size); |
3287 | - init_size = le32_to_cpu(ucode->init_size); |
3288 | - init_data_size = le32_to_cpu(ucode->init_data_size); |
3289 | - boot_size = le32_to_cpu(ucode->boot_size); |
3290 | + inst_size = priv->cfg->ops->ucode->get_inst_size(ucode, api_ver); |
3291 | + data_size = priv->cfg->ops->ucode->get_data_size(ucode, api_ver); |
3292 | + init_size = priv->cfg->ops->ucode->get_init_size(ucode, api_ver); |
3293 | + init_data_size = |
3294 | + priv->cfg->ops->ucode->get_init_data_size(ucode, api_ver); |
3295 | + boot_size = priv->cfg->ops->ucode->get_boot_size(ucode, api_ver); |
3296 | + src = priv->cfg->ops->ucode->get_data(ucode, api_ver); |
3297 | |
3298 | /* api_ver should match the api version forming part of the |
3299 | * firmware filename ... but we don't check for that and only rely |
3300 | @@ -2208,12 +2210,13 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) |
3301 | |
3302 | |
3303 | /* Verify size of file vs. image size info in file's header */ |
3304 | - if (ucode_raw->size < sizeof(*ucode) + |
3305 | + if (ucode_raw->size != priv->cfg->ops->ucode->get_header_size(api_ver) + |
3306 | inst_size + data_size + init_size + |
3307 | init_data_size + boot_size) { |
3308 | |
3309 | - IWL_DEBUG_INFO(priv, "uCode file size %zd too small\n", |
3310 | - ucode_raw->size); |
3311 | + IWL_DEBUG_INFO(priv, |
3312 | + "uCode file size %zd does not match expected size\n", |
3313 | + ucode_raw->size); |
3314 | ret = -EINVAL; |
3315 | goto err_release; |
3316 | } |
3317 | @@ -2296,44 +2299,44 @@ static int iwl3945_read_ucode(struct iwl_priv *priv) |
3318 | /* Copy images into buffers for card's bus-master reads ... */ |
3319 | |
3320 | /* Runtime instructions (first block of data in file) */ |
3321 | - src = &ucode->data[0]; |
3322 | - len = priv->ucode_code.len; |
3323 | + len = inst_size; |
3324 | IWL_DEBUG_INFO(priv, |
3325 | "Copying (but not loading) uCode instr len %zd\n", len); |
3326 | memcpy(priv->ucode_code.v_addr, src, len); |
3327 | + src += len; |
3328 | + |
3329 | IWL_DEBUG_INFO(priv, "uCode instr buf vaddr = 0x%p, paddr = 0x%08x\n", |
3330 | priv->ucode_code.v_addr, (u32)priv->ucode_code.p_addr); |
3331 | |
3332 | /* Runtime data (2nd block) |
3333 | * NOTE: Copy into backup buffer will be done in iwl3945_up() */ |
3334 | - src = &ucode->data[inst_size]; |
3335 | - len = priv->ucode_data.len; |
3336 | + len = data_size; |
3337 | IWL_DEBUG_INFO(priv, |
3338 | "Copying (but not loading) uCode data len %zd\n", len); |
3339 | memcpy(priv->ucode_data.v_addr, src, len); |
3340 | memcpy(priv->ucode_data_backup.v_addr, src, len); |
3341 | + src += len; |
3342 | |
3343 | /* Initialization instructions (3rd block) */ |
3344 | if (init_size) { |
3345 | - src = &ucode->data[inst_size + data_size]; |
3346 | - len = priv->ucode_init.len; |
3347 | + len = init_size; |
3348 | IWL_DEBUG_INFO(priv, |
3349 | "Copying (but not loading) init instr len %zd\n", len); |
3350 | memcpy(priv->ucode_init.v_addr, src, len); |
3351 | + src += len; |
3352 | } |
3353 | |
3354 | /* Initialization data (4th block) */ |
3355 | if (init_data_size) { |
3356 | - src = &ucode->data[inst_size + data_size + init_size]; |
3357 | - len = priv->ucode_init_data.len; |
3358 | + len = init_data_size; |
3359 | IWL_DEBUG_INFO(priv, |
3360 | "Copying (but not loading) init data len %zd\n", len); |
3361 | memcpy(priv->ucode_init_data.v_addr, src, len); |
3362 | + src += len; |
3363 | } |
3364 | |
3365 | /* Bootstrap instructions (5th block) */ |
3366 | - src = &ucode->data[inst_size + data_size + init_size + init_data_size]; |
3367 | - len = priv->ucode_boot.len; |
3368 | + len = boot_size; |
3369 | IWL_DEBUG_INFO(priv, |
3370 | "Copying (but not loading) boot instr len %zd\n", len); |
3371 | memcpy(priv->ucode_boot.v_addr, src, len); |
3372 | diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c |
3373 | index 0e877a1..6e1b889 100644 |
3374 | --- a/drivers/net/wireless/p54/p54usb.c |
3375 | +++ b/drivers/net/wireless/p54/p54usb.c |
3376 | @@ -66,6 +66,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { |
3377 | {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/ |
3378 | {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ |
3379 | {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ |
3380 | + {USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */ |
3381 | {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ |
3382 | {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ |
3383 | {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ |
3384 | diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c |
3385 | index 9e1140f..e1dcced 100644 |
3386 | --- a/drivers/pcmcia/at91_cf.c |
3387 | +++ b/drivers/pcmcia/at91_cf.c |
3388 | @@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) |
3389 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); |
3390 | struct at91_cf_data *board = cf->board; |
3391 | |
3392 | - pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
3393 | + pcmcia_socket_dev_suspend(&pdev->dev); |
3394 | if (device_may_wakeup(&pdev->dev)) { |
3395 | enable_irq_wake(board->det_pin); |
3396 | if (board->irq_pin) |
3397 | diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c |
3398 | index 9001334..0208870 100644 |
3399 | --- a/drivers/pcmcia/au1000_generic.c |
3400 | +++ b/drivers/pcmcia/au1000_generic.c |
3401 | @@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struct platform_device *dev) |
3402 | static int au1x00_drv_pcmcia_suspend(struct platform_device *dev, |
3403 | pm_message_t state) |
3404 | { |
3405 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3406 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3407 | } |
3408 | |
3409 | static int au1x00_drv_pcmcia_resume(struct platform_device *dev) |
3410 | diff --git a/drivers/pcmcia/bfin_cf_pcmcia.c b/drivers/pcmcia/bfin_cf_pcmcia.c |
3411 | index b59d411..300b368 100644 |
3412 | --- a/drivers/pcmcia/bfin_cf_pcmcia.c |
3413 | +++ b/drivers/pcmcia/bfin_cf_pcmcia.c |
3414 | @@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(struct platform_device *pdev) |
3415 | |
3416 | static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg) |
3417 | { |
3418 | - return pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
3419 | + return pcmcia_socket_dev_suspend(&pdev->dev); |
3420 | } |
3421 | |
3422 | static int bfin_cf_resume(struct platform_device *pdev) |
3423 | diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c |
3424 | index 0660ad1..934d4be 100644 |
3425 | --- a/drivers/pcmcia/cs.c |
3426 | +++ b/drivers/pcmcia/cs.c |
3427 | @@ -101,7 +101,7 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem); |
3428 | static int socket_resume(struct pcmcia_socket *skt); |
3429 | static int socket_suspend(struct pcmcia_socket *skt); |
3430 | |
3431 | -int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) |
3432 | +int pcmcia_socket_dev_suspend(struct device *dev) |
3433 | { |
3434 | struct pcmcia_socket *socket; |
3435 | |
3436 | diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c |
3437 | index 46561fa..a04f21c 100644 |
3438 | --- a/drivers/pcmcia/i82092.c |
3439 | +++ b/drivers/pcmcia/i82092.c |
3440 | @@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); |
3441 | #ifdef CONFIG_PM |
3442 | static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) |
3443 | { |
3444 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3445 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3446 | } |
3447 | |
3448 | static int i82092aa_socket_resume (struct pci_dev *dev) |
3449 | diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c |
3450 | index 40d4953..b906abe 100644 |
3451 | --- a/drivers/pcmcia/i82365.c |
3452 | +++ b/drivers/pcmcia/i82365.c |
3453 | @@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socket *s) |
3454 | static int i82365_drv_pcmcia_suspend(struct platform_device *dev, |
3455 | pm_message_t state) |
3456 | { |
3457 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3458 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3459 | } |
3460 | |
3461 | static int i82365_drv_pcmcia_resume(struct platform_device *dev) |
3462 | diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c |
3463 | index 62b4ecc..d1d89c4 100644 |
3464 | --- a/drivers/pcmcia/m32r_cfc.c |
3465 | +++ b/drivers/pcmcia/m32r_cfc.c |
3466 | @@ -699,7 +699,7 @@ static struct pccard_operations pcc_operations = { |
3467 | static int cfc_drv_pcmcia_suspend(struct platform_device *dev, |
3468 | pm_message_t state) |
3469 | { |
3470 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3471 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3472 | } |
3473 | |
3474 | static int cfc_drv_pcmcia_resume(struct platform_device *dev) |
3475 | diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c |
3476 | index 12034b4..a065583 100644 |
3477 | --- a/drivers/pcmcia/m32r_pcc.c |
3478 | +++ b/drivers/pcmcia/m32r_pcc.c |
3479 | @@ -675,7 +675,7 @@ static struct pccard_operations pcc_operations = { |
3480 | static int pcc_drv_pcmcia_suspend(struct platform_device *dev, |
3481 | pm_message_t state) |
3482 | { |
3483 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3484 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3485 | } |
3486 | |
3487 | static int pcc_drv_pcmcia_resume(struct platform_device *dev) |
3488 | diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c |
3489 | index d1ad096..c69f2c4 100644 |
3490 | --- a/drivers/pcmcia/m8xx_pcmcia.c |
3491 | +++ b/drivers/pcmcia/m8xx_pcmcia.c |
3492 | @@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device *ofdev) |
3493 | #ifdef CONFIG_PM |
3494 | static int m8xx_suspend(struct platform_device *pdev, pm_message_t state) |
3495 | { |
3496 | - return pcmcia_socket_dev_suspend(&pdev->dev, state); |
3497 | + return pcmcia_socket_dev_suspend(&pdev->dev); |
3498 | } |
3499 | |
3500 | static int m8xx_resume(struct platform_device *pdev) |
3501 | diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c |
3502 | index f373639..68570bc 100644 |
3503 | --- a/drivers/pcmcia/omap_cf.c |
3504 | +++ b/drivers/pcmcia/omap_cf.c |
3505 | @@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct platform_device *pdev) |
3506 | |
3507 | static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg) |
3508 | { |
3509 | - return pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
3510 | + return pcmcia_socket_dev_suspend(&pdev->dev); |
3511 | } |
3512 | |
3513 | static int omap_cf_resume(struct platform_device *pdev) |
3514 | diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c |
3515 | index 8bed1da..1c39d34 100644 |
3516 | --- a/drivers/pcmcia/pd6729.c |
3517 | +++ b/drivers/pcmcia/pd6729.c |
3518 | @@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev) |
3519 | #ifdef CONFIG_PM |
3520 | static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) |
3521 | { |
3522 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3523 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3524 | } |
3525 | |
3526 | static int pd6729_socket_resume(struct pci_dev *dev) |
3527 | diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c |
3528 | index c49a726..86ad876 100644 |
3529 | --- a/drivers/pcmcia/pxa2xx_base.c |
3530 | +++ b/drivers/pcmcia/pxa2xx_base.c |
3531 | @@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev) |
3532 | |
3533 | static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) |
3534 | { |
3535 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3536 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3537 | } |
3538 | |
3539 | static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev) |
3540 | diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c |
3541 | index d8da5ac..2d0e997 100644 |
3542 | --- a/drivers/pcmcia/sa1100_generic.c |
3543 | +++ b/drivers/pcmcia/sa1100_generic.c |
3544 | @@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) |
3545 | static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev, |
3546 | pm_message_t state) |
3547 | { |
3548 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3549 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3550 | } |
3551 | |
3552 | static int sa11x0_drv_pcmcia_resume(struct platform_device *dev) |
3553 | diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c |
3554 | index 401052a..4be4e17 100644 |
3555 | --- a/drivers/pcmcia/sa1111_generic.c |
3556 | +++ b/drivers/pcmcia/sa1111_generic.c |
3557 | @@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev) |
3558 | |
3559 | static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state) |
3560 | { |
3561 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3562 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3563 | } |
3564 | |
3565 | static int pcmcia_resume(struct sa1111_dev *dev) |
3566 | diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c |
3567 | index 8eb0423..582413f 100644 |
3568 | --- a/drivers/pcmcia/tcic.c |
3569 | +++ b/drivers/pcmcia/tcic.c |
3570 | @@ -366,7 +366,7 @@ static int __init get_tcic_id(void) |
3571 | static int tcic_drv_pcmcia_suspend(struct platform_device *dev, |
3572 | pm_message_t state) |
3573 | { |
3574 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3575 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3576 | } |
3577 | |
3578 | static int tcic_drv_pcmcia_resume(struct platform_device *dev) |
3579 | diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c |
3580 | index d4ad50d..c9fcbdc 100644 |
3581 | --- a/drivers/pcmcia/vrc4171_card.c |
3582 | +++ b/drivers/pcmcia/vrc4171_card.c |
3583 | @@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_setup); |
3584 | static int vrc4171_card_suspend(struct platform_device *dev, |
3585 | pm_message_t state) |
3586 | { |
3587 | - return pcmcia_socket_dev_suspend(&dev->dev, state); |
3588 | + return pcmcia_socket_dev_suspend(&dev->dev); |
3589 | } |
3590 | |
3591 | static int vrc4171_card_resume(struct platform_device *dev) |
3592 | diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c |
3593 | index 3ecd7c9..f728a45 100644 |
3594 | --- a/drivers/pcmcia/yenta_socket.c |
3595 | +++ b/drivers/pcmcia/yenta_socket.c |
3596 | @@ -1225,60 +1225,71 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i |
3597 | } |
3598 | |
3599 | #ifdef CONFIG_PM |
3600 | -static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) |
3601 | +static int yenta_dev_suspend_noirq(struct device *dev) |
3602 | { |
3603 | - struct yenta_socket *socket = pci_get_drvdata(dev); |
3604 | + struct pci_dev *pdev = to_pci_dev(dev); |
3605 | + struct yenta_socket *socket = pci_get_drvdata(pdev); |
3606 | int ret; |
3607 | |
3608 | - ret = pcmcia_socket_dev_suspend(&dev->dev, state); |
3609 | + ret = pcmcia_socket_dev_suspend(dev); |
3610 | |
3611 | - if (socket) { |
3612 | - if (socket->type && socket->type->save_state) |
3613 | - socket->type->save_state(socket); |
3614 | + if (!socket) |
3615 | + return ret; |
3616 | |
3617 | - /* FIXME: pci_save_state needs to have a better interface */ |
3618 | - pci_save_state(dev); |
3619 | - pci_read_config_dword(dev, 16*4, &socket->saved_state[0]); |
3620 | - pci_read_config_dword(dev, 17*4, &socket->saved_state[1]); |
3621 | - pci_disable_device(dev); |
3622 | + if (socket->type && socket->type->save_state) |
3623 | + socket->type->save_state(socket); |
3624 | |
3625 | - /* |
3626 | - * Some laptops (IBM T22) do not like us putting the Cardbus |
3627 | - * bridge into D3. At a guess, some other laptop will |
3628 | - * probably require this, so leave it commented out for now. |
3629 | - */ |
3630 | - /* pci_set_power_state(dev, 3); */ |
3631 | - } |
3632 | + pci_save_state(pdev); |
3633 | + pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]); |
3634 | + pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]); |
3635 | + pci_disable_device(pdev); |
3636 | + |
3637 | + /* |
3638 | + * Some laptops (IBM T22) do not like us putting the Cardbus |
3639 | + * bridge into D3. At a guess, some other laptop will |
3640 | + * probably require this, so leave it commented out for now. |
3641 | + */ |
3642 | + /* pci_set_power_state(dev, 3); */ |
3643 | |
3644 | return ret; |
3645 | } |
3646 | |
3647 | - |
3648 | -static int yenta_dev_resume (struct pci_dev *dev) |
3649 | +static int yenta_dev_resume_noirq(struct device *dev) |
3650 | { |
3651 | - struct yenta_socket *socket = pci_get_drvdata(dev); |
3652 | + struct pci_dev *pdev = to_pci_dev(dev); |
3653 | + struct yenta_socket *socket = pci_get_drvdata(pdev); |
3654 | + int ret; |
3655 | |
3656 | - if (socket) { |
3657 | - int rc; |
3658 | + if (!socket) |
3659 | + return 0; |
3660 | |
3661 | - pci_set_power_state(dev, 0); |
3662 | - /* FIXME: pci_restore_state needs to have a better interface */ |
3663 | - pci_restore_state(dev); |
3664 | - pci_write_config_dword(dev, 16*4, socket->saved_state[0]); |
3665 | - pci_write_config_dword(dev, 17*4, socket->saved_state[1]); |
3666 | + pci_write_config_dword(pdev, 16*4, socket->saved_state[0]); |
3667 | + pci_write_config_dword(pdev, 17*4, socket->saved_state[1]); |
3668 | |
3669 | - rc = pci_enable_device(dev); |
3670 | - if (rc) |
3671 | - return rc; |
3672 | + ret = pci_enable_device(pdev); |
3673 | + if (ret) |
3674 | + return ret; |
3675 | |
3676 | - pci_set_master(dev); |
3677 | + pci_set_master(pdev); |
3678 | |
3679 | - if (socket->type && socket->type->restore_state) |
3680 | - socket->type->restore_state(socket); |
3681 | - } |
3682 | + if (socket->type && socket->type->restore_state) |
3683 | + socket->type->restore_state(socket); |
3684 | |
3685 | - return pcmcia_socket_dev_resume(&dev->dev); |
3686 | + return pcmcia_socket_dev_resume(dev); |
3687 | } |
3688 | + |
3689 | +static struct dev_pm_ops yenta_pm_ops = { |
3690 | + .suspend_noirq = yenta_dev_suspend_noirq, |
3691 | + .resume_noirq = yenta_dev_resume_noirq, |
3692 | + .freeze_noirq = yenta_dev_suspend_noirq, |
3693 | + .thaw_noirq = yenta_dev_resume_noirq, |
3694 | + .poweroff_noirq = yenta_dev_suspend_noirq, |
3695 | + .restore_noirq = yenta_dev_resume_noirq, |
3696 | +}; |
3697 | + |
3698 | +#define YENTA_PM_OPS (¥ta_pm_ops) |
3699 | +#else |
3700 | +#define YENTA_PM_OPS NULL |
3701 | #endif |
3702 | |
3703 | #define CB_ID(vend,dev,type) \ |
3704 | @@ -1376,10 +1387,7 @@ static struct pci_driver yenta_cardbus_driver = { |
3705 | .id_table = yenta_table, |
3706 | .probe = yenta_probe, |
3707 | .remove = __devexit_p(yenta_close), |
3708 | -#ifdef CONFIG_PM |
3709 | - .suspend = yenta_dev_suspend, |
3710 | - .resume = yenta_dev_resume, |
3711 | -#endif |
3712 | + .driver.pm = YENTA_PM_OPS, |
3713 | }; |
3714 | |
3715 | |
3716 | diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c |
3717 | index dafaa4a..a234a9d 100644 |
3718 | --- a/drivers/platform/x86/sony-laptop.c |
3719 | +++ b/drivers/platform/x86/sony-laptop.c |
3720 | @@ -1081,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, |
3721 | struct rfkill *rfk; |
3722 | enum rfkill_type type; |
3723 | const char *name; |
3724 | + int result; |
3725 | + bool hwblock; |
3726 | |
3727 | switch (nc_type) { |
3728 | case SONY_WIFI: |
3729 | @@ -1108,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device, |
3730 | if (!rfk) |
3731 | return -ENOMEM; |
3732 | |
3733 | + sony_call_snc_handle(0x124, 0x200, &result); |
3734 | + hwblock = !(result & 0x1); |
3735 | + rfkill_set_hw_state(rfk, hwblock); |
3736 | + |
3737 | err = rfkill_register(rfk); |
3738 | if (err) { |
3739 | rfkill_destroy(rfk); |
3740 | diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c |
3741 | index e856008..d287283 100644 |
3742 | --- a/drivers/platform/x86/thinkpad_acpi.c |
3743 | +++ b/drivers/platform/x86/thinkpad_acpi.c |
3744 | @@ -5655,16 +5655,16 @@ static const struct tpacpi_quirk brightness_quirk_table[] __initconst = { |
3745 | /* Models with ATI GPUs known to require ECNVRAM mode */ |
3746 | TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */ |
3747 | |
3748 | - /* Models with ATI GPUs (waiting confirmation) */ |
3749 | - TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), |
3750 | + /* Models with ATI GPUs that can use ECNVRAM */ |
3751 | + TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC), |
3752 | TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), |
3753 | TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), |
3754 | TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC), |
3755 | |
3756 | - /* Models with Intel Extreme Graphics 2 (waiting confirmation) */ |
3757 | + /* Models with Intel Extreme Graphics 2 */ |
3758 | + TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_NOEC), |
3759 | TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), |
3760 | TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), |
3761 | - TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC), |
3762 | |
3763 | /* Models with Intel GMA900 */ |
3764 | TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */ |
3765 | diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c |
3766 | index b4a7650..4fff4e5 100644 |
3767 | --- a/drivers/serial/bfin_5xx.c |
3768 | +++ b/drivers/serial/bfin_5xx.c |
3769 | @@ -42,6 +42,10 @@ |
3770 | # undef CONFIG_EARLY_PRINTK |
3771 | #endif |
3772 | |
3773 | +#ifdef CONFIG_SERIAL_BFIN_MODULE |
3774 | +# undef CONFIG_EARLY_PRINTK |
3775 | +#endif |
3776 | + |
3777 | /* UART name and device definitions */ |
3778 | #define BFIN_SERIAL_NAME "ttyBF" |
3779 | #define BFIN_SERIAL_MAJOR 204 |
3780 | diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c |
3781 | index 79c9c5f..6ecb51b 100644 |
3782 | --- a/drivers/serial/serial_cs.c |
3783 | +++ b/drivers/serial/serial_cs.c |
3784 | @@ -884,6 +884,7 @@ static struct pcmcia_device_id serial_ids[] = { |
3785 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ |
3786 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ |
3787 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), |
3788 | + PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"), |
3789 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), |
3790 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), |
3791 | PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"), |
3792 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
3793 | index 2bfc41e..e3861b2 100644 |
3794 | --- a/drivers/usb/class/cdc-acm.c |
3795 | +++ b/drivers/usb/class/cdc-acm.c |
3796 | @@ -59,6 +59,7 @@ |
3797 | #include <linux/init.h> |
3798 | #include <linux/slab.h> |
3799 | #include <linux/tty.h> |
3800 | +#include <linux/serial.h> |
3801 | #include <linux/tty_driver.h> |
3802 | #include <linux/tty_flip.h> |
3803 | #include <linux/module.h> |
3804 | @@ -609,6 +610,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) |
3805 | acm->throttle = 0; |
3806 | |
3807 | tasklet_schedule(&acm->urb_task); |
3808 | + set_bit(ASYNCB_INITIALIZED, &acm->port.flags); |
3809 | rv = tty_port_block_til_ready(&acm->port, tty, filp); |
3810 | done: |
3811 | mutex_unlock(&acm->mutex); |
3812 | @@ -858,10 +860,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, |
3813 | if (!ACM_READY(acm)) |
3814 | return; |
3815 | |
3816 | - /* FIXME: Needs to support the tty_baud interface */ |
3817 | - /* FIXME: Broken on sparc */ |
3818 | - newline.dwDTERate = cpu_to_le32p(acm_tty_speed + |
3819 | - (termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0)); |
3820 | + newline.dwDTERate = cpu_to_le32(tty_get_baud_rate(tty)); |
3821 | newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0; |
3822 | newline.bParityType = termios->c_cflag & PARENB ? |
3823 | (termios->c_cflag & PARODD ? 1 : 2) + |
3824 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c |
3825 | index ba589d4..a9c3399 100644 |
3826 | --- a/drivers/usb/class/cdc-wdm.c |
3827 | +++ b/drivers/usb/class/cdc-wdm.c |
3828 | @@ -313,8 +313,13 @@ static ssize_t wdm_write |
3829 | r = usb_autopm_get_interface(desc->intf); |
3830 | if (r < 0) |
3831 | goto outnp; |
3832 | - r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, |
3833 | - &desc->flags)); |
3834 | + |
3835 | + if (!file->f_flags && O_NONBLOCK) |
3836 | + r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, |
3837 | + &desc->flags)); |
3838 | + else |
3839 | + if (test_bit(WDM_IN_USE, &desc->flags)) |
3840 | + r = -EAGAIN; |
3841 | if (r < 0) |
3842 | goto out; |
3843 | |
3844 | @@ -377,7 +382,7 @@ outnl: |
3845 | static ssize_t wdm_read |
3846 | (struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
3847 | { |
3848 | - int rv, cntr; |
3849 | + int rv, cntr = 0; |
3850 | int i = 0; |
3851 | struct wdm_device *desc = file->private_data; |
3852 | |
3853 | @@ -389,10 +394,23 @@ static ssize_t wdm_read |
3854 | if (desc->length == 0) { |
3855 | desc->read = 0; |
3856 | retry: |
3857 | + if (test_bit(WDM_DISCONNECTING, &desc->flags)) { |
3858 | + rv = -ENODEV; |
3859 | + goto err; |
3860 | + } |
3861 | i++; |
3862 | - rv = wait_event_interruptible(desc->wait, |
3863 | - test_bit(WDM_READ, &desc->flags)); |
3864 | + if (file->f_flags & O_NONBLOCK) { |
3865 | + if (!test_bit(WDM_READ, &desc->flags)) { |
3866 | + rv = cntr ? cntr : -EAGAIN; |
3867 | + goto err; |
3868 | + } |
3869 | + rv = 0; |
3870 | + } else { |
3871 | + rv = wait_event_interruptible(desc->wait, |
3872 | + test_bit(WDM_READ, &desc->flags)); |
3873 | + } |
3874 | |
3875 | + /* may have happened while we slept */ |
3876 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) { |
3877 | rv = -ENODEV; |
3878 | goto err; |
3879 | @@ -448,7 +466,7 @@ retry: |
3880 | |
3881 | err: |
3882 | mutex_unlock(&desc->rlock); |
3883 | - if (rv < 0) |
3884 | + if (rv < 0 && rv != -EAGAIN) |
3885 | dev_err(&desc->intf->dev, "wdm_read: exit error\n"); |
3886 | return rv; |
3887 | } |
3888 | diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c |
3889 | index b09a527..21b3719 100644 |
3890 | --- a/drivers/usb/class/usbtmc.c |
3891 | +++ b/drivers/usb/class/usbtmc.c |
3892 | @@ -367,13 +367,13 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, |
3893 | { |
3894 | struct usbtmc_device_data *data; |
3895 | struct device *dev; |
3896 | - unsigned long int n_characters; |
3897 | + u32 n_characters; |
3898 | u8 *buffer; |
3899 | int actual; |
3900 | - int done; |
3901 | - int remaining; |
3902 | + size_t done; |
3903 | + size_t remaining; |
3904 | int retval; |
3905 | - int this_part; |
3906 | + size_t this_part; |
3907 | |
3908 | /* Get pointer to private data structure */ |
3909 | data = filp->private_data; |
3910 | @@ -455,6 +455,18 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, |
3911 | (buffer[6] << 16) + |
3912 | (buffer[7] << 24); |
3913 | |
3914 | + /* Ensure the instrument doesn't lie about it */ |
3915 | + if(n_characters > actual - 12) { |
3916 | + dev_err(dev, "Device lies about message size: %zu > %zu\n", n_characters, actual - 12); |
3917 | + n_characters = actual - 12; |
3918 | + } |
3919 | + |
3920 | + /* Ensure the instrument doesn't send more back than requested */ |
3921 | + if(n_characters > this_part) { |
3922 | + dev_err(dev, "Device returns more than requested: %zu > %zu\n", done + n_characters, done + this_part); |
3923 | + n_characters = this_part; |
3924 | + } |
3925 | + |
3926 | /* Copy buffer to user space */ |
3927 | if (copy_to_user(buf + done, &buffer[12], n_characters)) { |
3928 | /* There must have been an addressing problem */ |
3929 | @@ -465,6 +477,8 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, |
3930 | done += n_characters; |
3931 | if (n_characters < USBTMC_SIZE_IOBUFFER) |
3932 | remaining = 0; |
3933 | + else |
3934 | + remaining -= n_characters; |
3935 | } |
3936 | |
3937 | /* Update file position value */ |
3938 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
3939 | index a16c538..0d3af6a 100644 |
3940 | --- a/drivers/usb/core/config.c |
3941 | +++ b/drivers/usb/core/config.c |
3942 | @@ -105,7 +105,7 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, |
3943 | ep->ss_ep_comp->extralen = i; |
3944 | buffer += i; |
3945 | size -= i; |
3946 | - retval = buffer - buffer_start + i; |
3947 | + retval = buffer - buffer_start; |
3948 | if (num_skipped > 0) |
3949 | dev_dbg(ddev, "skipped %d descriptor%s after %s\n", |
3950 | num_skipped, plural(num_skipped), |
3951 | diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c |
3952 | index a949259..5b22a4d 100644 |
3953 | --- a/drivers/usb/host/sl811-hcd.c |
3954 | +++ b/drivers/usb/host/sl811-hcd.c |
3955 | @@ -719,8 +719,12 @@ retry: |
3956 | /* port status seems weird until after reset, so |
3957 | * force the reset and make khubd clean up later. |
3958 | */ |
3959 | - sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION) |
3960 | - | (1 << USB_PORT_FEAT_CONNECTION); |
3961 | + if (sl811->stat_insrmv & 1) |
3962 | + sl811->port1 |= 1 << USB_PORT_FEAT_CONNECTION; |
3963 | + else |
3964 | + sl811->port1 &= ~(1 << USB_PORT_FEAT_CONNECTION); |
3965 | + |
3966 | + sl811->port1 |= 1 << USB_PORT_FEAT_C_CONNECTION; |
3967 | |
3968 | } else if (irqstat & SL11H_INTMASK_RD) { |
3969 | if (sl811->port1 & (1 << USB_PORT_FEAT_SUSPEND)) { |
3970 | diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c |
3971 | index 705e343..33128d5 100644 |
3972 | --- a/drivers/usb/host/xhci-dbg.c |
3973 | +++ b/drivers/usb/host/xhci-dbg.c |
3974 | @@ -413,7 +413,8 @@ void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx) |
3975 | int i; |
3976 | |
3977 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); |
3978 | - dma_addr_t dma = ctx->dma + ((unsigned long)slot_ctx - (unsigned long)ctx); |
3979 | + dma_addr_t dma = ctx->dma + |
3980 | + ((unsigned long)slot_ctx - (unsigned long)ctx->bytes); |
3981 | int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params); |
3982 | |
3983 | xhci_dbg(xhci, "Slot Context:\n"); |
3984 | @@ -459,7 +460,7 @@ void xhci_dbg_ep_ctx(struct xhci_hcd *xhci, |
3985 | for (i = 0; i < last_ep_ctx; ++i) { |
3986 | struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci, ctx, i); |
3987 | dma_addr_t dma = ctx->dma + |
3988 | - ((unsigned long)ep_ctx - (unsigned long)ctx); |
3989 | + ((unsigned long)ep_ctx - (unsigned long)ctx->bytes); |
3990 | |
3991 | xhci_dbg(xhci, "Endpoint %02d Context:\n", i); |
3992 | xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info\n", |
3993 | diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c |
3994 | index 816c39c..e478a63 100644 |
3995 | --- a/drivers/usb/host/xhci-hcd.c |
3996 | +++ b/drivers/usb/host/xhci-hcd.c |
3997 | @@ -22,12 +22,18 @@ |
3998 | |
3999 | #include <linux/irq.h> |
4000 | #include <linux/module.h> |
4001 | +#include <linux/moduleparam.h> |
4002 | |
4003 | #include "xhci.h" |
4004 | |
4005 | #define DRIVER_AUTHOR "Sarah Sharp" |
4006 | #define DRIVER_DESC "'eXtensible' Host Controller (xHC) Driver" |
4007 | |
4008 | +/* Some 0.95 hardware can't handle the chain bit on a Link TRB being cleared */ |
4009 | +static int link_quirk; |
4010 | +module_param(link_quirk, int, S_IRUGO | S_IWUSR); |
4011 | +MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); |
4012 | + |
4013 | /* TODO: copied from ehci-hcd.c - can this be refactored? */ |
4014 | /* |
4015 | * handshake - spin reading hc until handshake completes or fails |
4016 | @@ -214,6 +220,12 @@ int xhci_init(struct usb_hcd *hcd) |
4017 | |
4018 | xhci_dbg(xhci, "xhci_init\n"); |
4019 | spin_lock_init(&xhci->lock); |
4020 | + if (link_quirk) { |
4021 | + xhci_dbg(xhci, "QUIRK: Not clearing Link TRB chain bits.\n"); |
4022 | + xhci->quirks |= XHCI_LINK_TRB_QUIRK; |
4023 | + } else { |
4024 | + xhci_dbg(xhci, "xHCI doesn't need link TRB QUIRK\n"); |
4025 | + } |
4026 | retval = xhci_mem_init(xhci, GFP_KERNEL); |
4027 | xhci_dbg(xhci, "Finished xhci_init\n"); |
4028 | |
4029 | @@ -555,13 +567,22 @@ unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc) |
4030 | return 1 << (xhci_get_endpoint_index(desc) + 1); |
4031 | } |
4032 | |
4033 | +/* Find the flag for this endpoint (for use in the control context). Use the |
4034 | + * endpoint index to create a bitmask. The slot context is bit 0, endpoint 0 is |
4035 | + * bit 1, etc. |
4036 | + */ |
4037 | +unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index) |
4038 | +{ |
4039 | + return 1 << (ep_index + 1); |
4040 | +} |
4041 | + |
4042 | /* Compute the last valid endpoint context index. Basically, this is the |
4043 | * endpoint index plus one. For slot contexts with more than valid endpoint, |
4044 | * we find the most significant bit set in the added contexts flags. |
4045 | * e.g. ep 1 IN (with epnum 0x81) => added_ctxs = 0b1000 |
4046 | * fls(0b1000) = 4, but the endpoint context index is 3, so subtract one. |
4047 | */ |
4048 | -static inline unsigned int xhci_last_valid_endpoint(u32 added_ctxs) |
4049 | +unsigned int xhci_last_valid_endpoint(u32 added_ctxs) |
4050 | { |
4051 | return fls(added_ctxs) - 1; |
4052 | } |
4053 | @@ -589,6 +610,70 @@ int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, |
4054 | return 1; |
4055 | } |
4056 | |
4057 | +static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
4058 | + struct usb_device *udev, struct xhci_virt_device *virt_dev, |
4059 | + bool ctx_change); |
4060 | + |
4061 | +/* |
4062 | + * Full speed devices may have a max packet size greater than 8 bytes, but the |
4063 | + * USB core doesn't know that until it reads the first 8 bytes of the |
4064 | + * descriptor. If the usb_device's max packet size changes after that point, |
4065 | + * we need to issue an evaluate context command and wait on it. |
4066 | + */ |
4067 | +static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, |
4068 | + unsigned int ep_index, struct urb *urb) |
4069 | +{ |
4070 | + struct xhci_container_ctx *in_ctx; |
4071 | + struct xhci_container_ctx *out_ctx; |
4072 | + struct xhci_input_control_ctx *ctrl_ctx; |
4073 | + struct xhci_ep_ctx *ep_ctx; |
4074 | + int max_packet_size; |
4075 | + int hw_max_packet_size; |
4076 | + int ret = 0; |
4077 | + |
4078 | + out_ctx = xhci->devs[slot_id]->out_ctx; |
4079 | + ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
4080 | + hw_max_packet_size = MAX_PACKET_DECODED(ep_ctx->ep_info2); |
4081 | + max_packet_size = urb->dev->ep0.desc.wMaxPacketSize; |
4082 | + if (hw_max_packet_size != max_packet_size) { |
4083 | + xhci_dbg(xhci, "Max Packet Size for ep 0 changed.\n"); |
4084 | + xhci_dbg(xhci, "Max packet size in usb_device = %d\n", |
4085 | + max_packet_size); |
4086 | + xhci_dbg(xhci, "Max packet size in xHCI HW = %d\n", |
4087 | + hw_max_packet_size); |
4088 | + xhci_dbg(xhci, "Issuing evaluate context command.\n"); |
4089 | + |
4090 | + /* Set up the modified control endpoint 0 */ |
4091 | + xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index); |
4092 | + in_ctx = xhci->devs[slot_id]->in_ctx; |
4093 | + ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); |
4094 | + ep_ctx->ep_info2 &= ~MAX_PACKET_MASK; |
4095 | + ep_ctx->ep_info2 |= MAX_PACKET(max_packet_size); |
4096 | + |
4097 | + /* Set up the input context flags for the command */ |
4098 | + /* FIXME: This won't work if a non-default control endpoint |
4099 | + * changes max packet sizes. |
4100 | + */ |
4101 | + ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
4102 | + ctrl_ctx->add_flags = EP0_FLAG; |
4103 | + ctrl_ctx->drop_flags = 0; |
4104 | + |
4105 | + xhci_dbg(xhci, "Slot %d input context\n", slot_id); |
4106 | + xhci_dbg_ctx(xhci, in_ctx, ep_index); |
4107 | + xhci_dbg(xhci, "Slot %d output context\n", slot_id); |
4108 | + xhci_dbg_ctx(xhci, out_ctx, ep_index); |
4109 | + |
4110 | + ret = xhci_configure_endpoint(xhci, urb->dev, |
4111 | + xhci->devs[slot_id], true); |
4112 | + |
4113 | + /* Clean up the input context for later use by bandwidth |
4114 | + * functions. |
4115 | + */ |
4116 | + ctrl_ctx->add_flags = SLOT_FLAG; |
4117 | + } |
4118 | + return ret; |
4119 | +} |
4120 | + |
4121 | /* |
4122 | * non-error returns are a promise to giveback() the urb later |
4123 | * we drop ownership so next owner (or urb unlink) can get it |
4124 | @@ -600,13 +685,13 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) |
4125 | int ret = 0; |
4126 | unsigned int slot_id, ep_index; |
4127 | |
4128 | + |
4129 | if (!urb || xhci_check_args(hcd, urb->dev, urb->ep, true, __func__) <= 0) |
4130 | return -EINVAL; |
4131 | |
4132 | slot_id = urb->dev->slot_id; |
4133 | ep_index = xhci_get_endpoint_index(&urb->ep->desc); |
4134 | |
4135 | - spin_lock_irqsave(&xhci->lock, flags); |
4136 | if (!xhci->devs || !xhci->devs[slot_id]) { |
4137 | if (!in_interrupt()) |
4138 | dev_warn(&urb->dev->dev, "WARN: urb submitted for dev with no Slot ID\n"); |
4139 | @@ -619,19 +704,38 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) |
4140 | ret = -ESHUTDOWN; |
4141 | goto exit; |
4142 | } |
4143 | - if (usb_endpoint_xfer_control(&urb->ep->desc)) |
4144 | + if (usb_endpoint_xfer_control(&urb->ep->desc)) { |
4145 | + /* Check to see if the max packet size for the default control |
4146 | + * endpoint changed during FS device enumeration |
4147 | + */ |
4148 | + if (urb->dev->speed == USB_SPEED_FULL) { |
4149 | + ret = xhci_check_maxpacket(xhci, slot_id, |
4150 | + ep_index, urb); |
4151 | + if (ret < 0) |
4152 | + return ret; |
4153 | + } |
4154 | + |
4155 | /* We have a spinlock and interrupts disabled, so we must pass |
4156 | * atomic context to this function, which may allocate memory. |
4157 | */ |
4158 | + spin_lock_irqsave(&xhci->lock, flags); |
4159 | ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb, |
4160 | slot_id, ep_index); |
4161 | - else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) |
4162 | + spin_unlock_irqrestore(&xhci->lock, flags); |
4163 | + } else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) { |
4164 | + spin_lock_irqsave(&xhci->lock, flags); |
4165 | ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, |
4166 | slot_id, ep_index); |
4167 | - else |
4168 | + spin_unlock_irqrestore(&xhci->lock, flags); |
4169 | + } else if (usb_endpoint_xfer_int(&urb->ep->desc)) { |
4170 | + spin_lock_irqsave(&xhci->lock, flags); |
4171 | + ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb, |
4172 | + slot_id, ep_index); |
4173 | + spin_unlock_irqrestore(&xhci->lock, flags); |
4174 | + } else { |
4175 | ret = -EINVAL; |
4176 | + } |
4177 | exit: |
4178 | - spin_unlock_irqrestore(&xhci->lock, flags); |
4179 | return ret; |
4180 | } |
4181 | |
4182 | @@ -930,6 +1034,122 @@ static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *vir |
4183 | } |
4184 | } |
4185 | |
4186 | +static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, |
4187 | + struct usb_device *udev, struct xhci_virt_device *virt_dev) |
4188 | +{ |
4189 | + int ret; |
4190 | + |
4191 | + switch (virt_dev->cmd_status) { |
4192 | + case COMP_ENOMEM: |
4193 | + dev_warn(&udev->dev, "Not enough host controller resources " |
4194 | + "for new device state.\n"); |
4195 | + ret = -ENOMEM; |
4196 | + /* FIXME: can we allocate more resources for the HC? */ |
4197 | + break; |
4198 | + case COMP_BW_ERR: |
4199 | + dev_warn(&udev->dev, "Not enough bandwidth " |
4200 | + "for new device state.\n"); |
4201 | + ret = -ENOSPC; |
4202 | + /* FIXME: can we go back to the old state? */ |
4203 | + break; |
4204 | + case COMP_TRB_ERR: |
4205 | + /* the HCD set up something wrong */ |
4206 | + dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, " |
4207 | + "add flag = 1, " |
4208 | + "and endpoint is not disabled.\n"); |
4209 | + ret = -EINVAL; |
4210 | + break; |
4211 | + case COMP_SUCCESS: |
4212 | + dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); |
4213 | + ret = 0; |
4214 | + break; |
4215 | + default: |
4216 | + xhci_err(xhci, "ERROR: unexpected command completion " |
4217 | + "code 0x%x.\n", virt_dev->cmd_status); |
4218 | + ret = -EINVAL; |
4219 | + break; |
4220 | + } |
4221 | + return ret; |
4222 | +} |
4223 | + |
4224 | +static int xhci_evaluate_context_result(struct xhci_hcd *xhci, |
4225 | + struct usb_device *udev, struct xhci_virt_device *virt_dev) |
4226 | +{ |
4227 | + int ret; |
4228 | + |
4229 | + switch (virt_dev->cmd_status) { |
4230 | + case COMP_EINVAL: |
4231 | + dev_warn(&udev->dev, "WARN: xHCI driver setup invalid evaluate " |
4232 | + "context command.\n"); |
4233 | + ret = -EINVAL; |
4234 | + break; |
4235 | + case COMP_EBADSLT: |
4236 | + dev_warn(&udev->dev, "WARN: slot not enabled for" |
4237 | + "evaluate context command.\n"); |
4238 | + case COMP_CTX_STATE: |
4239 | + dev_warn(&udev->dev, "WARN: invalid context state for " |
4240 | + "evaluate context command.\n"); |
4241 | + xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); |
4242 | + ret = -EINVAL; |
4243 | + break; |
4244 | + case COMP_SUCCESS: |
4245 | + dev_dbg(&udev->dev, "Successful evaluate context command\n"); |
4246 | + ret = 0; |
4247 | + break; |
4248 | + default: |
4249 | + xhci_err(xhci, "ERROR: unexpected command completion " |
4250 | + "code 0x%x.\n", virt_dev->cmd_status); |
4251 | + ret = -EINVAL; |
4252 | + break; |
4253 | + } |
4254 | + return ret; |
4255 | +} |
4256 | + |
4257 | +/* Issue a configure endpoint command or evaluate context command |
4258 | + * and wait for it to finish. |
4259 | + */ |
4260 | +static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
4261 | + struct usb_device *udev, struct xhci_virt_device *virt_dev, |
4262 | + bool ctx_change) |
4263 | +{ |
4264 | + int ret; |
4265 | + int timeleft; |
4266 | + unsigned long flags; |
4267 | + |
4268 | + spin_lock_irqsave(&xhci->lock, flags); |
4269 | + if (!ctx_change) |
4270 | + ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma, |
4271 | + udev->slot_id); |
4272 | + else |
4273 | + ret = xhci_queue_evaluate_context(xhci, virt_dev->in_ctx->dma, |
4274 | + udev->slot_id); |
4275 | + if (ret < 0) { |
4276 | + spin_unlock_irqrestore(&xhci->lock, flags); |
4277 | + xhci_dbg(xhci, "FIXME allocate a new ring segment\n"); |
4278 | + return -ENOMEM; |
4279 | + } |
4280 | + xhci_ring_cmd_db(xhci); |
4281 | + spin_unlock_irqrestore(&xhci->lock, flags); |
4282 | + |
4283 | + /* Wait for the configure endpoint command to complete */ |
4284 | + timeleft = wait_for_completion_interruptible_timeout( |
4285 | + &virt_dev->cmd_completion, |
4286 | + USB_CTRL_SET_TIMEOUT); |
4287 | + if (timeleft <= 0) { |
4288 | + xhci_warn(xhci, "%s while waiting for %s command\n", |
4289 | + timeleft == 0 ? "Timeout" : "Signal", |
4290 | + ctx_change == 0 ? |
4291 | + "configure endpoint" : |
4292 | + "evaluate context"); |
4293 | + /* FIXME cancel the configure endpoint command */ |
4294 | + return -ETIME; |
4295 | + } |
4296 | + |
4297 | + if (!ctx_change) |
4298 | + return xhci_configure_endpoint_result(xhci, udev, virt_dev); |
4299 | + return xhci_evaluate_context_result(xhci, udev, virt_dev); |
4300 | +} |
4301 | + |
4302 | /* Called after one or more calls to xhci_add_endpoint() or |
4303 | * xhci_drop_endpoint(). If this call fails, the USB core is expected |
4304 | * to call xhci_reset_bandwidth(). |
4305 | @@ -944,8 +1164,6 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) |
4306 | { |
4307 | int i; |
4308 | int ret = 0; |
4309 | - int timeleft; |
4310 | - unsigned long flags; |
4311 | struct xhci_hcd *xhci; |
4312 | struct xhci_virt_device *virt_dev; |
4313 | struct xhci_input_control_ctx *ctrl_ctx; |
4314 | @@ -975,56 +1193,7 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) |
4315 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, |
4316 | LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); |
4317 | |
4318 | - spin_lock_irqsave(&xhci->lock, flags); |
4319 | - ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma, |
4320 | - udev->slot_id); |
4321 | - if (ret < 0) { |
4322 | - spin_unlock_irqrestore(&xhci->lock, flags); |
4323 | - xhci_dbg(xhci, "FIXME allocate a new ring segment\n"); |
4324 | - return -ENOMEM; |
4325 | - } |
4326 | - xhci_ring_cmd_db(xhci); |
4327 | - spin_unlock_irqrestore(&xhci->lock, flags); |
4328 | - |
4329 | - /* Wait for the configure endpoint command to complete */ |
4330 | - timeleft = wait_for_completion_interruptible_timeout( |
4331 | - &virt_dev->cmd_completion, |
4332 | - USB_CTRL_SET_TIMEOUT); |
4333 | - if (timeleft <= 0) { |
4334 | - xhci_warn(xhci, "%s while waiting for configure endpoint command\n", |
4335 | - timeleft == 0 ? "Timeout" : "Signal"); |
4336 | - /* FIXME cancel the configure endpoint command */ |
4337 | - return -ETIME; |
4338 | - } |
4339 | - |
4340 | - switch (virt_dev->cmd_status) { |
4341 | - case COMP_ENOMEM: |
4342 | - dev_warn(&udev->dev, "Not enough host controller resources " |
4343 | - "for new device state.\n"); |
4344 | - ret = -ENOMEM; |
4345 | - /* FIXME: can we allocate more resources for the HC? */ |
4346 | - break; |
4347 | - case COMP_BW_ERR: |
4348 | - dev_warn(&udev->dev, "Not enough bandwidth " |
4349 | - "for new device state.\n"); |
4350 | - ret = -ENOSPC; |
4351 | - /* FIXME: can we go back to the old state? */ |
4352 | - break; |
4353 | - case COMP_TRB_ERR: |
4354 | - /* the HCD set up something wrong */ |
4355 | - dev_warn(&udev->dev, "ERROR: Endpoint drop flag = 0, add flag = 1, " |
4356 | - "and endpoint is not disabled.\n"); |
4357 | - ret = -EINVAL; |
4358 | - break; |
4359 | - case COMP_SUCCESS: |
4360 | - dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); |
4361 | - break; |
4362 | - default: |
4363 | - xhci_err(xhci, "ERROR: unexpected command completion " |
4364 | - "code 0x%x.\n", virt_dev->cmd_status); |
4365 | - ret = -EINVAL; |
4366 | - break; |
4367 | - } |
4368 | + ret = xhci_configure_endpoint(xhci, udev, virt_dev, false); |
4369 | if (ret) { |
4370 | /* Callee should call reset_bandwidth() */ |
4371 | return ret; |
4372 | @@ -1075,6 +1244,75 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) |
4373 | xhci_zero_in_ctx(xhci, virt_dev); |
4374 | } |
4375 | |
4376 | +void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, |
4377 | + unsigned int slot_id, unsigned int ep_index, |
4378 | + struct xhci_dequeue_state *deq_state) |
4379 | +{ |
4380 | + struct xhci_container_ctx *in_ctx; |
4381 | + struct xhci_input_control_ctx *ctrl_ctx; |
4382 | + struct xhci_ep_ctx *ep_ctx; |
4383 | + u32 added_ctxs; |
4384 | + dma_addr_t addr; |
4385 | + |
4386 | + xhci_endpoint_copy(xhci, xhci->devs[slot_id], ep_index); |
4387 | + in_ctx = xhci->devs[slot_id]->in_ctx; |
4388 | + ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); |
4389 | + addr = xhci_trb_virt_to_dma(deq_state->new_deq_seg, |
4390 | + deq_state->new_deq_ptr); |
4391 | + if (addr == 0) { |
4392 | + xhci_warn(xhci, "WARN Cannot submit config ep after " |
4393 | + "reset ep command\n"); |
4394 | + xhci_warn(xhci, "WARN deq seg = %p, deq ptr = %p\n", |
4395 | + deq_state->new_deq_seg, |
4396 | + deq_state->new_deq_ptr); |
4397 | + return; |
4398 | + } |
4399 | + ep_ctx->deq = addr | deq_state->new_cycle_state; |
4400 | + |
4401 | + xhci_slot_copy(xhci, xhci->devs[slot_id]); |
4402 | + |
4403 | + ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
4404 | + added_ctxs = xhci_get_endpoint_flag_from_index(ep_index); |
4405 | + ctrl_ctx->add_flags = added_ctxs | SLOT_FLAG; |
4406 | + ctrl_ctx->drop_flags = added_ctxs; |
4407 | + |
4408 | + xhci_dbg(xhci, "Slot ID %d Input Context:\n", slot_id); |
4409 | + xhci_dbg_ctx(xhci, in_ctx, ep_index); |
4410 | +} |
4411 | + |
4412 | +void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, |
4413 | + struct usb_device *udev, |
4414 | + unsigned int ep_index, struct xhci_ring *ep_ring) |
4415 | +{ |
4416 | + struct xhci_dequeue_state deq_state; |
4417 | + |
4418 | + xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); |
4419 | + /* We need to move the HW's dequeue pointer past this TD, |
4420 | + * or it will attempt to resend it on the next doorbell ring. |
4421 | + */ |
4422 | + xhci_find_new_dequeue_state(xhci, udev->slot_id, |
4423 | + ep_index, ep_ring->stopped_td, |
4424 | + &deq_state); |
4425 | + |
4426 | + /* HW with the reset endpoint quirk will use the saved dequeue state to |
4427 | + * issue a configure endpoint command later. |
4428 | + */ |
4429 | + if (!(xhci->quirks & XHCI_RESET_EP_QUIRK)) { |
4430 | + xhci_dbg(xhci, "Queueing new dequeue state\n"); |
4431 | + xhci_queue_new_dequeue_state(xhci, ep_ring, |
4432 | + udev->slot_id, |
4433 | + ep_index, &deq_state); |
4434 | + } else { |
4435 | + /* Better hope no one uses the input context between now and the |
4436 | + * reset endpoint completion! |
4437 | + */ |
4438 | + xhci_dbg(xhci, "Setting up input context for " |
4439 | + "configure endpoint command\n"); |
4440 | + xhci_setup_input_ctx_for_quirk(xhci, udev->slot_id, |
4441 | + ep_index, &deq_state); |
4442 | + } |
4443 | +} |
4444 | + |
4445 | /* Deal with stalled endpoints. The core should have sent the control message |
4446 | * to clear the halt condition. However, we need to make the xHCI hardware |
4447 | * reset its sequence number, since a device will expect a sequence number of |
4448 | @@ -1089,7 +1327,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, |
4449 | unsigned int ep_index; |
4450 | unsigned long flags; |
4451 | int ret; |
4452 | - struct xhci_dequeue_state deq_state; |
4453 | struct xhci_ring *ep_ring; |
4454 | |
4455 | xhci = hcd_to_xhci(hcd); |
4456 | @@ -1106,6 +1343,10 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, |
4457 | ep->desc.bEndpointAddress); |
4458 | return; |
4459 | } |
4460 | + if (usb_endpoint_xfer_control(&ep->desc)) { |
4461 | + xhci_dbg(xhci, "Control endpoint stall already handled.\n"); |
4462 | + return; |
4463 | + } |
4464 | |
4465 | xhci_dbg(xhci, "Queueing reset endpoint command\n"); |
4466 | spin_lock_irqsave(&xhci->lock, flags); |
4467 | @@ -1116,16 +1357,7 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, |
4468 | * command. Better hope that last command worked! |
4469 | */ |
4470 | if (!ret) { |
4471 | - xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); |
4472 | - /* We need to move the HW's dequeue pointer past this TD, |
4473 | - * or it will attempt to resend it on the next doorbell ring. |
4474 | - */ |
4475 | - xhci_find_new_dequeue_state(xhci, udev->slot_id, |
4476 | - ep_index, ep_ring->stopped_td, &deq_state); |
4477 | - xhci_dbg(xhci, "Queueing new dequeue state\n"); |
4478 | - xhci_queue_new_dequeue_state(xhci, ep_ring, |
4479 | - udev->slot_id, |
4480 | - ep_index, &deq_state); |
4481 | + xhci_cleanup_stalled_ring(xhci, udev, ep_index, ep_ring); |
4482 | kfree(ep_ring->stopped_td); |
4483 | xhci_ring_cmd_db(xhci); |
4484 | } |
4485 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
4486 | index e6b9a1c..55920b3 100644 |
4487 | --- a/drivers/usb/host/xhci-mem.c |
4488 | +++ b/drivers/usb/host/xhci-mem.c |
4489 | @@ -94,6 +94,9 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, |
4490 | val = prev->trbs[TRBS_PER_SEGMENT-1].link.control; |
4491 | val &= ~TRB_TYPE_BITMASK; |
4492 | val |= TRB_TYPE(TRB_LINK); |
4493 | + /* Always set the chain bit with 0.95 hardware */ |
4494 | + if (xhci_link_trb_quirk(xhci)) |
4495 | + val |= TRB_CHAIN; |
4496 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = val; |
4497 | } |
4498 | xhci_dbg(xhci, "Linking segment 0x%llx to segment 0x%llx (DMA)\n", |
4499 | @@ -398,15 +401,28 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud |
4500 | /* Step 5 */ |
4501 | ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP); |
4502 | /* |
4503 | - * See section 4.3 bullet 6: |
4504 | - * The default Max Packet size for ep0 is "8 bytes for a USB2 |
4505 | - * LS/FS/HS device or 512 bytes for a USB3 SS device" |
4506 | * XXX: Not sure about wireless USB devices. |
4507 | */ |
4508 | - if (udev->speed == USB_SPEED_SUPER) |
4509 | + switch (udev->speed) { |
4510 | + case USB_SPEED_SUPER: |
4511 | ep0_ctx->ep_info2 |= MAX_PACKET(512); |
4512 | - else |
4513 | + break; |
4514 | + case USB_SPEED_HIGH: |
4515 | + /* USB core guesses at a 64-byte max packet first for FS devices */ |
4516 | + case USB_SPEED_FULL: |
4517 | + ep0_ctx->ep_info2 |= MAX_PACKET(64); |
4518 | + break; |
4519 | + case USB_SPEED_LOW: |
4520 | ep0_ctx->ep_info2 |= MAX_PACKET(8); |
4521 | + break; |
4522 | + case USB_SPEED_VARIABLE: |
4523 | + xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); |
4524 | + return -EINVAL; |
4525 | + break; |
4526 | + default: |
4527 | + /* New speed? */ |
4528 | + BUG(); |
4529 | + } |
4530 | /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */ |
4531 | ep0_ctx->ep_info2 |= MAX_BURST(0); |
4532 | ep0_ctx->ep_info2 |= ERROR_COUNT(3); |
4533 | @@ -598,6 +614,44 @@ void xhci_endpoint_zero(struct xhci_hcd *xhci, |
4534 | */ |
4535 | } |
4536 | |
4537 | +/* Copy output xhci_ep_ctx to the input xhci_ep_ctx copy. |
4538 | + * Useful when you want to change one particular aspect of the endpoint and then |
4539 | + * issue a configure endpoint command. |
4540 | + */ |
4541 | +void xhci_endpoint_copy(struct xhci_hcd *xhci, |
4542 | + struct xhci_virt_device *vdev, unsigned int ep_index) |
4543 | +{ |
4544 | + struct xhci_ep_ctx *out_ep_ctx; |
4545 | + struct xhci_ep_ctx *in_ep_ctx; |
4546 | + |
4547 | + out_ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index); |
4548 | + in_ep_ctx = xhci_get_ep_ctx(xhci, vdev->in_ctx, ep_index); |
4549 | + |
4550 | + in_ep_ctx->ep_info = out_ep_ctx->ep_info; |
4551 | + in_ep_ctx->ep_info2 = out_ep_ctx->ep_info2; |
4552 | + in_ep_ctx->deq = out_ep_ctx->deq; |
4553 | + in_ep_ctx->tx_info = out_ep_ctx->tx_info; |
4554 | +} |
4555 | + |
4556 | +/* Copy output xhci_slot_ctx to the input xhci_slot_ctx. |
4557 | + * Useful when you want to change one particular aspect of the endpoint and then |
4558 | + * issue a configure endpoint command. Only the context entries field matters, |
4559 | + * but we'll copy the whole thing anyway. |
4560 | + */ |
4561 | +void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev) |
4562 | +{ |
4563 | + struct xhci_slot_ctx *in_slot_ctx; |
4564 | + struct xhci_slot_ctx *out_slot_ctx; |
4565 | + |
4566 | + in_slot_ctx = xhci_get_slot_ctx(xhci, vdev->in_ctx); |
4567 | + out_slot_ctx = xhci_get_slot_ctx(xhci, vdev->out_ctx); |
4568 | + |
4569 | + in_slot_ctx->dev_info = out_slot_ctx->dev_info; |
4570 | + in_slot_ctx->dev_info2 = out_slot_ctx->dev_info2; |
4571 | + in_slot_ctx->tt_info = out_slot_ctx->tt_info; |
4572 | + in_slot_ctx->dev_state = out_slot_ctx->dev_state; |
4573 | +} |
4574 | + |
4575 | /* Set up the scratchpad buffer array and scratchpad buffers, if needed. */ |
4576 | static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags) |
4577 | { |
4578 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
4579 | index 592fe7e..8fb308d 100644 |
4580 | --- a/drivers/usb/host/xhci-pci.c |
4581 | +++ b/drivers/usb/host/xhci-pci.c |
4582 | @@ -24,6 +24,10 @@ |
4583 | |
4584 | #include "xhci.h" |
4585 | |
4586 | +/* Device for a quirk */ |
4587 | +#define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
4588 | +#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
4589 | + |
4590 | static const char hcd_name[] = "xhci_hcd"; |
4591 | |
4592 | /* called after powerup, by probe or system-pm "wakeup" */ |
4593 | @@ -62,6 +66,15 @@ static int xhci_pci_setup(struct usb_hcd *hcd) |
4594 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); |
4595 | xhci_print_registers(xhci); |
4596 | |
4597 | + /* Look for vendor-specific quirks */ |
4598 | + if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
4599 | + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && |
4600 | + pdev->revision == 0x0) { |
4601 | + xhci->quirks |= XHCI_RESET_EP_QUIRK; |
4602 | + xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
4603 | + " endpoint cmd after reset endpoint\n"); |
4604 | + } |
4605 | + |
4606 | /* Make sure the HC is halted. */ |
4607 | retval = xhci_halt(xhci); |
4608 | if (retval) |
4609 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
4610 | index aa88a06..ff5e6bc 100644 |
4611 | --- a/drivers/usb/host/xhci-ring.c |
4612 | +++ b/drivers/usb/host/xhci-ring.c |
4613 | @@ -172,8 +172,9 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer |
4614 | * have their chain bit cleared (so that each Link TRB is a separate TD). |
4615 | * |
4616 | * Section 6.4.4.1 of the 0.95 spec says link TRBs cannot have the chain bit |
4617 | - * set, but other sections talk about dealing with the chain bit set. |
4618 | - * Assume section 6.4.4.1 is wrong, and the chain bit can be set in a Link TRB. |
4619 | + * set, but other sections talk about dealing with the chain bit set. This was |
4620 | + * fixed in the 0.96 specification errata, but we have to assume that all 0.95 |
4621 | + * xHCI hardware can't handle the chain bit being cleared on a link TRB. |
4622 | */ |
4623 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) |
4624 | { |
4625 | @@ -191,8 +192,14 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer |
4626 | while (last_trb(xhci, ring, ring->enq_seg, next)) { |
4627 | if (!consumer) { |
4628 | if (ring != xhci->event_ring) { |
4629 | - next->link.control &= ~TRB_CHAIN; |
4630 | - next->link.control |= chain; |
4631 | + /* If we're not dealing with 0.95 hardware, |
4632 | + * carry over the chain bit of the previous TRB |
4633 | + * (which may mean the chain bit is cleared). |
4634 | + */ |
4635 | + if (!xhci_link_trb_quirk(xhci)) { |
4636 | + next->link.control &= ~TRB_CHAIN; |
4637 | + next->link.control |= chain; |
4638 | + } |
4639 | /* Give this link TRB to the hardware */ |
4640 | wmb(); |
4641 | if (next->link.control & TRB_CYCLE) |
4642 | @@ -462,7 +469,6 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, |
4643 | * ring running. |
4644 | */ |
4645 | ep_ring->state |= SET_DEQ_PENDING; |
4646 | - xhci_ring_cmd_db(xhci); |
4647 | } |
4648 | |
4649 | /* |
4650 | @@ -531,6 +537,7 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, |
4651 | if (deq_state.new_deq_ptr && deq_state.new_deq_seg) { |
4652 | xhci_queue_new_dequeue_state(xhci, ep_ring, |
4653 | slot_id, ep_index, &deq_state); |
4654 | + xhci_ring_cmd_db(xhci); |
4655 | } else { |
4656 | /* Otherwise just ring the doorbell to restart the ring */ |
4657 | ring_ep_doorbell(xhci, slot_id, ep_index); |
4658 | @@ -644,18 +651,31 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci, |
4659 | { |
4660 | int slot_id; |
4661 | unsigned int ep_index; |
4662 | + struct xhci_ring *ep_ring; |
4663 | |
4664 | slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); |
4665 | ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); |
4666 | + ep_ring = xhci->devs[slot_id]->ep_rings[ep_index]; |
4667 | /* This command will only fail if the endpoint wasn't halted, |
4668 | * but we don't care. |
4669 | */ |
4670 | xhci_dbg(xhci, "Ignoring reset ep completion code of %u\n", |
4671 | (unsigned int) GET_COMP_CODE(event->status)); |
4672 | |
4673 | - /* Clear our internal halted state and restart the ring */ |
4674 | - xhci->devs[slot_id]->ep_rings[ep_index]->state &= ~EP_HALTED; |
4675 | - ring_ep_doorbell(xhci, slot_id, ep_index); |
4676 | + /* HW with the reset endpoint quirk needs to have a configure endpoint |
4677 | + * command complete before the endpoint can be used. Queue that here |
4678 | + * because the HW can't handle two commands being queued in a row. |
4679 | + */ |
4680 | + if (xhci->quirks & XHCI_RESET_EP_QUIRK) { |
4681 | + xhci_dbg(xhci, "Queueing configure endpoint command\n"); |
4682 | + xhci_queue_configure_endpoint(xhci, |
4683 | + xhci->devs[slot_id]->in_ctx->dma, slot_id); |
4684 | + xhci_ring_cmd_db(xhci); |
4685 | + } else { |
4686 | + /* Clear our internal halted state and restart the ring */ |
4687 | + ep_ring->state &= ~EP_HALTED; |
4688 | + ring_ep_doorbell(xhci, slot_id, ep_index); |
4689 | + } |
4690 | } |
4691 | |
4692 | static void handle_cmd_completion(struct xhci_hcd *xhci, |
4693 | @@ -664,6 +684,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, |
4694 | int slot_id = TRB_TO_SLOT_ID(event->flags); |
4695 | u64 cmd_dma; |
4696 | dma_addr_t cmd_dequeue_dma; |
4697 | + struct xhci_input_control_ctx *ctrl_ctx; |
4698 | + unsigned int ep_index; |
4699 | + struct xhci_ring *ep_ring; |
4700 | + unsigned int ep_state; |
4701 | |
4702 | cmd_dma = event->cmd_trb; |
4703 | cmd_dequeue_dma = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, |
4704 | @@ -691,6 +715,41 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, |
4705 | xhci_free_virt_device(xhci, slot_id); |
4706 | break; |
4707 | case TRB_TYPE(TRB_CONFIG_EP): |
4708 | + /* |
4709 | + * Configure endpoint commands can come from the USB core |
4710 | + * configuration or alt setting changes, or because the HW |
4711 | + * needed an extra configure endpoint command after a reset |
4712 | + * endpoint command. In the latter case, the xHCI driver is |
4713 | + * not waiting on the configure endpoint command. |
4714 | + */ |
4715 | + ctrl_ctx = xhci_get_input_control_ctx(xhci, |
4716 | + xhci->devs[slot_id]->in_ctx); |
4717 | + /* Input ctx add_flags are the endpoint index plus one */ |
4718 | + ep_index = xhci_last_valid_endpoint(ctrl_ctx->add_flags) - 1; |
4719 | + ep_ring = xhci->devs[slot_id]->ep_rings[ep_index]; |
4720 | + if (!ep_ring) { |
4721 | + /* This must have been an initial configure endpoint */ |
4722 | + xhci->devs[slot_id]->cmd_status = |
4723 | + GET_COMP_CODE(event->status); |
4724 | + complete(&xhci->devs[slot_id]->cmd_completion); |
4725 | + break; |
4726 | + } |
4727 | + ep_state = ep_ring->state; |
4728 | + xhci_dbg(xhci, "Completed config ep cmd - last ep index = %d, " |
4729 | + "state = %d\n", ep_index, ep_state); |
4730 | + if (xhci->quirks & XHCI_RESET_EP_QUIRK && |
4731 | + ep_state & EP_HALTED) { |
4732 | + /* Clear our internal halted state and restart ring */ |
4733 | + xhci->devs[slot_id]->ep_rings[ep_index]->state &= |
4734 | + ~EP_HALTED; |
4735 | + ring_ep_doorbell(xhci, slot_id, ep_index); |
4736 | + } else { |
4737 | + xhci->devs[slot_id]->cmd_status = |
4738 | + GET_COMP_CODE(event->status); |
4739 | + complete(&xhci->devs[slot_id]->cmd_completion); |
4740 | + } |
4741 | + break; |
4742 | + case TRB_TYPE(TRB_EVAL_CONTEXT): |
4743 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); |
4744 | complete(&xhci->devs[slot_id]->cmd_completion); |
4745 | break; |
4746 | @@ -806,6 +865,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4747 | { |
4748 | struct xhci_virt_device *xdev; |
4749 | struct xhci_ring *ep_ring; |
4750 | + unsigned int slot_id; |
4751 | int ep_index; |
4752 | struct xhci_td *td = 0; |
4753 | dma_addr_t event_dma; |
4754 | @@ -814,9 +874,11 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4755 | struct urb *urb = 0; |
4756 | int status = -EINPROGRESS; |
4757 | struct xhci_ep_ctx *ep_ctx; |
4758 | + u32 trb_comp_code; |
4759 | |
4760 | xhci_dbg(xhci, "In %s\n", __func__); |
4761 | - xdev = xhci->devs[TRB_TO_SLOT_ID(event->flags)]; |
4762 | + slot_id = TRB_TO_SLOT_ID(event->flags); |
4763 | + xdev = xhci->devs[slot_id]; |
4764 | if (!xdev) { |
4765 | xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); |
4766 | return -ENODEV; |
4767 | @@ -870,7 +932,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4768 | (unsigned int) event->flags); |
4769 | |
4770 | /* Look for common error cases */ |
4771 | - switch (GET_COMP_CODE(event->transfer_len)) { |
4772 | + trb_comp_code = GET_COMP_CODE(event->transfer_len); |
4773 | + switch (trb_comp_code) { |
4774 | /* Skip codes that require special handling depending on |
4775 | * transfer type |
4776 | */ |
4777 | @@ -913,7 +976,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4778 | /* Was this a control transfer? */ |
4779 | if (usb_endpoint_xfer_control(&td->urb->ep->desc)) { |
4780 | xhci_debug_trb(xhci, xhci->event_ring->dequeue); |
4781 | - switch (GET_COMP_CODE(event->transfer_len)) { |
4782 | + switch (trb_comp_code) { |
4783 | case COMP_SUCCESS: |
4784 | if (event_trb == ep_ring->dequeue) { |
4785 | xhci_warn(xhci, "WARN: Success on ctrl setup TRB without IOC set??\n"); |
4786 | @@ -928,8 +991,39 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4787 | break; |
4788 | case COMP_SHORT_TX: |
4789 | xhci_warn(xhci, "WARN: short transfer on control ep\n"); |
4790 | - status = -EREMOTEIO; |
4791 | + if (td->urb->transfer_flags & URB_SHORT_NOT_OK) |
4792 | + status = -EREMOTEIO; |
4793 | + else |
4794 | + status = 0; |
4795 | break; |
4796 | + case COMP_BABBLE: |
4797 | + /* The 0.96 spec says a babbling control endpoint |
4798 | + * is not halted. The 0.96 spec says it is. Some HW |
4799 | + * claims to be 0.95 compliant, but it halts the control |
4800 | + * endpoint anyway. Check if a babble halted the |
4801 | + * endpoint. |
4802 | + */ |
4803 | + if (ep_ctx->ep_info != EP_STATE_HALTED) |
4804 | + break; |
4805 | + /* else fall through */ |
4806 | + case COMP_STALL: |
4807 | + /* Did we transfer part of the data (middle) phase? */ |
4808 | + if (event_trb != ep_ring->dequeue && |
4809 | + event_trb != td->last_trb) |
4810 | + td->urb->actual_length = |
4811 | + td->urb->transfer_buffer_length |
4812 | + - TRB_LEN(event->transfer_len); |
4813 | + else |
4814 | + td->urb->actual_length = 0; |
4815 | + |
4816 | + ep_ring->stopped_td = td; |
4817 | + ep_ring->stopped_trb = event_trb; |
4818 | + xhci_queue_reset_ep(xhci, slot_id, ep_index); |
4819 | + xhci_cleanup_stalled_ring(xhci, |
4820 | + td->urb->dev, |
4821 | + ep_index, ep_ring); |
4822 | + xhci_ring_cmd_db(xhci); |
4823 | + goto td_cleanup; |
4824 | default: |
4825 | /* Others already handled above */ |
4826 | break; |
4827 | @@ -943,7 +1037,10 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4828 | if (event_trb == td->last_trb) { |
4829 | if (td->urb->actual_length != 0) { |
4830 | /* Don't overwrite a previously set error code */ |
4831 | - if (status == -EINPROGRESS || status == 0) |
4832 | + if ((status == -EINPROGRESS || |
4833 | + status == 0) && |
4834 | + (td->urb->transfer_flags |
4835 | + & URB_SHORT_NOT_OK)) |
4836 | /* Did we already see a short data stage? */ |
4837 | status = -EREMOTEIO; |
4838 | } else { |
4839 | @@ -952,7 +1049,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4840 | } |
4841 | } else { |
4842 | /* Maybe the event was for the data stage? */ |
4843 | - if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL) { |
4844 | + if (trb_comp_code != COMP_STOP_INVAL) { |
4845 | /* We didn't stop on a link TRB in the middle */ |
4846 | td->urb->actual_length = |
4847 | td->urb->transfer_buffer_length - |
4848 | @@ -964,7 +1061,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4849 | } |
4850 | } |
4851 | } else { |
4852 | - switch (GET_COMP_CODE(event->transfer_len)) { |
4853 | + switch (trb_comp_code) { |
4854 | case COMP_SUCCESS: |
4855 | /* Double check that the HW transferred everything. */ |
4856 | if (event_trb != td->last_trb) { |
4857 | @@ -975,7 +1072,12 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4858 | else |
4859 | status = 0; |
4860 | } else { |
4861 | - xhci_dbg(xhci, "Successful bulk transfer!\n"); |
4862 | + if (usb_endpoint_xfer_bulk(&td->urb->ep->desc)) |
4863 | + xhci_dbg(xhci, "Successful bulk " |
4864 | + "transfer!\n"); |
4865 | + else |
4866 | + xhci_dbg(xhci, "Successful interrupt " |
4867 | + "transfer!\n"); |
4868 | status = 0; |
4869 | } |
4870 | break; |
4871 | @@ -1001,11 +1103,17 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4872 | td->urb->actual_length = |
4873 | td->urb->transfer_buffer_length - |
4874 | TRB_LEN(event->transfer_len); |
4875 | - if (td->urb->actual_length < 0) { |
4876 | + if (td->urb->transfer_buffer_length < |
4877 | + td->urb->actual_length) { |
4878 | xhci_warn(xhci, "HC gave bad length " |
4879 | "of %d bytes left\n", |
4880 | TRB_LEN(event->transfer_len)); |
4881 | td->urb->actual_length = 0; |
4882 | + if (td->urb->transfer_flags & |
4883 | + URB_SHORT_NOT_OK) |
4884 | + status = -EREMOTEIO; |
4885 | + else |
4886 | + status = 0; |
4887 | } |
4888 | /* Don't overwrite a previously set error code */ |
4889 | if (status == -EINPROGRESS) { |
4890 | @@ -1041,14 +1149,14 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4891 | /* If the ring didn't stop on a Link or No-op TRB, add |
4892 | * in the actual bytes transferred from the Normal TRB |
4893 | */ |
4894 | - if (GET_COMP_CODE(event->transfer_len) != COMP_STOP_INVAL) |
4895 | + if (trb_comp_code != COMP_STOP_INVAL) |
4896 | td->urb->actual_length += |
4897 | TRB_LEN(cur_trb->generic.field[2]) - |
4898 | TRB_LEN(event->transfer_len); |
4899 | } |
4900 | } |
4901 | - if (GET_COMP_CODE(event->transfer_len) == COMP_STOP_INVAL || |
4902 | - GET_COMP_CODE(event->transfer_len) == COMP_STOP) { |
4903 | + if (trb_comp_code == COMP_STOP_INVAL || |
4904 | + trb_comp_code == COMP_STOP) { |
4905 | /* The Endpoint Stop Command completion will take care of any |
4906 | * stopped TDs. A stopped TD may be restarted, so don't update |
4907 | * the ring dequeue pointer or take this TD off any lists yet. |
4908 | @@ -1056,7 +1164,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4909 | ep_ring->stopped_td = td; |
4910 | ep_ring->stopped_trb = event_trb; |
4911 | } else { |
4912 | - if (GET_COMP_CODE(event->transfer_len) == COMP_STALL) { |
4913 | + if (trb_comp_code == COMP_STALL || |
4914 | + trb_comp_code == COMP_BABBLE) { |
4915 | /* The transfer is completed from the driver's |
4916 | * perspective, but we need to issue a set dequeue |
4917 | * command for this stalled endpoint to move the dequeue |
4918 | @@ -1072,16 +1181,41 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4919 | inc_deq(xhci, ep_ring, false); |
4920 | } |
4921 | |
4922 | +td_cleanup: |
4923 | /* Clean up the endpoint's TD list */ |
4924 | urb = td->urb; |
4925 | + /* Do one last check of the actual transfer length. |
4926 | + * If the host controller said we transferred more data than |
4927 | + * the buffer length, urb->actual_length will be a very big |
4928 | + * number (since it's unsigned). Play it safe and say we didn't |
4929 | + * transfer anything. |
4930 | + */ |
4931 | + if (urb->actual_length > urb->transfer_buffer_length) { |
4932 | + xhci_warn(xhci, "URB transfer length is wrong, " |
4933 | + "xHC issue? req. len = %u, " |
4934 | + "act. len = %u\n", |
4935 | + urb->transfer_buffer_length, |
4936 | + urb->actual_length); |
4937 | + urb->actual_length = 0; |
4938 | + if (td->urb->transfer_flags & URB_SHORT_NOT_OK) |
4939 | + status = -EREMOTEIO; |
4940 | + else |
4941 | + status = 0; |
4942 | + } |
4943 | list_del(&td->td_list); |
4944 | /* Was this TD slated to be cancelled but completed anyway? */ |
4945 | if (!list_empty(&td->cancelled_td_list)) { |
4946 | list_del(&td->cancelled_td_list); |
4947 | ep_ring->cancels_pending--; |
4948 | } |
4949 | - /* Leave the TD around for the reset endpoint function to use */ |
4950 | - if (GET_COMP_CODE(event->transfer_len) != COMP_STALL) { |
4951 | + /* Leave the TD around for the reset endpoint function to use |
4952 | + * (but only if it's not a control endpoint, since we already |
4953 | + * queued the Set TR dequeue pointer command for stalled |
4954 | + * control endpoints). |
4955 | + */ |
4956 | + if (usb_endpoint_xfer_control(&urb->ep->desc) || |
4957 | + (trb_comp_code != COMP_STALL && |
4958 | + trb_comp_code != COMP_BABBLE)) { |
4959 | kfree(td); |
4960 | } |
4961 | urb->hcpriv = NULL; |
4962 | @@ -1094,7 +1228,7 @@ cleanup: |
4963 | if (urb) { |
4964 | usb_hcd_unlink_urb_from_ep(xhci_to_hcd(xhci), urb); |
4965 | xhci_dbg(xhci, "Giveback URB %p, len = %d, status = %d\n", |
4966 | - urb, td->urb->actual_length, status); |
4967 | + urb, urb->actual_length, status); |
4968 | spin_unlock(&xhci->lock); |
4969 | usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, status); |
4970 | spin_lock(&xhci->lock); |
4971 | @@ -1335,6 +1469,47 @@ static void giveback_first_trb(struct xhci_hcd *xhci, int slot_id, |
4972 | ring_ep_doorbell(xhci, slot_id, ep_index); |
4973 | } |
4974 | |
4975 | +/* |
4976 | + * xHCI uses normal TRBs for both bulk and interrupt. When the interrupt |
4977 | + * endpoint is to be serviced, the xHC will consume (at most) one TD. A TD |
4978 | + * (comprised of sg list entries) can take several service intervals to |
4979 | + * transmit. |
4980 | + */ |
4981 | +int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
4982 | + struct urb *urb, int slot_id, unsigned int ep_index) |
4983 | +{ |
4984 | + struct xhci_ep_ctx *ep_ctx = xhci_get_ep_ctx(xhci, |
4985 | + xhci->devs[slot_id]->out_ctx, ep_index); |
4986 | + int xhci_interval; |
4987 | + int ep_interval; |
4988 | + |
4989 | + xhci_interval = EP_INTERVAL_TO_UFRAMES(ep_ctx->ep_info); |
4990 | + ep_interval = urb->interval; |
4991 | + /* Convert to microframes */ |
4992 | + if (urb->dev->speed == USB_SPEED_LOW || |
4993 | + urb->dev->speed == USB_SPEED_FULL) |
4994 | + ep_interval *= 8; |
4995 | + /* FIXME change this to a warning and a suggestion to use the new API |
4996 | + * to set the polling interval (once the API is added). |
4997 | + */ |
4998 | + if (xhci_interval != ep_interval) { |
4999 | + if (!printk_ratelimit()) |
5000 | + dev_dbg(&urb->dev->dev, "Driver uses different interval" |
5001 | + " (%d microframe%s) than xHCI " |
5002 | + "(%d microframe%s)\n", |
5003 | + ep_interval, |
5004 | + ep_interval == 1 ? "" : "s", |
5005 | + xhci_interval, |
5006 | + xhci_interval == 1 ? "" : "s"); |
5007 | + urb->interval = xhci_interval; |
5008 | + /* Convert back to frames for LS/FS devices */ |
5009 | + if (urb->dev->speed == USB_SPEED_LOW || |
5010 | + urb->dev->speed == USB_SPEED_FULL) |
5011 | + urb->interval /= 8; |
5012 | + } |
5013 | + return xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); |
5014 | +} |
5015 | + |
5016 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
5017 | struct urb *urb, int slot_id, unsigned int ep_index) |
5018 | { |
5019 | @@ -1733,6 +1908,15 @@ int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, |
5020 | TRB_TYPE(TRB_CONFIG_EP) | SLOT_ID_FOR_TRB(slot_id)); |
5021 | } |
5022 | |
5023 | +/* Queue an evaluate context command TRB */ |
5024 | +int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, |
5025 | + u32 slot_id) |
5026 | +{ |
5027 | + return queue_command(xhci, lower_32_bits(in_ctx_ptr), |
5028 | + upper_32_bits(in_ctx_ptr), 0, |
5029 | + TRB_TYPE(TRB_EVAL_CONTEXT) | SLOT_ID_FOR_TRB(slot_id)); |
5030 | +} |
5031 | + |
5032 | int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, |
5033 | unsigned int ep_index) |
5034 | { |
5035 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
5036 | index d31d322..8085841 100644 |
5037 | --- a/drivers/usb/host/xhci.h |
5038 | +++ b/drivers/usb/host/xhci.h |
5039 | @@ -581,6 +581,7 @@ struct xhci_ep_ctx { |
5040 | /* bit 15 is Linear Stream Array */ |
5041 | /* Interval - period between requests to an endpoint - 125u increments. */ |
5042 | #define EP_INTERVAL(p) ((p & 0xff) << 16) |
5043 | +#define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff)) |
5044 | |
5045 | /* ep_info2 bitmasks */ |
5046 | /* |
5047 | @@ -589,6 +590,7 @@ struct xhci_ep_ctx { |
5048 | */ |
5049 | #define FORCE_EVENT (0x1) |
5050 | #define ERROR_COUNT(p) (((p) & 0x3) << 1) |
5051 | +#define CTX_TO_EP_TYPE(p) (((p) >> 3) & 0x7) |
5052 | #define EP_TYPE(p) ((p) << 3) |
5053 | #define ISOC_OUT_EP 1 |
5054 | #define BULK_OUT_EP 2 |
5055 | @@ -601,6 +603,8 @@ struct xhci_ep_ctx { |
5056 | /* bit 7 is Host Initiate Disable - for disabling stream selection */ |
5057 | #define MAX_BURST(p) (((p)&0xff) << 8) |
5058 | #define MAX_PACKET(p) (((p)&0xffff) << 16) |
5059 | +#define MAX_PACKET_MASK (0xffff << 16) |
5060 | +#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff) |
5061 | |
5062 | |
5063 | /** |
5064 | @@ -926,6 +930,12 @@ struct xhci_td { |
5065 | union xhci_trb *last_trb; |
5066 | }; |
5067 | |
5068 | +struct xhci_dequeue_state { |
5069 | + struct xhci_segment *new_deq_seg; |
5070 | + union xhci_trb *new_deq_ptr; |
5071 | + int new_cycle_state; |
5072 | +}; |
5073 | + |
5074 | struct xhci_ring { |
5075 | struct xhci_segment *first_seg; |
5076 | union xhci_trb *enqueue; |
5077 | @@ -952,12 +962,6 @@ struct xhci_ring { |
5078 | u32 cycle_state; |
5079 | }; |
5080 | |
5081 | -struct xhci_dequeue_state { |
5082 | - struct xhci_segment *new_deq_seg; |
5083 | - union xhci_trb *new_deq_ptr; |
5084 | - int new_cycle_state; |
5085 | -}; |
5086 | - |
5087 | struct xhci_erst_entry { |
5088 | /* 64-bit event ring segment address */ |
5089 | u64 seg_addr; |
5090 | @@ -1058,6 +1062,9 @@ struct xhci_hcd { |
5091 | int noops_submitted; |
5092 | int noops_handled; |
5093 | int error_bitmask; |
5094 | + unsigned int quirks; |
5095 | +#define XHCI_LINK_TRB_QUIRK (1 << 0) |
5096 | +#define XHCI_RESET_EP_QUIRK (1 << 1) |
5097 | }; |
5098 | |
5099 | /* For testing purposes */ |
5100 | @@ -1136,6 +1143,13 @@ static inline void xhci_write_64(struct xhci_hcd *xhci, |
5101 | writel(val_hi, ptr + 1); |
5102 | } |
5103 | |
5104 | +static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci) |
5105 | +{ |
5106 | + u32 temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); |
5107 | + return ((HC_VERSION(temp) == 0x95) && |
5108 | + (xhci->quirks & XHCI_LINK_TRB_QUIRK)); |
5109 | +} |
5110 | + |
5111 | /* xHCI debugging */ |
5112 | void xhci_print_ir_set(struct xhci_hcd *xhci, struct xhci_intr_reg *ir_set, int set_num); |
5113 | void xhci_print_registers(struct xhci_hcd *xhci); |
5114 | @@ -1158,7 +1172,12 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, struct usb_device |
5115 | int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev); |
5116 | unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc); |
5117 | unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc); |
5118 | +unsigned int xhci_get_endpoint_flag_from_index(unsigned int ep_index); |
5119 | +unsigned int xhci_last_valid_endpoint(u32 added_ctxs); |
5120 | void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep); |
5121 | +void xhci_endpoint_copy(struct xhci_hcd *xhci, |
5122 | + struct xhci_virt_device *vdev, unsigned int ep_index); |
5123 | +void xhci_slot_copy(struct xhci_hcd *xhci, struct xhci_virt_device *vdev); |
5124 | int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, |
5125 | struct usb_device *udev, struct usb_host_endpoint *ep, |
5126 | gfp_t mem_flags); |
5127 | @@ -1205,8 +1224,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, |
5128 | int slot_id, unsigned int ep_index); |
5129 | int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, |
5130 | int slot_id, unsigned int ep_index); |
5131 | +int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, |
5132 | + int slot_id, unsigned int ep_index); |
5133 | int xhci_queue_configure_endpoint(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, |
5134 | u32 slot_id); |
5135 | +int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, |
5136 | + u32 slot_id); |
5137 | int xhci_queue_reset_ep(struct xhci_hcd *xhci, int slot_id, |
5138 | unsigned int ep_index); |
5139 | void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, |
5140 | @@ -1215,6 +1238,12 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, |
5141 | void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, |
5142 | struct xhci_ring *ep_ring, unsigned int slot_id, |
5143 | unsigned int ep_index, struct xhci_dequeue_state *deq_state); |
5144 | +void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, |
5145 | + struct usb_device *udev, |
5146 | + unsigned int ep_index, struct xhci_ring *ep_ring); |
5147 | +void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci, |
5148 | + unsigned int slot_id, unsigned int ep_index, |
5149 | + struct xhci_dequeue_state *deq_state); |
5150 | |
5151 | /* xHCI roothub code */ |
5152 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, |
5153 | diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c |
5154 | index aec6188..1a50beb 100644 |
5155 | --- a/drivers/usb/serial/ark3116.c |
5156 | +++ b/drivers/usb/serial/ark3116.c |
5157 | @@ -35,11 +35,6 @@ static struct usb_device_id id_table [] = { |
5158 | }; |
5159 | MODULE_DEVICE_TABLE(usb, id_table); |
5160 | |
5161 | -struct ark3116_private { |
5162 | - spinlock_t lock; |
5163 | - u8 termios_initialized; |
5164 | -}; |
5165 | - |
5166 | static inline void ARK3116_SND(struct usb_serial *serial, int seq, |
5167 | __u8 request, __u8 requesttype, |
5168 | __u16 value, __u16 index) |
5169 | @@ -82,22 +77,11 @@ static inline void ARK3116_RCV_QUIET(struct usb_serial *serial, |
5170 | static int ark3116_attach(struct usb_serial *serial) |
5171 | { |
5172 | char *buf; |
5173 | - struct ark3116_private *priv; |
5174 | - int i; |
5175 | - |
5176 | - for (i = 0; i < serial->num_ports; ++i) { |
5177 | - priv = kzalloc(sizeof(struct ark3116_private), GFP_KERNEL); |
5178 | - if (!priv) |
5179 | - goto cleanup; |
5180 | - spin_lock_init(&priv->lock); |
5181 | - |
5182 | - usb_set_serial_port_data(serial->port[i], priv); |
5183 | - } |
5184 | |
5185 | buf = kmalloc(1, GFP_KERNEL); |
5186 | if (!buf) { |
5187 | dbg("error kmalloc -> out of mem?"); |
5188 | - goto cleanup; |
5189 | + return -ENOMEM; |
5190 | } |
5191 | |
5192 | /* 3 */ |
5193 | @@ -149,13 +133,16 @@ static int ark3116_attach(struct usb_serial *serial) |
5194 | |
5195 | kfree(buf); |
5196 | return 0; |
5197 | +} |
5198 | |
5199 | -cleanup: |
5200 | - for (--i; i >= 0; --i) { |
5201 | - kfree(usb_get_serial_port_data(serial->port[i])); |
5202 | - usb_set_serial_port_data(serial->port[i], NULL); |
5203 | - } |
5204 | - return -ENOMEM; |
5205 | +static void ark3116_init_termios(struct tty_struct *tty) |
5206 | +{ |
5207 | + struct ktermios *termios = tty->termios; |
5208 | + *termios = tty_std_termios; |
5209 | + termios->c_cflag = B9600 | CS8 |
5210 | + | CREAD | HUPCL | CLOCAL; |
5211 | + termios->c_ispeed = 9600; |
5212 | + termios->c_ospeed = 9600; |
5213 | } |
5214 | |
5215 | static void ark3116_set_termios(struct tty_struct *tty, |
5216 | @@ -163,10 +150,8 @@ static void ark3116_set_termios(struct tty_struct *tty, |
5217 | struct ktermios *old_termios) |
5218 | { |
5219 | struct usb_serial *serial = port->serial; |
5220 | - struct ark3116_private *priv = usb_get_serial_port_data(port); |
5221 | struct ktermios *termios = tty->termios; |
5222 | unsigned int cflag = termios->c_cflag; |
5223 | - unsigned long flags; |
5224 | int baud; |
5225 | int ark3116_baud; |
5226 | char *buf; |
5227 | @@ -176,16 +161,6 @@ static void ark3116_set_termios(struct tty_struct *tty, |
5228 | |
5229 | dbg("%s - port %d", __func__, port->number); |
5230 | |
5231 | - spin_lock_irqsave(&priv->lock, flags); |
5232 | - if (!priv->termios_initialized) { |
5233 | - *termios = tty_std_termios; |
5234 | - termios->c_cflag = B9600 | CS8 |
5235 | - | CREAD | HUPCL | CLOCAL; |
5236 | - termios->c_ispeed = 9600; |
5237 | - termios->c_ospeed = 9600; |
5238 | - priv->termios_initialized = 1; |
5239 | - } |
5240 | - spin_unlock_irqrestore(&priv->lock, flags); |
5241 | |
5242 | cflag = termios->c_cflag; |
5243 | termios->c_cflag &= ~(CMSPAR|CRTSCTS); |
5244 | @@ -455,6 +430,7 @@ static struct usb_serial_driver ark3116_device = { |
5245 | .num_ports = 1, |
5246 | .attach = ark3116_attach, |
5247 | .set_termios = ark3116_set_termios, |
5248 | + .init_termios = ark3116_init_termios, |
5249 | .ioctl = ark3116_ioctl, |
5250 | .tiocmget = ark3116_tiocmget, |
5251 | .open = ark3116_open, |
5252 | diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c |
5253 | index 0e4f2e4..3e49b2e 100644 |
5254 | --- a/drivers/usb/serial/console.c |
5255 | +++ b/drivers/usb/serial/console.c |
5256 | @@ -16,6 +16,7 @@ |
5257 | #include <linux/slab.h> |
5258 | #include <linux/tty.h> |
5259 | #include <linux/console.h> |
5260 | +#include <linux/serial.h> |
5261 | #include <linux/usb.h> |
5262 | #include <linux/usb/serial.h> |
5263 | |
5264 | @@ -63,7 +64,7 @@ static int usb_console_setup(struct console *co, char *options) |
5265 | char *s; |
5266 | struct usb_serial *serial; |
5267 | struct usb_serial_port *port; |
5268 | - int retval = 0; |
5269 | + int retval; |
5270 | struct tty_struct *tty = NULL; |
5271 | struct ktermios *termios = NULL, dummy; |
5272 | |
5273 | @@ -116,13 +117,17 @@ static int usb_console_setup(struct console *co, char *options) |
5274 | return -ENODEV; |
5275 | } |
5276 | |
5277 | - port = serial->port[0]; |
5278 | + retval = usb_autopm_get_interface(serial->interface); |
5279 | + if (retval) |
5280 | + goto error_get_interface; |
5281 | + |
5282 | + port = serial->port[co->index - serial->minor]; |
5283 | tty_port_tty_set(&port->port, NULL); |
5284 | |
5285 | info->port = port; |
5286 | |
5287 | ++port->port.count; |
5288 | - if (port->port.count == 1) { |
5289 | + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { |
5290 | if (serial->type->set_termios) { |
5291 | /* |
5292 | * allocate a fake tty so the driver can initialize |
5293 | @@ -168,6 +173,7 @@ static int usb_console_setup(struct console *co, char *options) |
5294 | kfree(termios); |
5295 | kfree(tty); |
5296 | } |
5297 | + set_bit(ASYNCB_INITIALIZED, &port->port.flags); |
5298 | } |
5299 | /* Now that any required fake tty operations are completed restore |
5300 | * the tty port count */ |
5301 | @@ -175,18 +181,22 @@ static int usb_console_setup(struct console *co, char *options) |
5302 | /* The console is special in terms of closing the device so |
5303 | * indicate this port is now acting as a system console. */ |
5304 | port->console = 1; |
5305 | - retval = 0; |
5306 | |
5307 | -out: |
5308 | + mutex_unlock(&serial->disc_mutex); |
5309 | return retval; |
5310 | -free_termios: |
5311 | + |
5312 | + free_termios: |
5313 | kfree(termios); |
5314 | tty_port_tty_set(&port->port, NULL); |
5315 | -free_tty: |
5316 | + free_tty: |
5317 | kfree(tty); |
5318 | -reset_open_count: |
5319 | + reset_open_count: |
5320 | port->port.count = 0; |
5321 | - goto out; |
5322 | + usb_autopm_put_interface(serial->interface); |
5323 | + error_get_interface: |
5324 | + usb_serial_put(serial); |
5325 | + mutex_unlock(&serial->disc_mutex); |
5326 | + return retval; |
5327 | } |
5328 | |
5329 | static void usb_console_write(struct console *co, |
5330 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
5331 | index 985cbcf..b5275c4 100644 |
5332 | --- a/drivers/usb/serial/cp210x.c |
5333 | +++ b/drivers/usb/serial/cp210x.c |
5334 | @@ -399,12 +399,6 @@ static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port, |
5335 | |
5336 | /* Configure the termios structure */ |
5337 | cp210x_get_termios(tty, port); |
5338 | - |
5339 | - /* Set the DTR and RTS pins low */ |
5340 | - cp210x_tiocmset_port(tty ? (struct usb_serial_port *) tty->driver_data |
5341 | - : port, |
5342 | - NULL, TIOCM_DTR | TIOCM_RTS, 0); |
5343 | - |
5344 | return 0; |
5345 | } |
5346 | |
5347 | diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c |
5348 | index 59adfe1..27b5a27 100644 |
5349 | --- a/drivers/usb/serial/cypress_m8.c |
5350 | +++ b/drivers/usb/serial/cypress_m8.c |
5351 | @@ -659,15 +659,7 @@ static int cypress_open(struct tty_struct *tty, |
5352 | spin_unlock_irqrestore(&priv->lock, flags); |
5353 | |
5354 | /* Set termios */ |
5355 | - result = cypress_write(tty, port, NULL, 0); |
5356 | - |
5357 | - if (result) { |
5358 | - dev_err(&port->dev, |
5359 | - "%s - failed setting the control lines - error %d\n", |
5360 | - __func__, result); |
5361 | - return result; |
5362 | - } else |
5363 | - dbg("%s - success setting the control lines", __func__); |
5364 | + cypress_send(port); |
5365 | |
5366 | if (tty) |
5367 | cypress_set_termios(tty, port, &priv->tmp_termios); |
5368 | @@ -1005,6 +997,8 @@ static void cypress_set_termios(struct tty_struct *tty, |
5369 | dbg("%s - port %d", __func__, port->number); |
5370 | |
5371 | spin_lock_irqsave(&priv->lock, flags); |
5372 | + /* We can't clean this one up as we don't know the device type |
5373 | + early enough */ |
5374 | if (!priv->termios_initialized) { |
5375 | if (priv->chiptype == CT_EARTHMATE) { |
5376 | *(tty->termios) = tty_std_termios; |
5377 | diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c |
5378 | index 80cb347..3433f9d 100644 |
5379 | --- a/drivers/usb/serial/empeg.c |
5380 | +++ b/drivers/usb/serial/empeg.c |
5381 | @@ -90,8 +90,7 @@ static int empeg_chars_in_buffer(struct tty_struct *tty); |
5382 | static void empeg_throttle(struct tty_struct *tty); |
5383 | static void empeg_unthrottle(struct tty_struct *tty); |
5384 | static int empeg_startup(struct usb_serial *serial); |
5385 | -static void empeg_set_termios(struct tty_struct *tty, |
5386 | - struct usb_serial_port *port, struct ktermios *old_termios); |
5387 | +static void empeg_init_termios(struct tty_struct *tty); |
5388 | static void empeg_write_bulk_callback(struct urb *urb); |
5389 | static void empeg_read_bulk_callback(struct urb *urb); |
5390 | |
5391 | @@ -123,7 +122,7 @@ static struct usb_serial_driver empeg_device = { |
5392 | .throttle = empeg_throttle, |
5393 | .unthrottle = empeg_unthrottle, |
5394 | .attach = empeg_startup, |
5395 | - .set_termios = empeg_set_termios, |
5396 | + .init_termios = empeg_init_termios, |
5397 | .write = empeg_write, |
5398 | .write_room = empeg_write_room, |
5399 | .chars_in_buffer = empeg_chars_in_buffer, |
5400 | @@ -150,9 +149,6 @@ static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port, |
5401 | |
5402 | dbg("%s - port %d", __func__, port->number); |
5403 | |
5404 | - /* Force default termio settings */ |
5405 | - empeg_set_termios(tty, port, NULL) ; |
5406 | - |
5407 | bytes_in = 0; |
5408 | bytes_out = 0; |
5409 | |
5410 | @@ -425,11 +421,9 @@ static int empeg_startup(struct usb_serial *serial) |
5411 | } |
5412 | |
5413 | |
5414 | -static void empeg_set_termios(struct tty_struct *tty, |
5415 | - struct usb_serial_port *port, struct ktermios *old_termios) |
5416 | +static void empeg_init_termios(struct tty_struct *tty) |
5417 | { |
5418 | struct ktermios *termios = tty->termios; |
5419 | - dbg("%s - port %d", __func__, port->number); |
5420 | |
5421 | /* |
5422 | * The empeg-car player wants these particular tty settings. |
5423 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
5424 | index 8fec5d4..0cc78f9 100644 |
5425 | --- a/drivers/usb/serial/ftdi_sio.c |
5426 | +++ b/drivers/usb/serial/ftdi_sio.c |
5427 | @@ -176,6 +176,9 @@ static struct usb_device_id id_table_combined [] = { |
5428 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
5429 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
5430 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
5431 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, |
5432 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
5433 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
5434 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
5435 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
5436 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
5437 | @@ -694,6 +697,8 @@ static struct usb_device_id id_table_combined [] = { |
5438 | { USB_DEVICE(DE_VID, WHT_PID) }, |
5439 | { USB_DEVICE(ADI_VID, ADI_GNICE_PID), |
5440 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
5441 | + { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), |
5442 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
5443 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
5444 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), |
5445 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
5446 | @@ -702,6 +707,8 @@ static struct usb_device_id id_table_combined [] = { |
5447 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, |
5448 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), |
5449 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
5450 | + { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, |
5451 | + { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, |
5452 | { }, /* Optional parameter entry */ |
5453 | { } /* Terminating entry */ |
5454 | }; |
5455 | diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h |
5456 | index 8c92b88..6f31e0d 100644 |
5457 | --- a/drivers/usb/serial/ftdi_sio.h |
5458 | +++ b/drivers/usb/serial/ftdi_sio.h |
5459 | @@ -81,6 +81,9 @@ |
5460 | |
5461 | /* OpenDCC (www.opendcc.de) product id */ |
5462 | #define FTDI_OPENDCC_PID 0xBFD8 |
5463 | +#define FTDI_OPENDCC_SNIFFER_PID 0xBFD9 |
5464 | +#define FTDI_OPENDCC_THROTTLE_PID 0xBFDA |
5465 | +#define FTDI_OPENDCC_GATEWAY_PID 0xBFDB |
5466 | |
5467 | /* Sprog II (Andrew Crosland's SprogII DCC interface) */ |
5468 | #define FTDI_SPROG_II 0xF0C8 |
5469 | @@ -930,6 +933,7 @@ |
5470 | */ |
5471 | #define ADI_VID 0x0456 |
5472 | #define ADI_GNICE_PID 0xF000 |
5473 | +#define ADI_GNICEPLUS_PID 0xF001 |
5474 | |
5475 | /* |
5476 | * JETI SPECTROMETER SPECBOS 1201 |
5477 | @@ -968,6 +972,12 @@ |
5478 | #define MARVELL_OPENRD_PID 0x9e90 |
5479 | |
5480 | /* |
5481 | + * Hameg HO820 and HO870 interface (using VID 0x0403) |
5482 | + */ |
5483 | +#define HAMEG_HO820_PID 0xed74 |
5484 | +#define HAMEG_HO870_PID 0xed71 |
5485 | + |
5486 | +/* |
5487 | * BmRequestType: 1100 0000b |
5488 | * bRequest: FTDI_E2_READ |
5489 | * wValue: 0 |
5490 | diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c |
5491 | index 96873a7..af6df6c 100644 |
5492 | --- a/drivers/usb/serial/iuu_phoenix.c |
5493 | +++ b/drivers/usb/serial/iuu_phoenix.c |
5494 | @@ -71,7 +71,6 @@ struct iuu_private { |
5495 | spinlock_t lock; /* store irq state */ |
5496 | wait_queue_head_t delta_msr_wait; |
5497 | u8 line_status; |
5498 | - u8 termios_initialized; |
5499 | int tiostatus; /* store IUART SIGNAL for tiocmget call */ |
5500 | u8 reset; /* if 1 reset is needed */ |
5501 | int poll; /* number of poll */ |
5502 | @@ -1018,6 +1017,18 @@ static void iuu_close(struct usb_serial_port *port) |
5503 | } |
5504 | } |
5505 | |
5506 | +static void iuu_init_termios(struct tty_struct *tty) |
5507 | +{ |
5508 | + *(tty->termios) = tty_std_termios; |
5509 | + tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 |
5510 | + | TIOCM_CTS | CSTOPB | PARENB; |
5511 | + tty->termios->c_ispeed = 9600; |
5512 | + tty->termios->c_ospeed = 9600; |
5513 | + tty->termios->c_lflag = 0; |
5514 | + tty->termios->c_oflag = 0; |
5515 | + tty->termios->c_iflag = 0; |
5516 | +} |
5517 | + |
5518 | static int iuu_open(struct tty_struct *tty, |
5519 | struct usb_serial_port *port, struct file *filp) |
5520 | { |
5521 | @@ -1025,7 +1036,6 @@ static int iuu_open(struct tty_struct *tty, |
5522 | u8 *buf; |
5523 | int result; |
5524 | u32 actual; |
5525 | - unsigned long flags; |
5526 | struct iuu_private *priv = usb_get_serial_port_data(port); |
5527 | |
5528 | dbg("%s - port %d", __func__, port->number); |
5529 | @@ -1064,21 +1074,7 @@ static int iuu_open(struct tty_struct *tty, |
5530 | port->bulk_in_buffer, 512, |
5531 | NULL, NULL); |
5532 | |
5533 | - /* set the termios structure */ |
5534 | - spin_lock_irqsave(&priv->lock, flags); |
5535 | - if (tty && !priv->termios_initialized) { |
5536 | - *(tty->termios) = tty_std_termios; |
5537 | - tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 |
5538 | - | TIOCM_CTS | CSTOPB | PARENB; |
5539 | - tty->termios->c_ispeed = 9600; |
5540 | - tty->termios->c_ospeed = 9600; |
5541 | - tty->termios->c_lflag = 0; |
5542 | - tty->termios->c_oflag = 0; |
5543 | - tty->termios->c_iflag = 0; |
5544 | - priv->termios_initialized = 1; |
5545 | - priv->poll = 0; |
5546 | - } |
5547 | - spin_unlock_irqrestore(&priv->lock, flags); |
5548 | + priv->poll = 0; |
5549 | |
5550 | /* initialize writebuf */ |
5551 | #define FISH(a, b, c, d) do { \ |
5552 | @@ -1201,6 +1197,7 @@ static struct usb_serial_driver iuu_device = { |
5553 | .tiocmget = iuu_tiocmget, |
5554 | .tiocmset = iuu_tiocmset, |
5555 | .set_termios = iuu_set_termios, |
5556 | + .init_termios = iuu_init_termios, |
5557 | .attach = iuu_startup, |
5558 | .release = iuu_release, |
5559 | }; |
5560 | diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c |
5561 | index 6db0e56..46d47d1 100644 |
5562 | --- a/drivers/usb/serial/kobil_sct.c |
5563 | +++ b/drivers/usb/serial/kobil_sct.c |
5564 | @@ -85,7 +85,7 @@ static void kobil_read_int_callback(struct urb *urb); |
5565 | static void kobil_write_callback(struct urb *purb); |
5566 | static void kobil_set_termios(struct tty_struct *tty, |
5567 | struct usb_serial_port *port, struct ktermios *old); |
5568 | - |
5569 | +static void kobil_init_termios(struct tty_struct *tty); |
5570 | |
5571 | static struct usb_device_id id_table [] = { |
5572 | { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_ADAPTER_B_PRODUCT_ID) }, |
5573 | @@ -120,6 +120,7 @@ static struct usb_serial_driver kobil_device = { |
5574 | .release = kobil_release, |
5575 | .ioctl = kobil_ioctl, |
5576 | .set_termios = kobil_set_termios, |
5577 | + .init_termios = kobil_init_termios, |
5578 | .tiocmget = kobil_tiocmget, |
5579 | .tiocmset = kobil_tiocmset, |
5580 | .open = kobil_open, |
5581 | @@ -210,6 +211,15 @@ static void kobil_release(struct usb_serial *serial) |
5582 | kfree(usb_get_serial_port_data(serial->port[i])); |
5583 | } |
5584 | |
5585 | +static void kobil_init_termios(struct tty_struct *tty) |
5586 | +{ |
5587 | + /* Default to echo off and other sane device settings */ |
5588 | + tty->termios->c_lflag = 0; |
5589 | + tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); |
5590 | + tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; |
5591 | + /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ |
5592 | + tty->termios->c_oflag &= ~ONLCR; |
5593 | +} |
5594 | |
5595 | static int kobil_open(struct tty_struct *tty, |
5596 | struct usb_serial_port *port, struct file *filp) |
5597 | @@ -226,16 +236,6 @@ static int kobil_open(struct tty_struct *tty, |
5598 | /* someone sets the dev to 0 if the close method has been called */ |
5599 | port->interrupt_in_urb->dev = port->serial->dev; |
5600 | |
5601 | - if (tty) { |
5602 | - |
5603 | - /* Default to echo off and other sane device settings */ |
5604 | - tty->termios->c_lflag = 0; |
5605 | - tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | |
5606 | - XCASE); |
5607 | - tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; |
5608 | - /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ |
5609 | - tty->termios->c_oflag &= ~ONLCR; |
5610 | - } |
5611 | /* allocate memory for transfer buffer */ |
5612 | transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); |
5613 | if (!transfer_buffer) |
5614 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
5615 | index c784ddb..0101548 100644 |
5616 | --- a/drivers/usb/serial/option.c |
5617 | +++ b/drivers/usb/serial/option.c |
5618 | @@ -292,6 +292,7 @@ static int option_resume(struct usb_serial *serial); |
5619 | |
5620 | #define TELIT_VENDOR_ID 0x1bc7 |
5621 | #define TELIT_PRODUCT_UC864E 0x1003 |
5622 | +#define TELIT_PRODUCT_UC864G 0x1004 |
5623 | |
5624 | /* ZTE PRODUCTS */ |
5625 | #define ZTE_VENDOR_ID 0x19d2 |
5626 | @@ -300,6 +301,7 @@ static int option_resume(struct usb_serial *serial); |
5627 | #define ZTE_PRODUCT_MF626 0x0031 |
5628 | #define ZTE_PRODUCT_CDMA_TECH 0xfffe |
5629 | #define ZTE_PRODUCT_AC8710 0xfff1 |
5630 | +#define ZTE_PRODUCT_AC2726 0xfff5 |
5631 | |
5632 | #define BENQ_VENDOR_ID 0x04a5 |
5633 | #define BENQ_PRODUCT_H10 0x4068 |
5634 | @@ -503,6 +505,7 @@ static struct usb_device_id option_ids[] = { |
5635 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
5636 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
5637 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
5638 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, |
5639 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
5640 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) }, |
5641 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) }, |
5642 | @@ -572,6 +575,7 @@ static struct usb_device_id option_ids[] = { |
5643 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
5644 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
5645 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
5646 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
5647 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
5648 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
5649 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) }, |
5650 | diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c |
5651 | index 3cece27..ef34cff 100644 |
5652 | --- a/drivers/usb/serial/oti6858.c |
5653 | +++ b/drivers/usb/serial/oti6858.c |
5654 | @@ -146,6 +146,7 @@ static int oti6858_open(struct tty_struct *tty, |
5655 | static void oti6858_close(struct usb_serial_port *port); |
5656 | static void oti6858_set_termios(struct tty_struct *tty, |
5657 | struct usb_serial_port *port, struct ktermios *old); |
5658 | +static void oti6858_init_termios(struct tty_struct *tty); |
5659 | static int oti6858_ioctl(struct tty_struct *tty, struct file *file, |
5660 | unsigned int cmd, unsigned long arg); |
5661 | static void oti6858_read_int_callback(struct urb *urb); |
5662 | @@ -186,6 +187,7 @@ static struct usb_serial_driver oti6858_device = { |
5663 | .write = oti6858_write, |
5664 | .ioctl = oti6858_ioctl, |
5665 | .set_termios = oti6858_set_termios, |
5666 | + .init_termios = oti6858_init_termios, |
5667 | .tiocmget = oti6858_tiocmget, |
5668 | .tiocmset = oti6858_tiocmset, |
5669 | .read_bulk_callback = oti6858_read_bulk_callback, |
5670 | @@ -206,7 +208,6 @@ struct oti6858_private { |
5671 | struct { |
5672 | u8 read_urb_in_use; |
5673 | u8 write_urb_in_use; |
5674 | - u8 termios_initialized; |
5675 | } flags; |
5676 | struct delayed_work delayed_write_work; |
5677 | |
5678 | @@ -447,6 +448,14 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty) |
5679 | return chars; |
5680 | } |
5681 | |
5682 | +static void oti6858_init_termios(struct tty_struct *tty) |
5683 | +{ |
5684 | + *(tty->termios) = tty_std_termios; |
5685 | + tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; |
5686 | + tty->termios->c_ispeed = 38400; |
5687 | + tty->termios->c_ospeed = 38400; |
5688 | +} |
5689 | + |
5690 | static void oti6858_set_termios(struct tty_struct *tty, |
5691 | struct usb_serial_port *port, struct ktermios *old_termios) |
5692 | { |
5693 | @@ -464,16 +473,6 @@ static void oti6858_set_termios(struct tty_struct *tty, |
5694 | return; |
5695 | } |
5696 | |
5697 | - spin_lock_irqsave(&priv->lock, flags); |
5698 | - if (!priv->flags.termios_initialized) { |
5699 | - *(tty->termios) = tty_std_termios; |
5700 | - tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; |
5701 | - tty->termios->c_ispeed = 38400; |
5702 | - tty->termios->c_ospeed = 38400; |
5703 | - priv->flags.termios_initialized = 1; |
5704 | - } |
5705 | - spin_unlock_irqrestore(&priv->lock, flags); |
5706 | - |
5707 | cflag = tty->termios->c_cflag; |
5708 | |
5709 | spin_lock_irqsave(&priv->lock, flags); |
5710 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
5711 | index 3e86815..124d5ae 100644 |
5712 | --- a/drivers/usb/serial/pl2303.c |
5713 | +++ b/drivers/usb/serial/pl2303.c |
5714 | @@ -96,6 +96,7 @@ static struct usb_device_id id_table [] = { |
5715 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
5716 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, |
5717 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, |
5718 | + { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, |
5719 | { } /* Terminating entry */ |
5720 | }; |
5721 | |
5722 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
5723 | index ee9505e..d640dc9 100644 |
5724 | --- a/drivers/usb/serial/pl2303.h |
5725 | +++ b/drivers/usb/serial/pl2303.h |
5726 | @@ -130,3 +130,7 @@ |
5727 | /* Sony, USB data cable for CMD-Jxx mobile phones */ |
5728 | #define SONY_VENDOR_ID 0x054c |
5729 | #define SONY_QN3USB_PRODUCT_ID 0x0437 |
5730 | + |
5731 | +/* Sanwa KB-USB2 multimeter cable (ID: 11ad:0001) */ |
5732 | +#define SANWA_VENDOR_ID 0x11ad |
5733 | +#define SANWA_PRODUCT_ID 0x0001 |
5734 | diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c |
5735 | index 3c249d8..993a6d5 100644 |
5736 | --- a/drivers/usb/serial/spcp8x5.c |
5737 | +++ b/drivers/usb/serial/spcp8x5.c |
5738 | @@ -299,7 +299,6 @@ struct spcp8x5_private { |
5739 | wait_queue_head_t delta_msr_wait; |
5740 | u8 line_control; |
5741 | u8 line_status; |
5742 | - u8 termios_initialized; |
5743 | }; |
5744 | |
5745 | /* desc : when device plug in,this function would be called. |
5746 | @@ -498,6 +497,15 @@ static void spcp8x5_close(struct usb_serial_port *port) |
5747 | dev_dbg(&port->dev, "usb_unlink_urb(read_urb) = %d\n", result); |
5748 | } |
5749 | |
5750 | +static void spcp8x5_init_termios(struct tty_struct *tty) |
5751 | +{ |
5752 | + /* for the 1st time call this function */ |
5753 | + *(tty->termios) = tty_std_termios; |
5754 | + tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; |
5755 | + tty->termios->c_ispeed = 115200; |
5756 | + tty->termios->c_ospeed = 115200; |
5757 | +} |
5758 | + |
5759 | /* set the serial param for transfer. we should check if we really need to |
5760 | * transfer. if we set flow control we should do this too. */ |
5761 | static void spcp8x5_set_termios(struct tty_struct *tty, |
5762 | @@ -514,16 +522,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, |
5763 | int i; |
5764 | u8 control; |
5765 | |
5766 | - /* for the 1st time call this function */ |
5767 | - spin_lock_irqsave(&priv->lock, flags); |
5768 | - if (!priv->termios_initialized) { |
5769 | - *(tty->termios) = tty_std_termios; |
5770 | - tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; |
5771 | - tty->termios->c_ispeed = 115200; |
5772 | - tty->termios->c_ospeed = 115200; |
5773 | - priv->termios_initialized = 1; |
5774 | - } |
5775 | - spin_unlock_irqrestore(&priv->lock, flags); |
5776 | |
5777 | /* check that they really want us to change something */ |
5778 | if (!tty_termios_hw_change(tty->termios, old_termios)) |
5779 | @@ -1011,6 +1009,7 @@ static struct usb_serial_driver spcp8x5_device = { |
5780 | .carrier_raised = spcp8x5_carrier_raised, |
5781 | .write = spcp8x5_write, |
5782 | .set_termios = spcp8x5_set_termios, |
5783 | + .init_termios = spcp8x5_init_termios, |
5784 | .ioctl = spcp8x5_ioctl, |
5785 | .tiocmget = spcp8x5_tiocmget, |
5786 | .tiocmset = spcp8x5_tiocmset, |
5787 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c |
5788 | index 99188c9..a0702db 100644 |
5789 | --- a/drivers/usb/serial/usb-serial.c |
5790 | +++ b/drivers/usb/serial/usb-serial.c |
5791 | @@ -43,8 +43,6 @@ |
5792 | #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" |
5793 | #define DRIVER_DESC "USB Serial Driver core" |
5794 | |
5795 | -static void port_free(struct usb_serial_port *port); |
5796 | - |
5797 | /* Driver structure we register with the USB core */ |
5798 | static struct usb_driver usb_serial_driver = { |
5799 | .name = "usbserial", |
5800 | @@ -68,6 +66,11 @@ static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; |
5801 | static DEFINE_MUTEX(table_lock); |
5802 | static LIST_HEAD(usb_serial_driver_list); |
5803 | |
5804 | +/* |
5805 | + * Look up the serial structure. If it is found and it hasn't been |
5806 | + * disconnected, return with its disc_mutex held and its refcount |
5807 | + * incremented. Otherwise return NULL. |
5808 | + */ |
5809 | struct usb_serial *usb_serial_get_by_index(unsigned index) |
5810 | { |
5811 | struct usb_serial *serial; |
5812 | @@ -75,8 +78,15 @@ struct usb_serial *usb_serial_get_by_index(unsigned index) |
5813 | mutex_lock(&table_lock); |
5814 | serial = serial_table[index]; |
5815 | |
5816 | - if (serial) |
5817 | - kref_get(&serial->kref); |
5818 | + if (serial) { |
5819 | + mutex_lock(&serial->disc_mutex); |
5820 | + if (serial->disconnected) { |
5821 | + mutex_unlock(&serial->disc_mutex); |
5822 | + serial = NULL; |
5823 | + } else { |
5824 | + kref_get(&serial->kref); |
5825 | + } |
5826 | + } |
5827 | mutex_unlock(&table_lock); |
5828 | return serial; |
5829 | } |
5830 | @@ -125,8 +135,10 @@ static void return_serial(struct usb_serial *serial) |
5831 | |
5832 | dbg("%s", __func__); |
5833 | |
5834 | + mutex_lock(&table_lock); |
5835 | for (i = 0; i < serial->num_ports; ++i) |
5836 | serial_table[serial->minor + i] = NULL; |
5837 | + mutex_unlock(&table_lock); |
5838 | } |
5839 | |
5840 | static void destroy_serial(struct kref *kref) |
5841 | @@ -145,161 +157,157 @@ static void destroy_serial(struct kref *kref) |
5842 | |
5843 | serial->type->release(serial); |
5844 | |
5845 | - for (i = 0; i < serial->num_ports; ++i) { |
5846 | + /* Now that nothing is using the ports, they can be freed */ |
5847 | + for (i = 0; i < serial->num_port_pointers; ++i) { |
5848 | port = serial->port[i]; |
5849 | - if (port) |
5850 | + if (port) { |
5851 | + port->serial = NULL; |
5852 | put_device(&port->dev); |
5853 | - } |
5854 | - |
5855 | - /* If this is a "fake" port, we have to clean it up here, as it will |
5856 | - * not get cleaned up in port_release() as it was never registered with |
5857 | - * the driver core */ |
5858 | - if (serial->num_ports < serial->num_port_pointers) { |
5859 | - for (i = serial->num_ports; |
5860 | - i < serial->num_port_pointers; ++i) { |
5861 | - port = serial->port[i]; |
5862 | - if (port) |
5863 | - port_free(port); |
5864 | } |
5865 | } |
5866 | |
5867 | usb_put_dev(serial->dev); |
5868 | - |
5869 | - /* free up any memory that we allocated */ |
5870 | kfree(serial); |
5871 | } |
5872 | |
5873 | void usb_serial_put(struct usb_serial *serial) |
5874 | { |
5875 | - mutex_lock(&table_lock); |
5876 | kref_put(&serial->kref, destroy_serial); |
5877 | - mutex_unlock(&table_lock); |
5878 | } |
5879 | |
5880 | /***************************************************************************** |
5881 | * Driver tty interface functions |
5882 | *****************************************************************************/ |
5883 | -static int serial_open (struct tty_struct *tty, struct file *filp) |
5884 | + |
5885 | +/** |
5886 | + * serial_install - install tty |
5887 | + * @driver: the driver (USB in our case) |
5888 | + * @tty: the tty being created |
5889 | + * |
5890 | + * Create the termios objects for this tty. We use the default |
5891 | + * USB serial settings but permit them to be overridden by |
5892 | + * serial->type->init_termios. |
5893 | + * |
5894 | + * This is the first place a new tty gets used. Hence this is where we |
5895 | + * acquire references to the usb_serial structure and the driver module, |
5896 | + * where we store a pointer to the port, and where we do an autoresume. |
5897 | + * All these actions are reversed in serial_release(). |
5898 | + */ |
5899 | +static int serial_install(struct tty_driver *driver, struct tty_struct *tty) |
5900 | { |
5901 | + int idx = tty->index; |
5902 | struct usb_serial *serial; |
5903 | struct usb_serial_port *port; |
5904 | - unsigned int portNumber; |
5905 | - int retval = 0; |
5906 | - int first = 0; |
5907 | + int retval = -ENODEV; |
5908 | |
5909 | dbg("%s", __func__); |
5910 | |
5911 | - /* get the serial object associated with this tty pointer */ |
5912 | - serial = usb_serial_get_by_index(tty->index); |
5913 | - if (!serial) { |
5914 | - tty->driver_data = NULL; |
5915 | - return -ENODEV; |
5916 | - } |
5917 | + serial = usb_serial_get_by_index(idx); |
5918 | + if (!serial) |
5919 | + return retval; |
5920 | |
5921 | - mutex_lock(&serial->disc_mutex); |
5922 | - portNumber = tty->index - serial->minor; |
5923 | - port = serial->port[portNumber]; |
5924 | - if (!port || serial->disconnected) |
5925 | - retval = -ENODEV; |
5926 | - else |
5927 | - get_device(&port->dev); |
5928 | - /* |
5929 | - * Note: Our locking order requirement does not allow port->mutex |
5930 | - * to be acquired while serial->disc_mutex is held. |
5931 | - */ |
5932 | - mutex_unlock(&serial->disc_mutex); |
5933 | + port = serial->port[idx - serial->minor]; |
5934 | + if (!port) |
5935 | + goto error_no_port; |
5936 | + if (!try_module_get(serial->type->driver.owner)) |
5937 | + goto error_module_get; |
5938 | + |
5939 | + /* perform the standard setup */ |
5940 | + retval = tty_init_termios(tty); |
5941 | if (retval) |
5942 | - goto bailout_serial_put; |
5943 | + goto error_init_termios; |
5944 | |
5945 | - if (mutex_lock_interruptible(&port->mutex)) { |
5946 | - retval = -ERESTARTSYS; |
5947 | - goto bailout_port_put; |
5948 | - } |
5949 | + retval = usb_autopm_get_interface(serial->interface); |
5950 | + if (retval) |
5951 | + goto error_get_interface; |
5952 | + |
5953 | + mutex_unlock(&serial->disc_mutex); |
5954 | |
5955 | - ++port->port.count; |
5956 | + /* allow the driver to update the settings */ |
5957 | + if (serial->type->init_termios) |
5958 | + serial->type->init_termios(tty); |
5959 | |
5960 | - /* set up our port structure making the tty driver |
5961 | - * remember our port object, and us it */ |
5962 | tty->driver_data = port; |
5963 | - tty_port_tty_set(&port->port, tty); |
5964 | |
5965 | - /* If the console is attached, the device is already open */ |
5966 | - if (port->port.count == 1 && !port->console) { |
5967 | - first = 1; |
5968 | - /* lock this module before we call it |
5969 | - * this may fail, which means we must bail out, |
5970 | - * safe because we are called with BKL held */ |
5971 | - if (!try_module_get(serial->type->driver.owner)) { |
5972 | - retval = -ENODEV; |
5973 | - goto bailout_mutex_unlock; |
5974 | - } |
5975 | + /* Final install (we use the default method) */ |
5976 | + tty_driver_kref_get(driver); |
5977 | + tty->count++; |
5978 | + driver->ttys[idx] = tty; |
5979 | + return retval; |
5980 | |
5981 | + error_get_interface: |
5982 | + error_init_termios: |
5983 | + module_put(serial->type->driver.owner); |
5984 | + error_module_get: |
5985 | + error_no_port: |
5986 | + usb_serial_put(serial); |
5987 | + mutex_unlock(&serial->disc_mutex); |
5988 | + return retval; |
5989 | +} |
5990 | + |
5991 | +static int serial_open(struct tty_struct *tty, struct file *filp) |
5992 | +{ |
5993 | + struct usb_serial_port *port = tty->driver_data; |
5994 | + struct usb_serial *serial = port->serial; |
5995 | + int retval; |
5996 | + |
5997 | + dbg("%s - port %d", __func__, port->number); |
5998 | + |
5999 | + spin_lock_irq(&port->port.lock); |
6000 | + if (!tty_hung_up_p(filp)) |
6001 | + ++port->port.count; |
6002 | + spin_unlock_irq(&port->port.lock); |
6003 | + tty_port_tty_set(&port->port, tty); |
6004 | + |
6005 | + /* Do the device-specific open only if the hardware isn't |
6006 | + * already initialized. |
6007 | + */ |
6008 | + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { |
6009 | + if (mutex_lock_interruptible(&port->mutex)) |
6010 | + return -ERESTARTSYS; |
6011 | mutex_lock(&serial->disc_mutex); |
6012 | if (serial->disconnected) |
6013 | retval = -ENODEV; |
6014 | else |
6015 | - retval = usb_autopm_get_interface(serial->interface); |
6016 | - if (retval) |
6017 | - goto bailout_module_put; |
6018 | - |
6019 | - /* only call the device specific open if this |
6020 | - * is the first time the port is opened */ |
6021 | - retval = serial->type->open(tty, port, filp); |
6022 | - if (retval) |
6023 | - goto bailout_interface_put; |
6024 | + retval = port->serial->type->open(tty, port, filp); |
6025 | mutex_unlock(&serial->disc_mutex); |
6026 | + mutex_unlock(&port->mutex); |
6027 | + if (retval) |
6028 | + return retval; |
6029 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); |
6030 | } |
6031 | - mutex_unlock(&port->mutex); |
6032 | + |
6033 | /* Now do the correct tty layer semantics */ |
6034 | retval = tty_port_block_til_ready(&port->port, tty, filp); |
6035 | - if (retval == 0) { |
6036 | - if (!first) |
6037 | - usb_serial_put(serial); |
6038 | - return 0; |
6039 | - } |
6040 | - mutex_lock(&port->mutex); |
6041 | - if (first == 0) |
6042 | - goto bailout_mutex_unlock; |
6043 | - /* Undo the initial port actions */ |
6044 | - mutex_lock(&serial->disc_mutex); |
6045 | -bailout_interface_put: |
6046 | - usb_autopm_put_interface(serial->interface); |
6047 | -bailout_module_put: |
6048 | - mutex_unlock(&serial->disc_mutex); |
6049 | - module_put(serial->type->driver.owner); |
6050 | -bailout_mutex_unlock: |
6051 | - port->port.count = 0; |
6052 | - tty->driver_data = NULL; |
6053 | - tty_port_tty_set(&port->port, NULL); |
6054 | - mutex_unlock(&port->mutex); |
6055 | -bailout_port_put: |
6056 | - put_device(&port->dev); |
6057 | -bailout_serial_put: |
6058 | - usb_serial_put(serial); |
6059 | return retval; |
6060 | } |
6061 | |
6062 | /** |
6063 | - * serial_do_down - shut down hardware |
6064 | - * @port: port to shut down |
6065 | - * |
6066 | - * Shut down a USB port unless it is the console. We never shut down the |
6067 | - * console hardware as it will always be in use. |
6068 | + * serial_down - shut down hardware |
6069 | + * @port: port to shut down |
6070 | * |
6071 | - * Don't free any resources at this point |
6072 | + * Shut down a USB serial port unless it is the console. We never |
6073 | + * shut down the console hardware as it will always be in use. |
6074 | */ |
6075 | -static void serial_do_down(struct usb_serial_port *port) |
6076 | +static void serial_down(struct usb_serial_port *port) |
6077 | { |
6078 | struct usb_serial_driver *drv = port->serial->type; |
6079 | struct usb_serial *serial; |
6080 | struct module *owner; |
6081 | |
6082 | - /* The console is magical, do not hang up the console hardware |
6083 | - or there will be tears */ |
6084 | + /* |
6085 | + * The console is magical. Do not hang up the console hardware |
6086 | + * or there will be tears. |
6087 | + */ |
6088 | if (port->console) |
6089 | return; |
6090 | |
6091 | + /* Don't call the close method if the hardware hasn't been |
6092 | + * initialized. |
6093 | + */ |
6094 | + if (!test_and_clear_bit(ASYNCB_INITIALIZED, &port->port.flags)) |
6095 | + return; |
6096 | + |
6097 | mutex_lock(&port->mutex); |
6098 | serial = port->serial; |
6099 | owner = serial->type->driver.owner; |
6100 | @@ -310,79 +318,69 @@ static void serial_do_down(struct usb_serial_port *port) |
6101 | mutex_unlock(&port->mutex); |
6102 | } |
6103 | |
6104 | -/** |
6105 | - * serial_do_free - free resources post close/hangup |
6106 | - * @port: port to free up |
6107 | - * |
6108 | - * Do the resource freeing and refcount dropping for the port. We must |
6109 | - * be careful about ordering and we must avoid freeing up the console. |
6110 | - */ |
6111 | - |
6112 | -static void serial_do_free(struct usb_serial_port *port) |
6113 | +static void serial_hangup(struct tty_struct *tty) |
6114 | { |
6115 | - struct usb_serial *serial; |
6116 | - struct module *owner; |
6117 | + struct usb_serial_port *port = tty->driver_data; |
6118 | |
6119 | - /* The console is magical, do not hang up the console hardware |
6120 | - or there will be tears */ |
6121 | - if (port->console) |
6122 | - return; |
6123 | + dbg("%s - port %d", __func__, port->number); |
6124 | |
6125 | - serial = port->serial; |
6126 | - owner = serial->type->driver.owner; |
6127 | - put_device(&port->dev); |
6128 | - /* Mustn't dereference port any more */ |
6129 | - mutex_lock(&serial->disc_mutex); |
6130 | - if (!serial->disconnected) |
6131 | - usb_autopm_put_interface(serial->interface); |
6132 | - mutex_unlock(&serial->disc_mutex); |
6133 | - usb_serial_put(serial); |
6134 | - /* Mustn't dereference serial any more */ |
6135 | - module_put(owner); |
6136 | + serial_down(port); |
6137 | + tty_port_hangup(&port->port); |
6138 | } |
6139 | |
6140 | static void serial_close(struct tty_struct *tty, struct file *filp) |
6141 | { |
6142 | struct usb_serial_port *port = tty->driver_data; |
6143 | |
6144 | - if (!port) |
6145 | - return; |
6146 | - |
6147 | dbg("%s - port %d", __func__, port->number); |
6148 | |
6149 | - /* FIXME: |
6150 | - This leaves a very narrow race. Really we should do the |
6151 | - serial_do_free() on tty->shutdown(), but tty->shutdown can |
6152 | - be called from IRQ context and serial_do_free can sleep. |
6153 | - |
6154 | - The right fix is probably to make the tty free (which is rare) |
6155 | - and thus tty->shutdown() occur via a work queue and simplify all |
6156 | - the drivers that use it. |
6157 | - */ |
6158 | - if (tty_hung_up_p(filp)) { |
6159 | - /* serial_hangup already called serial_down at this point. |
6160 | - Another user may have already reopened the port but |
6161 | - serial_do_free is refcounted */ |
6162 | - serial_do_free(port); |
6163 | + if (tty_hung_up_p(filp)) |
6164 | return; |
6165 | - } |
6166 | - |
6167 | if (tty_port_close_start(&port->port, tty, filp) == 0) |
6168 | return; |
6169 | - |
6170 | - serial_do_down(port); |
6171 | + serial_down(port); |
6172 | tty_port_close_end(&port->port, tty); |
6173 | tty_port_tty_set(&port->port, NULL); |
6174 | - serial_do_free(port); |
6175 | } |
6176 | |
6177 | -static void serial_hangup(struct tty_struct *tty) |
6178 | +/** |
6179 | + * serial_release - free resources post close/hangup |
6180 | + * @port: port to free up |
6181 | + * |
6182 | + * Do the resource freeing and refcount dropping for the port. |
6183 | + * Avoid freeing the console. |
6184 | + * |
6185 | + * Called when the last tty kref is dropped. |
6186 | + */ |
6187 | +static void serial_release(struct tty_struct *tty) |
6188 | { |
6189 | struct usb_serial_port *port = tty->driver_data; |
6190 | - serial_do_down(port); |
6191 | - tty_port_hangup(&port->port); |
6192 | - /* We must not free port yet - the USB serial layer depends on it's |
6193 | - continued existence */ |
6194 | + struct usb_serial *serial; |
6195 | + struct module *owner; |
6196 | + |
6197 | + /* The console is magical. Do not hang up the console hardware |
6198 | + * or there will be tears. |
6199 | + */ |
6200 | + if (port->console) |
6201 | + return; |
6202 | + |
6203 | + dbg("%s - port %d", __func__, port->number); |
6204 | + |
6205 | + /* Standard shutdown processing */ |
6206 | + tty_shutdown(tty); |
6207 | + |
6208 | + tty->driver_data = NULL; |
6209 | + |
6210 | + serial = port->serial; |
6211 | + owner = serial->type->driver.owner; |
6212 | + |
6213 | + mutex_lock(&serial->disc_mutex); |
6214 | + if (!serial->disconnected) |
6215 | + usb_autopm_put_interface(serial->interface); |
6216 | + mutex_unlock(&serial->disc_mutex); |
6217 | + |
6218 | + usb_serial_put(serial); |
6219 | + module_put(owner); |
6220 | } |
6221 | |
6222 | static int serial_write(struct tty_struct *tty, const unsigned char *buf, |
6223 | @@ -527,6 +525,7 @@ static int serial_proc_show(struct seq_file *m, void *v) |
6224 | |
6225 | seq_putc(m, '\n'); |
6226 | usb_serial_put(serial); |
6227 | + mutex_unlock(&serial->disc_mutex); |
6228 | } |
6229 | return 0; |
6230 | } |
6231 | @@ -596,14 +595,6 @@ static void usb_serial_port_work(struct work_struct *work) |
6232 | tty_kref_put(tty); |
6233 | } |
6234 | |
6235 | -static void port_release(struct device *dev) |
6236 | -{ |
6237 | - struct usb_serial_port *port = to_usb_serial_port(dev); |
6238 | - |
6239 | - dbg ("%s - %s", __func__, dev_name(dev)); |
6240 | - port_free(port); |
6241 | -} |
6242 | - |
6243 | static void kill_traffic(struct usb_serial_port *port) |
6244 | { |
6245 | usb_kill_urb(port->read_urb); |
6246 | @@ -623,8 +614,12 @@ static void kill_traffic(struct usb_serial_port *port) |
6247 | usb_kill_urb(port->interrupt_out_urb); |
6248 | } |
6249 | |
6250 | -static void port_free(struct usb_serial_port *port) |
6251 | +static void port_release(struct device *dev) |
6252 | { |
6253 | + struct usb_serial_port *port = to_usb_serial_port(dev); |
6254 | + |
6255 | + dbg ("%s - %s", __func__, dev_name(dev)); |
6256 | + |
6257 | /* |
6258 | * Stop all the traffic before cancelling the work, so that |
6259 | * nobody will restart it by calling usb_serial_port_softint. |
6260 | @@ -935,6 +930,11 @@ int usb_serial_probe(struct usb_interface *interface, |
6261 | mutex_init(&port->mutex); |
6262 | INIT_WORK(&port->work, usb_serial_port_work); |
6263 | serial->port[i] = port; |
6264 | + port->dev.parent = &interface->dev; |
6265 | + port->dev.driver = NULL; |
6266 | + port->dev.bus = &usb_serial_bus_type; |
6267 | + port->dev.release = &port_release; |
6268 | + device_initialize(&port->dev); |
6269 | } |
6270 | |
6271 | /* set up the endpoint information */ |
6272 | @@ -1077,15 +1077,10 @@ int usb_serial_probe(struct usb_interface *interface, |
6273 | /* register all of the individual ports with the driver core */ |
6274 | for (i = 0; i < num_ports; ++i) { |
6275 | port = serial->port[i]; |
6276 | - port->dev.parent = &interface->dev; |
6277 | - port->dev.driver = NULL; |
6278 | - port->dev.bus = &usb_serial_bus_type; |
6279 | - port->dev.release = &port_release; |
6280 | - |
6281 | dev_set_name(&port->dev, "ttyUSB%d", port->number); |
6282 | dbg ("%s - registering %s", __func__, dev_name(&port->dev)); |
6283 | port->dev_state = PORT_REGISTERING; |
6284 | - retval = device_register(&port->dev); |
6285 | + retval = device_add(&port->dev); |
6286 | if (retval) { |
6287 | dev_err(&port->dev, "Error registering port device, " |
6288 | "continuing\n"); |
6289 | @@ -1103,39 +1098,7 @@ exit: |
6290 | return 0; |
6291 | |
6292 | probe_error: |
6293 | - for (i = 0; i < num_bulk_in; ++i) { |
6294 | - port = serial->port[i]; |
6295 | - if (!port) |
6296 | - continue; |
6297 | - usb_free_urb(port->read_urb); |
6298 | - kfree(port->bulk_in_buffer); |
6299 | - } |
6300 | - for (i = 0; i < num_bulk_out; ++i) { |
6301 | - port = serial->port[i]; |
6302 | - if (!port) |
6303 | - continue; |
6304 | - usb_free_urb(port->write_urb); |
6305 | - kfree(port->bulk_out_buffer); |
6306 | - } |
6307 | - for (i = 0; i < num_interrupt_in; ++i) { |
6308 | - port = serial->port[i]; |
6309 | - if (!port) |
6310 | - continue; |
6311 | - usb_free_urb(port->interrupt_in_urb); |
6312 | - kfree(port->interrupt_in_buffer); |
6313 | - } |
6314 | - for (i = 0; i < num_interrupt_out; ++i) { |
6315 | - port = serial->port[i]; |
6316 | - if (!port) |
6317 | - continue; |
6318 | - usb_free_urb(port->interrupt_out_urb); |
6319 | - kfree(port->interrupt_out_buffer); |
6320 | - } |
6321 | - |
6322 | - /* free up any memory that we allocated */ |
6323 | - for (i = 0; i < serial->num_port_pointers; ++i) |
6324 | - kfree(serial->port[i]); |
6325 | - kfree(serial); |
6326 | + usb_serial_put(serial); |
6327 | return -EIO; |
6328 | } |
6329 | EXPORT_SYMBOL_GPL(usb_serial_probe); |
6330 | @@ -1161,10 +1124,7 @@ void usb_serial_disconnect(struct usb_interface *interface) |
6331 | if (port) { |
6332 | struct tty_struct *tty = tty_port_tty_get(&port->port); |
6333 | if (tty) { |
6334 | - /* The hangup will occur asynchronously but |
6335 | - the object refcounts will sort out all the |
6336 | - cleanup */ |
6337 | - tty_hangup(tty); |
6338 | + tty_vhangup(tty); |
6339 | tty_kref_put(tty); |
6340 | } |
6341 | kill_traffic(port); |
6342 | @@ -1189,8 +1149,7 @@ void usb_serial_disconnect(struct usb_interface *interface) |
6343 | } |
6344 | serial->type->disconnect(serial); |
6345 | |
6346 | - /* let the last holder of this object |
6347 | - * cause it to be cleaned up */ |
6348 | + /* let the last holder of this object cause it to be cleaned up */ |
6349 | usb_serial_put(serial); |
6350 | dev_info(dev, "device disconnected\n"); |
6351 | } |
6352 | @@ -1246,6 +1205,8 @@ static const struct tty_operations serial_ops = { |
6353 | .chars_in_buffer = serial_chars_in_buffer, |
6354 | .tiocmget = serial_tiocmget, |
6355 | .tiocmset = serial_tiocmset, |
6356 | + .shutdown = serial_release, |
6357 | + .install = serial_install, |
6358 | .proc_fops = &serial_proc_fops, |
6359 | }; |
6360 | |
6361 | diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c |
6362 | index 8d126dd..f7232b1 100644 |
6363 | --- a/drivers/usb/serial/whiteheat.c |
6364 | +++ b/drivers/usb/serial/whiteheat.c |
6365 | @@ -259,7 +259,7 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, |
6366 | __u8 *data, __u8 datasize); |
6367 | static int firm_open(struct usb_serial_port *port); |
6368 | static int firm_close(struct usb_serial_port *port); |
6369 | -static int firm_setup_port(struct tty_struct *tty); |
6370 | +static void firm_setup_port(struct tty_struct *tty); |
6371 | static int firm_set_rts(struct usb_serial_port *port, __u8 onoff); |
6372 | static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff); |
6373 | static int firm_set_break(struct usb_serial_port *port, __u8 onoff); |
6374 | @@ -1211,7 +1211,7 @@ static int firm_close(struct usb_serial_port *port) |
6375 | } |
6376 | |
6377 | |
6378 | -static int firm_setup_port(struct tty_struct *tty) |
6379 | +static void firm_setup_port(struct tty_struct *tty) |
6380 | { |
6381 | struct usb_serial_port *port = tty->driver_data; |
6382 | struct whiteheat_port_settings port_settings; |
6383 | @@ -1286,7 +1286,7 @@ static int firm_setup_port(struct tty_struct *tty) |
6384 | port_settings.lloop = 0; |
6385 | |
6386 | /* now send the message to the device */ |
6387 | - return firm_send_command(port, WHITEHEAT_SETUP_PORT, |
6388 | + firm_send_command(port, WHITEHEAT_SETUP_PORT, |
6389 | (__u8 *)&port_settings, sizeof(port_settings)); |
6390 | } |
6391 | |
6392 | diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c |
6393 | index ec17c96..105d900 100644 |
6394 | --- a/drivers/usb/storage/initializers.c |
6395 | +++ b/drivers/usb/storage/initializers.c |
6396 | @@ -102,5 +102,5 @@ int usb_stor_huawei_e220_init(struct us_data *us) |
6397 | USB_TYPE_STANDARD | USB_RECIP_DEVICE, |
6398 | 0x01, 0x0, NULL, 0x0, 1000); |
6399 | US_DEBUGP("Huawei mode set result is %d\n", result); |
6400 | - return (result ? 0 : -ENODEV); |
6401 | + return 0; |
6402 | } |
6403 | diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c |
6404 | index 380233b..80e65f2 100644 |
6405 | --- a/drivers/usb/storage/onetouch.c |
6406 | +++ b/drivers/usb/storage/onetouch.c |
6407 | @@ -163,7 +163,7 @@ static void usb_onetouch_pm_hook(struct us_data *us, int action) |
6408 | usb_kill_urb(onetouch->irq); |
6409 | break; |
6410 | case US_RESUME: |
6411 | - if (usb_submit_urb(onetouch->irq, GFP_KERNEL) != 0) |
6412 | + if (usb_submit_urb(onetouch->irq, GFP_NOIO) != 0) |
6413 | dev_err(&onetouch->irq->dev->dev, |
6414 | "usb_submit_urb failed\n"); |
6415 | break; |
6416 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c |
6417 | index 3a44695..29ff5ea 100644 |
6418 | --- a/drivers/video/console/fbcon.c |
6419 | +++ b/drivers/video/console/fbcon.c |
6420 | @@ -114,6 +114,7 @@ static int last_fb_vc = MAX_NR_CONSOLES - 1; |
6421 | static int fbcon_is_default = 1; |
6422 | static int fbcon_has_exited; |
6423 | static int primary_device = -1; |
6424 | +static int fbcon_has_console_bind; |
6425 | |
6426 | #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY |
6427 | static int map_override; |
6428 | @@ -544,6 +545,8 @@ static int fbcon_takeover(int show_logo) |
6429 | con2fb_map[i] = -1; |
6430 | } |
6431 | info_idx = -1; |
6432 | + } else { |
6433 | + fbcon_has_console_bind = 1; |
6434 | } |
6435 | |
6436 | return err; |
6437 | @@ -2923,6 +2926,10 @@ static int fbcon_unbind(void) |
6438 | |
6439 | ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc, |
6440 | fbcon_is_default); |
6441 | + |
6442 | + if (!ret) |
6443 | + fbcon_has_console_bind = 0; |
6444 | + |
6445 | return ret; |
6446 | } |
6447 | #else |
6448 | @@ -2936,6 +2943,9 @@ static int fbcon_fb_unbind(int idx) |
6449 | { |
6450 | int i, new_idx = -1, ret = 0; |
6451 | |
6452 | + if (!fbcon_has_console_bind) |
6453 | + return 0; |
6454 | + |
6455 | for (i = first_fb_vc; i <= last_fb_vc; i++) { |
6456 | if (con2fb_map[i] != idx && |
6457 | con2fb_map[i] != -1) { |
6458 | diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c |
6459 | index 5a72083..adf9632 100644 |
6460 | --- a/drivers/video/s3c-fb.c |
6461 | +++ b/drivers/video/s3c-fb.c |
6462 | @@ -1036,7 +1036,7 @@ static int s3c_fb_resume(struct platform_device *pdev) |
6463 | |
6464 | static struct platform_driver s3c_fb_driver = { |
6465 | .probe = s3c_fb_probe, |
6466 | - .remove = s3c_fb_remove, |
6467 | + .remove = __devexit_p(s3c_fb_remove), |
6468 | .suspend = s3c_fb_suspend, |
6469 | .resume = s3c_fb_resume, |
6470 | .driver = { |
6471 | diff --git a/drivers/video/sis/vstruct.h b/drivers/video/sis/vstruct.h |
6472 | index 705c853..bef4aae 100644 |
6473 | --- a/drivers/video/sis/vstruct.h |
6474 | +++ b/drivers/video/sis/vstruct.h |
6475 | @@ -342,7 +342,7 @@ struct SiS_Private |
6476 | unsigned short SiS_RY4COE; |
6477 | unsigned short SiS_LCDHDES; |
6478 | unsigned short SiS_LCDVDES; |
6479 | - unsigned short SiS_DDC_Port; |
6480 | + SISIOADDRESS SiS_DDC_Port; |
6481 | unsigned short SiS_DDC_Index; |
6482 | unsigned short SiS_DDC_Data; |
6483 | unsigned short SiS_DDC_NData; |
6484 | diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile |
6485 | index ec2a39b..7c28434 100644 |
6486 | --- a/drivers/xen/Makefile |
6487 | +++ b/drivers/xen/Makefile |
6488 | @@ -1,6 +1,9 @@ |
6489 | obj-y += grant-table.o features.o events.o manage.o |
6490 | obj-y += xenbus/ |
6491 | |
6492 | +nostackp := $(call cc-option, -fno-stack-protector) |
6493 | +CFLAGS_features.o := $(nostackp) |
6494 | + |
6495 | obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o |
6496 | obj-$(CONFIG_XEN_XENCOMM) += xencomm.o |
6497 | obj-$(CONFIG_XEN_BALLOON) += balloon.o |
6498 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
6499 | index 6084d63..3cfec69 100644 |
6500 | --- a/fs/cifs/cifsglob.h |
6501 | +++ b/fs/cifs/cifsglob.h |
6502 | @@ -572,9 +572,9 @@ require use of the stronger protocol */ |
6503 | #define CIFSSEC_MUST_LANMAN 0x10010 |
6504 | #define CIFSSEC_MUST_PLNTXT 0x20020 |
6505 | #ifdef CONFIG_CIFS_UPCALL |
6506 | -#define CIFSSEC_MASK 0xAF0AF /* allows weak security but also krb5 */ |
6507 | +#define CIFSSEC_MASK 0xBF0BF /* allows weak security but also krb5 */ |
6508 | #else |
6509 | -#define CIFSSEC_MASK 0xA70A7 /* current flags supported if weak */ |
6510 | +#define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */ |
6511 | #endif /* UPCALL */ |
6512 | #else /* do not allow weak pw hash */ |
6513 | #ifdef CONFIG_CIFS_UPCALL |
6514 | diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c |
6515 | index b91851f..f0b53df 100644 |
6516 | --- a/fs/ecryptfs/crypto.c |
6517 | +++ b/fs/ecryptfs/crypto.c |
6518 | @@ -797,6 +797,7 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) |
6519 | kfree(full_alg_name); |
6520 | if (IS_ERR(crypt_stat->tfm)) { |
6521 | rc = PTR_ERR(crypt_stat->tfm); |
6522 | + crypt_stat->tfm = NULL; |
6523 | ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " |
6524 | "Error initializing cipher [%s]\n", |
6525 | crypt_stat->cipher); |
6526 | @@ -1702,7 +1703,7 @@ ecryptfs_encrypt_filename(struct ecryptfs_filename *filename, |
6527 | } else { |
6528 | printk(KERN_ERR "%s: No support for requested filename " |
6529 | "encryption method in this release\n", __func__); |
6530 | - rc = -ENOTSUPP; |
6531 | + rc = -EOPNOTSUPP; |
6532 | goto out; |
6533 | } |
6534 | out: |
6535 | @@ -2166,7 +2167,7 @@ int ecryptfs_encrypt_and_encode_filename( |
6536 | (*encoded_name)[(*encoded_name_size)] = '\0'; |
6537 | (*encoded_name_size)++; |
6538 | } else { |
6539 | - rc = -ENOTSUPP; |
6540 | + rc = -EOPNOTSUPP; |
6541 | } |
6542 | if (rc) { |
6543 | printk(KERN_ERR "%s: Error attempting to encode " |
6544 | diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c |
6545 | index 2f0945d..056fed6 100644 |
6546 | --- a/fs/ecryptfs/inode.c |
6547 | +++ b/fs/ecryptfs/inode.c |
6548 | @@ -476,6 +476,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) |
6549 | struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir); |
6550 | struct dentry *lower_dir_dentry; |
6551 | |
6552 | + dget(lower_dentry); |
6553 | lower_dir_dentry = lock_parent(lower_dentry); |
6554 | rc = vfs_unlink(lower_dir_inode, lower_dentry); |
6555 | if (rc) { |
6556 | @@ -489,6 +490,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) |
6557 | d_drop(dentry); |
6558 | out_unlock: |
6559 | unlock_dir(lower_dir_dentry); |
6560 | + dput(lower_dentry); |
6561 | return rc; |
6562 | } |
6563 | |
6564 | diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c |
6565 | index 259525c..c77438f 100644 |
6566 | --- a/fs/ecryptfs/keystore.c |
6567 | +++ b/fs/ecryptfs/keystore.c |
6568 | @@ -416,7 +416,9 @@ ecryptfs_find_global_auth_tok_for_sig( |
6569 | &mount_crypt_stat->global_auth_tok_list, |
6570 | mount_crypt_stat_list) { |
6571 | if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) { |
6572 | - (*global_auth_tok) = walker; |
6573 | + rc = key_validate(walker->global_auth_tok_key); |
6574 | + if (!rc) |
6575 | + (*global_auth_tok) = walker; |
6576 | goto out; |
6577 | } |
6578 | } |
6579 | @@ -612,7 +614,12 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, |
6580 | } |
6581 | /* TODO: Support other key modules than passphrase for |
6582 | * filename encryption */ |
6583 | - BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); |
6584 | + if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { |
6585 | + rc = -EOPNOTSUPP; |
6586 | + printk(KERN_INFO "%s: Filename encryption only supports " |
6587 | + "password tokens\n", __func__); |
6588 | + goto out_free_unlock; |
6589 | + } |
6590 | sg_init_one( |
6591 | &s->hash_sg, |
6592 | (u8 *)s->auth_tok->token.password.session_key_encryption_key, |
6593 | @@ -910,7 +917,12 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, |
6594 | } |
6595 | /* TODO: Support other key modules than passphrase for |
6596 | * filename encryption */ |
6597 | - BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); |
6598 | + if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) { |
6599 | + rc = -EOPNOTSUPP; |
6600 | + printk(KERN_INFO "%s: Filename encryption only supports " |
6601 | + "password tokens\n", __func__); |
6602 | + goto out_free_unlock; |
6603 | + } |
6604 | rc = crypto_blkcipher_setkey( |
6605 | s->desc.tfm, |
6606 | s->auth_tok->token.password.session_key_encryption_key, |
6607 | @@ -1316,8 +1328,10 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat, |
6608 | rc = -EINVAL; |
6609 | goto out_free; |
6610 | } |
6611 | - ecryptfs_cipher_code_to_string(crypt_stat->cipher, |
6612 | - (u16)data[(*packet_size)]); |
6613 | + rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher, |
6614 | + (u16)data[(*packet_size)]); |
6615 | + if (rc) |
6616 | + goto out_free; |
6617 | /* A little extra work to differentiate among the AES key |
6618 | * sizes; see RFC2440 */ |
6619 | switch(data[(*packet_size)++]) { |
6620 | @@ -1328,7 +1342,9 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat, |
6621 | crypt_stat->key_size = |
6622 | (*new_auth_tok)->session_key.encrypted_key_size; |
6623 | } |
6624 | - ecryptfs_init_crypt_ctx(crypt_stat); |
6625 | + rc = ecryptfs_init_crypt_ctx(crypt_stat); |
6626 | + if (rc) |
6627 | + goto out_free; |
6628 | if (unlikely(data[(*packet_size)++] != 0x03)) { |
6629 | printk(KERN_WARNING "Only S2K ID 3 is currently supported\n"); |
6630 | rc = -ENOSYS; |
6631 | diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c |
6632 | index c6d7a4d..e14cf7e 100644 |
6633 | --- a/fs/ecryptfs/kthread.c |
6634 | +++ b/fs/ecryptfs/kthread.c |
6635 | @@ -136,6 +136,7 @@ int ecryptfs_privileged_open(struct file **lower_file, |
6636 | const struct cred *cred) |
6637 | { |
6638 | struct ecryptfs_open_req *req; |
6639 | + int flags = O_LARGEFILE; |
6640 | int rc = 0; |
6641 | |
6642 | /* Corresponding dput() and mntput() are done when the |
6643 | @@ -143,10 +144,14 @@ int ecryptfs_privileged_open(struct file **lower_file, |
6644 | * destroyed. */ |
6645 | dget(lower_dentry); |
6646 | mntget(lower_mnt); |
6647 | - (*lower_file) = dentry_open(lower_dentry, lower_mnt, |
6648 | - (O_RDWR | O_LARGEFILE), cred); |
6649 | + flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; |
6650 | + (*lower_file) = dentry_open(lower_dentry, lower_mnt, flags, cred); |
6651 | if (!IS_ERR(*lower_file)) |
6652 | goto out; |
6653 | + if (flags & O_RDONLY) { |
6654 | + rc = PTR_ERR((*lower_file)); |
6655 | + goto out; |
6656 | + } |
6657 | req = kmem_cache_alloc(ecryptfs_open_req_cache, GFP_KERNEL); |
6658 | if (!req) { |
6659 | rc = -ENOMEM; |
6660 | @@ -180,21 +185,8 @@ int ecryptfs_privileged_open(struct file **lower_file, |
6661 | __func__); |
6662 | goto out_unlock; |
6663 | } |
6664 | - if (IS_ERR(*req->lower_file)) { |
6665 | + if (IS_ERR(*req->lower_file)) |
6666 | rc = PTR_ERR(*req->lower_file); |
6667 | - dget(lower_dentry); |
6668 | - mntget(lower_mnt); |
6669 | - (*lower_file) = dentry_open(lower_dentry, lower_mnt, |
6670 | - (O_RDONLY | O_LARGEFILE), cred); |
6671 | - if (IS_ERR(*lower_file)) { |
6672 | - rc = PTR_ERR(*req->lower_file); |
6673 | - (*lower_file) = NULL; |
6674 | - printk(KERN_WARNING "%s: Error attempting privileged " |
6675 | - "open of lower file with either RW or RO " |
6676 | - "perms; rc = [%d]. Giving up.\n", |
6677 | - __func__, rc); |
6678 | - } |
6679 | - } |
6680 | out_unlock: |
6681 | mutex_unlock(&req->mux); |
6682 | out_free: |
6683 | diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c |
6684 | index 9f0aa98..101fe4c 100644 |
6685 | --- a/fs/ecryptfs/main.c |
6686 | +++ b/fs/ecryptfs/main.c |
6687 | @@ -129,11 +129,10 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry) |
6688 | lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry); |
6689 | rc = ecryptfs_privileged_open(&inode_info->lower_file, |
6690 | lower_dentry, lower_mnt, cred); |
6691 | - if (rc || IS_ERR(inode_info->lower_file)) { |
6692 | + if (rc) { |
6693 | printk(KERN_ERR "Error opening lower persistent file " |
6694 | "for lower_dentry [0x%p] and lower_mnt [0x%p]; " |
6695 | "rc = [%d]\n", lower_dentry, lower_mnt, rc); |
6696 | - rc = PTR_ERR(inode_info->lower_file); |
6697 | inode_info->lower_file = NULL; |
6698 | } |
6699 | } |
6700 | diff --git a/fs/inode.c b/fs/inode.c |
6701 | index ae7b67e..1a959c0 100644 |
6702 | --- a/fs/inode.c |
6703 | +++ b/fs/inode.c |
6704 | @@ -697,13 +697,15 @@ void unlock_new_inode(struct inode *inode) |
6705 | } |
6706 | #endif |
6707 | /* |
6708 | - * This is special! We do not need the spinlock |
6709 | - * when clearing I_LOCK, because we're guaranteed |
6710 | - * that nobody else tries to do anything about the |
6711 | - * state of the inode when it is locked, as we |
6712 | - * just created it (so there can be no old holders |
6713 | - * that haven't tested I_LOCK). |
6714 | + * This is special! We do not need the spinlock when clearing I_LOCK, |
6715 | + * because we're guaranteed that nobody else tries to do anything about |
6716 | + * the state of the inode when it is locked, as we just created it (so |
6717 | + * there can be no old holders that haven't tested I_LOCK). |
6718 | + * However we must emit the memory barrier so that other CPUs reliably |
6719 | + * see the clearing of I_LOCK after the other inode initialisation has |
6720 | + * completed. |
6721 | */ |
6722 | + smp_mb(); |
6723 | WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); |
6724 | inode->i_state &= ~(I_LOCK|I_NEW); |
6725 | wake_up_inode(inode); |
6726 | diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c |
6727 | index 3fd23f7..bf9b470 100644 |
6728 | --- a/fs/nfsd/nfs4callback.c |
6729 | +++ b/fs/nfsd/nfs4callback.c |
6730 | @@ -444,6 +444,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb) |
6731 | struct auth_cred acred = { |
6732 | .machine_cred = 1 |
6733 | }; |
6734 | + struct rpc_auth *auth = cb->cb_client->cl_auth; |
6735 | |
6736 | /* |
6737 | * Note in the gss case this doesn't actually have to wait for a |
6738 | @@ -451,8 +452,7 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_cb_conn *cb) |
6739 | * non-uptodate cred which the rpc state machine will fill in with |
6740 | * a refresh_upcall later. |
6741 | */ |
6742 | - return rpcauth_lookup_credcache(cb->cb_client->cl_auth, &acred, |
6743 | - RPCAUTH_LOOKUP_NEW); |
6744 | + return auth->au_ops->lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW); |
6745 | } |
6746 | |
6747 | void do_probe_callback(struct nfs4_client *clp) |
6748 | diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c |
6749 | index c668bca..5be2c8b 100644 |
6750 | --- a/fs/nilfs2/btnode.c |
6751 | +++ b/fs/nilfs2/btnode.c |
6752 | @@ -36,6 +36,7 @@ |
6753 | |
6754 | void nilfs_btnode_cache_init_once(struct address_space *btnc) |
6755 | { |
6756 | + memset(btnc, 0, sizeof(*btnc)); |
6757 | INIT_RADIX_TREE(&btnc->page_tree, GFP_ATOMIC); |
6758 | spin_lock_init(&btnc->tree_lock); |
6759 | INIT_LIST_HEAD(&btnc->private_list); |
6760 | diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c |
6761 | index 59b43a0..5fd7d2b 100644 |
6762 | --- a/fs/proc/kcore.c |
6763 | +++ b/fs/proc/kcore.c |
6764 | @@ -361,7 +361,13 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) |
6765 | /* don't dump ioremap'd stuff! (TA) */ |
6766 | if (m->flags & VM_IOREMAP) |
6767 | continue; |
6768 | - memcpy(elf_buf + (vmstart - start), |
6769 | + /* |
6770 | + * we may access memory holes, then use |
6771 | + * ex_table. checking return value just for |
6772 | + * avoid warnings. |
6773 | + */ |
6774 | + vmsize = __copy_from_user_inatomic( |
6775 | + elf_buf + (vmstart - start), |
6776 | (char *)vmstart, vmsize); |
6777 | } |
6778 | read_unlock(&vmlist_lock); |
6779 | diff --git a/fs/proc/uptime.c b/fs/proc/uptime.c |
6780 | index 0c10a0b..766b1d4 100644 |
6781 | --- a/fs/proc/uptime.c |
6782 | +++ b/fs/proc/uptime.c |
6783 | @@ -4,13 +4,18 @@ |
6784 | #include <linux/sched.h> |
6785 | #include <linux/seq_file.h> |
6786 | #include <linux/time.h> |
6787 | +#include <linux/kernel_stat.h> |
6788 | #include <asm/cputime.h> |
6789 | |
6790 | static int uptime_proc_show(struct seq_file *m, void *v) |
6791 | { |
6792 | struct timespec uptime; |
6793 | struct timespec idle; |
6794 | - cputime_t idletime = cputime_add(init_task.utime, init_task.stime); |
6795 | + int i; |
6796 | + cputime_t idletime = cputime_zero; |
6797 | + |
6798 | + for_each_possible_cpu(i) |
6799 | + idletime = cputime64_add(idletime, kstat_cpu(i).cpustat.idle); |
6800 | |
6801 | do_posix_clock_monotonic_gettime(&uptime); |
6802 | monotonic_to_bootbased(&uptime); |
6803 | diff --git a/include/linux/tty.h b/include/linux/tty.h |
6804 | index e8c6c91..b982a17 100644 |
6805 | --- a/include/linux/tty.h |
6806 | +++ b/include/linux/tty.h |
6807 | @@ -185,7 +185,12 @@ struct tty_port; |
6808 | struct tty_port_operations { |
6809 | /* Return 1 if the carrier is raised */ |
6810 | int (*carrier_raised)(struct tty_port *port); |
6811 | + /* Control the DTR line */ |
6812 | void (*dtr_rts)(struct tty_port *port, int raise); |
6813 | + /* Called when the last close completes or a hangup finishes |
6814 | + IFF the port was initialized. Do not use to free resources */ |
6815 | + void (*shutdown)(struct tty_port *port); |
6816 | + void (*drop)(struct tty_port *port); |
6817 | }; |
6818 | |
6819 | struct tty_port { |
6820 | @@ -457,7 +462,8 @@ extern int tty_port_block_til_ready(struct tty_port *port, |
6821 | extern int tty_port_close_start(struct tty_port *port, |
6822 | struct tty_struct *tty, struct file *filp); |
6823 | extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); |
6824 | - |
6825 | +extern void tty_port_close(struct tty_port *port, |
6826 | + struct tty_struct *tty, struct file *filp); |
6827 | extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc); |
6828 | extern int tty_unregister_ldisc(int disc); |
6829 | extern int tty_set_ldisc(struct tty_struct *tty, int ldisc); |
6830 | diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h |
6831 | index 0ec50ba..73f121e 100644 |
6832 | --- a/include/linux/usb/serial.h |
6833 | +++ b/include/linux/usb/serial.h |
6834 | @@ -261,6 +261,9 @@ struct usb_serial_driver { |
6835 | be an attached tty at this point */ |
6836 | void (*dtr_rts)(struct usb_serial_port *port, int on); |
6837 | int (*carrier_raised)(struct usb_serial_port *port); |
6838 | + /* Called by the usb serial hooks to allow the user to rework the |
6839 | + termios state */ |
6840 | + void (*init_termios)(struct tty_struct *tty); |
6841 | /* USB events */ |
6842 | void (*read_int_callback)(struct urb *urb); |
6843 | void (*write_int_callback)(struct urb *urb); |
6844 | diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h |
6845 | index 9b4ac93..56677eb 100644 |
6846 | --- a/include/pcmcia/ss.h |
6847 | +++ b/include/pcmcia/ss.h |
6848 | @@ -279,7 +279,7 @@ extern struct pccard_resource_ops pccard_iodyn_ops; |
6849 | extern struct pccard_resource_ops pccard_nonstatic_ops; |
6850 | |
6851 | /* socket drivers are expected to use these callbacks in their .drv struct */ |
6852 | -extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state); |
6853 | +extern int pcmcia_socket_dev_suspend(struct device *dev); |
6854 | extern int pcmcia_socket_dev_resume(struct device *dev); |
6855 | |
6856 | /* socket drivers use this callback in their IRQ handler */ |
6857 | diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c |
6858 | index 3f49f53..b1dc468 100644 |
6859 | --- a/kernel/perf_counter.c |
6860 | +++ b/kernel/perf_counter.c |
6861 | @@ -4143,8 +4143,8 @@ done: |
6862 | static int perf_copy_attr(struct perf_counter_attr __user *uattr, |
6863 | struct perf_counter_attr *attr) |
6864 | { |
6865 | - int ret; |
6866 | u32 size; |
6867 | + int ret; |
6868 | |
6869 | if (!access_ok(VERIFY_WRITE, uattr, PERF_ATTR_SIZE_VER0)) |
6870 | return -EFAULT; |
6871 | @@ -4169,19 +4169,19 @@ static int perf_copy_attr(struct perf_counter_attr __user *uattr, |
6872 | |
6873 | /* |
6874 | * If we're handed a bigger struct than we know of, |
6875 | - * ensure all the unknown bits are 0. |
6876 | + * ensure all the unknown bits are 0 - i.e. new |
6877 | + * user-space does not rely on any kernel feature |
6878 | + * extensions we dont know about yet. |
6879 | */ |
6880 | if (size > sizeof(*attr)) { |
6881 | - unsigned long val; |
6882 | - unsigned long __user *addr; |
6883 | - unsigned long __user *end; |
6884 | + unsigned char __user *addr; |
6885 | + unsigned char __user *end; |
6886 | + unsigned char val; |
6887 | |
6888 | - addr = PTR_ALIGN((void __user *)uattr + sizeof(*attr), |
6889 | - sizeof(unsigned long)); |
6890 | - end = PTR_ALIGN((void __user *)uattr + size, |
6891 | - sizeof(unsigned long)); |
6892 | + addr = (void __user *)uattr + sizeof(*attr); |
6893 | + end = (void __user *)uattr + size; |
6894 | |
6895 | - for (; addr < end; addr += sizeof(unsigned long)) { |
6896 | + for (; addr < end; addr++) { |
6897 | ret = get_user(val, addr); |
6898 | if (ret) |
6899 | return ret; |
6900 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
6901 | index cafdcee..cae0337 100644 |
6902 | --- a/mm/hugetlb.c |
6903 | +++ b/mm/hugetlb.c |
6904 | @@ -1010,6 +1010,7 @@ int __weak alloc_bootmem_huge_page(struct hstate *h) |
6905 | NODE_DATA(h->hugetlb_next_nid), |
6906 | huge_page_size(h), huge_page_size(h), 0); |
6907 | |
6908 | + hstate_next_node(h); |
6909 | if (addr) { |
6910 | /* |
6911 | * Use the beginning of the huge page to store the |
6912 | @@ -1019,7 +1020,6 @@ int __weak alloc_bootmem_huge_page(struct hstate *h) |
6913 | m = addr; |
6914 | goto found; |
6915 | } |
6916 | - hstate_next_node(h); |
6917 | nr_nodes--; |
6918 | } |
6919 | return 0; |
6920 | diff --git a/mm/memory.c b/mm/memory.c |
6921 | index aede2ce..753b2e6 100644 |
6922 | --- a/mm/memory.c |
6923 | +++ b/mm/memory.c |
6924 | @@ -2638,7 +2638,8 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, |
6925 | goto oom_free_page; |
6926 | |
6927 | entry = mk_pte(page, vma->vm_page_prot); |
6928 | - entry = maybe_mkwrite(pte_mkdirty(entry), vma); |
6929 | + if (vma->vm_flags & VM_WRITE) |
6930 | + entry = pte_mkwrite(pte_mkdirty(entry)); |
6931 | |
6932 | page_table = pte_offset_map_lock(mm, pmd, address, &ptl); |
6933 | if (!pte_none(*page_table)) |
6934 | diff --git a/mm/mlock.c b/mm/mlock.c |
6935 | index 45eb650..e13918d 100644 |
6936 | --- a/mm/mlock.c |
6937 | +++ b/mm/mlock.c |
6938 | @@ -139,49 +139,36 @@ static void munlock_vma_page(struct page *page) |
6939 | } |
6940 | |
6941 | /** |
6942 | - * __mlock_vma_pages_range() - mlock/munlock a range of pages in the vma. |
6943 | + * __mlock_vma_pages_range() - mlock a range of pages in the vma. |
6944 | * @vma: target vma |
6945 | * @start: start address |
6946 | * @end: end address |
6947 | - * @mlock: 0 indicate munlock, otherwise mlock. |
6948 | * |
6949 | - * If @mlock == 0, unlock an mlocked range; |
6950 | - * else mlock the range of pages. This takes care of making the pages present , |
6951 | - * too. |
6952 | + * This takes care of making the pages present too. |
6953 | * |
6954 | * return 0 on success, negative error code on error. |
6955 | * |
6956 | * vma->vm_mm->mmap_sem must be held for at least read. |
6957 | */ |
6958 | static long __mlock_vma_pages_range(struct vm_area_struct *vma, |
6959 | - unsigned long start, unsigned long end, |
6960 | - int mlock) |
6961 | + unsigned long start, unsigned long end) |
6962 | { |
6963 | struct mm_struct *mm = vma->vm_mm; |
6964 | unsigned long addr = start; |
6965 | struct page *pages[16]; /* 16 gives a reasonable batch */ |
6966 | int nr_pages = (end - start) / PAGE_SIZE; |
6967 | int ret = 0; |
6968 | - int gup_flags = 0; |
6969 | + int gup_flags; |
6970 | |
6971 | VM_BUG_ON(start & ~PAGE_MASK); |
6972 | VM_BUG_ON(end & ~PAGE_MASK); |
6973 | VM_BUG_ON(start < vma->vm_start); |
6974 | VM_BUG_ON(end > vma->vm_end); |
6975 | - VM_BUG_ON((!rwsem_is_locked(&mm->mmap_sem)) && |
6976 | - (atomic_read(&mm->mm_users) != 0)); |
6977 | - |
6978 | - /* |
6979 | - * mlock: don't page populate if vma has PROT_NONE permission. |
6980 | - * munlock: always do munlock although the vma has PROT_NONE |
6981 | - * permission, or SIGKILL is pending. |
6982 | - */ |
6983 | - if (!mlock) |
6984 | - gup_flags |= GUP_FLAGS_IGNORE_VMA_PERMISSIONS | |
6985 | - GUP_FLAGS_IGNORE_SIGKILL; |
6986 | + VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem)); |
6987 | |
6988 | + gup_flags = 0; |
6989 | if (vma->vm_flags & VM_WRITE) |
6990 | - gup_flags |= GUP_FLAGS_WRITE; |
6991 | + gup_flags = GUP_FLAGS_WRITE; |
6992 | |
6993 | while (nr_pages > 0) { |
6994 | int i; |
6995 | @@ -201,19 +188,10 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, |
6996 | * This can happen for, e.g., VM_NONLINEAR regions before |
6997 | * a page has been allocated and mapped at a given offset, |
6998 | * or for addresses that map beyond end of a file. |
6999 | - * We'll mlock the the pages if/when they get faulted in. |
7000 | + * We'll mlock the pages if/when they get faulted in. |
7001 | */ |
7002 | if (ret < 0) |
7003 | break; |
7004 | - if (ret == 0) { |
7005 | - /* |
7006 | - * We know the vma is there, so the only time |
7007 | - * we cannot get a single page should be an |
7008 | - * error (ret < 0) case. |
7009 | - */ |
7010 | - WARN_ON(1); |
7011 | - break; |
7012 | - } |
7013 | |
7014 | lru_add_drain(); /* push cached pages to LRU */ |
7015 | |
7016 | @@ -224,28 +202,22 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, |
7017 | /* |
7018 | * Because we lock page here and migration is blocked |
7019 | * by the elevated reference, we need only check for |
7020 | - * page truncation (file-cache only). |
7021 | + * file-cache page truncation. This page->mapping |
7022 | + * check also neatly skips over the ZERO_PAGE(), |
7023 | + * though if that's common we'd prefer not to lock it. |
7024 | */ |
7025 | - if (page->mapping) { |
7026 | - if (mlock) |
7027 | - mlock_vma_page(page); |
7028 | - else |
7029 | - munlock_vma_page(page); |
7030 | - } |
7031 | + if (page->mapping) |
7032 | + mlock_vma_page(page); |
7033 | unlock_page(page); |
7034 | - put_page(page); /* ref from get_user_pages() */ |
7035 | - |
7036 | - /* |
7037 | - * here we assume that get_user_pages() has given us |
7038 | - * a list of virtually contiguous pages. |
7039 | - */ |
7040 | - addr += PAGE_SIZE; /* for next get_user_pages() */ |
7041 | - nr_pages--; |
7042 | + put_page(page); /* ref from get_user_pages() */ |
7043 | } |
7044 | + |
7045 | + addr += ret * PAGE_SIZE; |
7046 | + nr_pages -= ret; |
7047 | ret = 0; |
7048 | } |
7049 | |
7050 | - return ret; /* count entire vma as locked_vm */ |
7051 | + return ret; /* 0 or negative error code */ |
7052 | } |
7053 | |
7054 | /* |
7055 | @@ -289,7 +261,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma, |
7056 | is_vm_hugetlb_page(vma) || |
7057 | vma == get_gate_vma(current))) { |
7058 | |
7059 | - __mlock_vma_pages_range(vma, start, end, 1); |
7060 | + __mlock_vma_pages_range(vma, start, end); |
7061 | |
7062 | /* Hide errors from mmap() and other callers */ |
7063 | return 0; |
7064 | @@ -310,7 +282,6 @@ no_mlock: |
7065 | return nr_pages; /* error or pages NOT mlocked */ |
7066 | } |
7067 | |
7068 | - |
7069 | /* |
7070 | * munlock_vma_pages_range() - munlock all pages in the vma range.' |
7071 | * @vma - vma containing range to be munlock()ed. |
7072 | @@ -330,10 +301,24 @@ no_mlock: |
7073 | * free them. This will result in freeing mlocked pages. |
7074 | */ |
7075 | void munlock_vma_pages_range(struct vm_area_struct *vma, |
7076 | - unsigned long start, unsigned long end) |
7077 | + unsigned long start, unsigned long end) |
7078 | { |
7079 | + unsigned long addr; |
7080 | + |
7081 | + lru_add_drain(); |
7082 | vma->vm_flags &= ~VM_LOCKED; |
7083 | - __mlock_vma_pages_range(vma, start, end, 0); |
7084 | + |
7085 | + for (addr = start; addr < end; addr += PAGE_SIZE) { |
7086 | + struct page *page = follow_page(vma, addr, FOLL_GET); |
7087 | + if (page) { |
7088 | + lock_page(page); |
7089 | + if (page->mapping) |
7090 | + munlock_vma_page(page); |
7091 | + unlock_page(page); |
7092 | + put_page(page); |
7093 | + } |
7094 | + cond_resched(); |
7095 | + } |
7096 | } |
7097 | |
7098 | /* |
7099 | @@ -400,18 +385,14 @@ success: |
7100 | * It's okay if try_to_unmap_one unmaps a page just after we |
7101 | * set VM_LOCKED, __mlock_vma_pages_range will bring it back. |
7102 | */ |
7103 | - vma->vm_flags = newflags; |
7104 | |
7105 | if (lock) { |
7106 | - ret = __mlock_vma_pages_range(vma, start, end, 1); |
7107 | - |
7108 | - if (ret > 0) { |
7109 | - mm->locked_vm -= ret; |
7110 | - ret = 0; |
7111 | - } else |
7112 | - ret = __mlock_posix_error_return(ret); /* translate if needed */ |
7113 | + vma->vm_flags = newflags; |
7114 | + ret = __mlock_vma_pages_range(vma, start, end); |
7115 | + if (ret < 0) |
7116 | + ret = __mlock_posix_error_return(ret); |
7117 | } else { |
7118 | - __mlock_vma_pages_range(vma, start, end, 0); |
7119 | + munlock_vma_pages_range(vma, start, end); |
7120 | } |
7121 | |
7122 | out: |
7123 | diff --git a/mm/mmap.c b/mm/mmap.c |
7124 | index 8101de4..cbb7cb3 100644 |
7125 | --- a/mm/mmap.c |
7126 | +++ b/mm/mmap.c |
7127 | @@ -570,9 +570,9 @@ again: remove_next = 1 + (end > next->vm_end); |
7128 | |
7129 | /* |
7130 | * When changing only vma->vm_end, we don't really need |
7131 | - * anon_vma lock: but is that case worth optimizing out? |
7132 | + * anon_vma lock. |
7133 | */ |
7134 | - if (vma->anon_vma) |
7135 | + if (vma->anon_vma && (insert || importer || start != vma->vm_start)) |
7136 | anon_vma = vma->anon_vma; |
7137 | if (anon_vma) { |
7138 | spin_lock(&anon_vma->lock); |
7139 | diff --git a/mm/nommu.c b/mm/nommu.c |
7140 | index 66e81e7..82fedca 100644 |
7141 | --- a/mm/nommu.c |
7142 | +++ b/mm/nommu.c |
7143 | @@ -1056,7 +1056,7 @@ static int do_mmap_shared_file(struct vm_area_struct *vma) |
7144 | ret = vma->vm_file->f_op->mmap(vma->vm_file, vma); |
7145 | if (ret == 0) { |
7146 | vma->vm_region->vm_top = vma->vm_region->vm_end; |
7147 | - return ret; |
7148 | + return 0; |
7149 | } |
7150 | if (ret != -ENOSYS) |
7151 | return ret; |
7152 | @@ -1073,7 +1073,8 @@ static int do_mmap_shared_file(struct vm_area_struct *vma) |
7153 | */ |
7154 | static int do_mmap_private(struct vm_area_struct *vma, |
7155 | struct vm_region *region, |
7156 | - unsigned long len) |
7157 | + unsigned long len, |
7158 | + unsigned long capabilities) |
7159 | { |
7160 | struct page *pages; |
7161 | unsigned long total, point, n, rlen; |
7162 | @@ -1084,13 +1085,13 @@ static int do_mmap_private(struct vm_area_struct *vma, |
7163 | * shared mappings on devices or memory |
7164 | * - VM_MAYSHARE will be set if it may attempt to share |
7165 | */ |
7166 | - if (vma->vm_file) { |
7167 | + if (capabilities & BDI_CAP_MAP_DIRECT) { |
7168 | ret = vma->vm_file->f_op->mmap(vma->vm_file, vma); |
7169 | if (ret == 0) { |
7170 | /* shouldn't return success if we're not sharing */ |
7171 | BUG_ON(!(vma->vm_flags & VM_MAYSHARE)); |
7172 | vma->vm_region->vm_top = vma->vm_region->vm_end; |
7173 | - return ret; |
7174 | + return 0; |
7175 | } |
7176 | if (ret != -ENOSYS) |
7177 | return ret; |
7178 | @@ -1328,7 +1329,7 @@ unsigned long do_mmap_pgoff(struct file *file, |
7179 | * - this is the hook for quasi-memory character devices to |
7180 | * tell us the location of a shared mapping |
7181 | */ |
7182 | - if (file && file->f_op->get_unmapped_area) { |
7183 | + if (capabilities & BDI_CAP_MAP_DIRECT) { |
7184 | addr = file->f_op->get_unmapped_area(file, addr, len, |
7185 | pgoff, flags); |
7186 | if (IS_ERR((void *) addr)) { |
7187 | @@ -1352,15 +1353,17 @@ unsigned long do_mmap_pgoff(struct file *file, |
7188 | } |
7189 | |
7190 | vma->vm_region = region; |
7191 | - add_nommu_region(region); |
7192 | |
7193 | - /* set up the mapping */ |
7194 | + /* set up the mapping |
7195 | + * - the region is filled in if BDI_CAP_MAP_DIRECT is still set |
7196 | + */ |
7197 | if (file && vma->vm_flags & VM_SHARED) |
7198 | ret = do_mmap_shared_file(vma); |
7199 | else |
7200 | - ret = do_mmap_private(vma, region, len); |
7201 | + ret = do_mmap_private(vma, region, len, capabilities); |
7202 | if (ret < 0) |
7203 | - goto error_put_region; |
7204 | + goto error_just_free; |
7205 | + add_nommu_region(region); |
7206 | |
7207 | /* okay... we have a mapping; now we have to register it */ |
7208 | result = vma->vm_start; |
7209 | @@ -1378,19 +1381,6 @@ share: |
7210 | kleave(" = %lx", result); |
7211 | return result; |
7212 | |
7213 | -error_put_region: |
7214 | - __put_nommu_region(region); |
7215 | - if (vma) { |
7216 | - if (vma->vm_file) { |
7217 | - fput(vma->vm_file); |
7218 | - if (vma->vm_flags & VM_EXECUTABLE) |
7219 | - removed_exe_file_vma(vma->vm_mm); |
7220 | - } |
7221 | - kmem_cache_free(vm_area_cachep, vma); |
7222 | - } |
7223 | - kleave(" = %d [pr]", ret); |
7224 | - return ret; |
7225 | - |
7226 | error_just_free: |
7227 | up_write(&nommu_region_sem); |
7228 | error: |
7229 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
7230 | index a0de15f..0b3c6cb 100644 |
7231 | --- a/mm/page_alloc.c |
7232 | +++ b/mm/page_alloc.c |
7233 | @@ -2783,7 +2783,8 @@ static void setup_zone_migrate_reserve(struct zone *zone) |
7234 | { |
7235 | unsigned long start_pfn, pfn, end_pfn; |
7236 | struct page *page; |
7237 | - unsigned long reserve, block_migratetype; |
7238 | + unsigned long block_migratetype; |
7239 | + int reserve; |
7240 | |
7241 | /* Get the start pfn, end pfn and the number of blocks to reserve */ |
7242 | start_pfn = zone->zone_start_pfn; |
7243 | @@ -2791,6 +2792,15 @@ static void setup_zone_migrate_reserve(struct zone *zone) |
7244 | reserve = roundup(min_wmark_pages(zone), pageblock_nr_pages) >> |
7245 | pageblock_order; |
7246 | |
7247 | + /* |
7248 | + * Reserve blocks are generally in place to help high-order atomic |
7249 | + * allocations that are short-lived. A min_free_kbytes value that |
7250 | + * would result in more than 2 reserve blocks for atomic allocations |
7251 | + * is assumed to be in place to help anti-fragmentation for the |
7252 | + * future allocation of hugepages at runtime. |
7253 | + */ |
7254 | + reserve = min(2, reserve); |
7255 | + |
7256 | for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) { |
7257 | if (!pfn_valid(pfn)) |
7258 | continue; |
7259 | diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c |
7260 | index da0f64f..f03529c 100644 |
7261 | --- a/net/ax25/af_ax25.c |
7262 | +++ b/net/ax25/af_ax25.c |
7263 | @@ -538,7 +538,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname, |
7264 | if (level != SOL_AX25) |
7265 | return -ENOPROTOOPT; |
7266 | |
7267 | - if (optlen < sizeof(int)) |
7268 | + if (optlen < (int)sizeof(int)) |
7269 | return -EINVAL; |
7270 | |
7271 | if (get_user(opt, (int __user *)optval)) |
7272 | diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c |
7273 | index d22f611..991fe40 100644 |
7274 | --- a/net/bridge/br_netfilter.c |
7275 | +++ b/net/bridge/br_netfilter.c |
7276 | @@ -359,7 +359,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) |
7277 | }, |
7278 | .proto = 0, |
7279 | }; |
7280 | - struct in_device *in_dev = in_dev_get(dev); |
7281 | + struct in_device *in_dev = __in_dev_get_rcu(dev); |
7282 | |
7283 | /* If err equals -EHOSTUNREACH the error is due to a |
7284 | * martian destination or due to the fact that |
7285 | diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c |
7286 | index 133eeae..ce50688 100644 |
7287 | --- a/net/bridge/netfilter/ebt_ulog.c |
7288 | +++ b/net/bridge/netfilter/ebt_ulog.c |
7289 | @@ -266,7 +266,7 @@ static bool ebt_ulog_tg_check(const struct xt_tgchk_param *par) |
7290 | if (uloginfo->qthreshold > EBT_ULOG_MAX_QLEN) |
7291 | uloginfo->qthreshold = EBT_ULOG_MAX_QLEN; |
7292 | |
7293 | - return 0; |
7294 | + return true; |
7295 | } |
7296 | |
7297 | static struct xt_target ebt_ulog_tg_reg __read_mostly = { |
7298 | diff --git a/net/can/af_can.c b/net/can/af_can.c |
7299 | index e733725..264c968 100644 |
7300 | --- a/net/can/af_can.c |
7301 | +++ b/net/can/af_can.c |
7302 | @@ -199,6 +199,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol) |
7303 | * @skb: pointer to socket buffer with CAN frame in data section |
7304 | * @loop: loopback for listeners on local CAN sockets (recommended default!) |
7305 | * |
7306 | + * Due to the loopback this routine must not be called from hardirq context. |
7307 | + * |
7308 | * Return: |
7309 | * 0 on success |
7310 | * -ENETDOWN when the selected interface is down |
7311 | @@ -278,7 +280,7 @@ int can_send(struct sk_buff *skb, int loop) |
7312 | } |
7313 | |
7314 | if (newskb) |
7315 | - netif_rx(newskb); |
7316 | + netif_rx_ni(newskb); |
7317 | |
7318 | /* update statistics */ |
7319 | can_stats.tx_frames++; |
7320 | diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c |
7321 | index 3229e0a..b6ddd56 100644 |
7322 | --- a/net/ipv4/netfilter/nf_nat_core.c |
7323 | +++ b/net/ipv4/netfilter/nf_nat_core.c |
7324 | @@ -212,7 +212,7 @@ find_best_ips_proto(struct nf_conntrack_tuple *tuple, |
7325 | maxip = ntohl(range->max_ip); |
7326 | j = jhash_2words((__force u32)tuple->src.u3.ip, |
7327 | range->flags & IP_NAT_RANGE_PERSISTENT ? |
7328 | - (__force u32)tuple->dst.u3.ip : 0, 0); |
7329 | + 0 : (__force u32)tuple->dst.u3.ip, 0); |
7330 | j = ((u64)j * (maxip - minip + 1)) >> 32; |
7331 | *var_ipp = htonl(minip + j); |
7332 | } |
7333 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c |
7334 | index b5869b9..b8614c6 100644 |
7335 | --- a/net/netfilter/nf_conntrack_core.c |
7336 | +++ b/net/netfilter/nf_conntrack_core.c |
7337 | @@ -1089,14 +1089,14 @@ void nf_conntrack_flush_report(struct net *net, u32 pid, int report) |
7338 | } |
7339 | EXPORT_SYMBOL_GPL(nf_conntrack_flush_report); |
7340 | |
7341 | -static void nf_ct_release_dying_list(void) |
7342 | +static void nf_ct_release_dying_list(struct net *net) |
7343 | { |
7344 | struct nf_conntrack_tuple_hash *h; |
7345 | struct nf_conn *ct; |
7346 | struct hlist_nulls_node *n; |
7347 | |
7348 | spin_lock_bh(&nf_conntrack_lock); |
7349 | - hlist_nulls_for_each_entry(h, n, &init_net.ct.dying, hnnode) { |
7350 | + hlist_nulls_for_each_entry(h, n, &net->ct.dying, hnnode) { |
7351 | ct = nf_ct_tuplehash_to_ctrack(h); |
7352 | /* never fails to remove them, no listeners at this point */ |
7353 | nf_ct_kill(ct); |
7354 | @@ -1115,7 +1115,7 @@ static void nf_conntrack_cleanup_net(struct net *net) |
7355 | { |
7356 | i_see_dead_people: |
7357 | nf_ct_iterate_cleanup(net, kill_all, NULL); |
7358 | - nf_ct_release_dying_list(); |
7359 | + nf_ct_release_dying_list(net); |
7360 | if (atomic_read(&net->ct.count) != 0) { |
7361 | schedule(); |
7362 | goto i_see_dead_people; |
7363 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
7364 | index ebe5718..f9f7177 100644 |
7365 | --- a/net/packet/af_packet.c |
7366 | +++ b/net/packet/af_packet.c |
7367 | @@ -1836,7 +1836,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv |
7368 | static int packet_getsockopt(struct socket *sock, int level, int optname, |
7369 | char __user *optval, int __user *optlen) |
7370 | { |
7371 | - int len; |
7372 | + unsigned int len; |
7373 | int val; |
7374 | struct sock *sk = sock->sk; |
7375 | struct packet_sock *po = pkt_sk(sk); |
7376 | @@ -1849,7 +1849,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, |
7377 | if (get_user(len, optlen)) |
7378 | return -EFAULT; |
7379 | |
7380 | - if (len < 0) |
7381 | + if ((int)len < 0) |
7382 | return -EINVAL; |
7383 | |
7384 | switch (optname) { |
7385 | diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include |
7386 | index c29be8f..43300b3 100644 |
7387 | --- a/scripts/Kbuild.include |
7388 | +++ b/scripts/Kbuild.include |
7389 | @@ -105,12 +105,12 @@ as-instr = $(call try-run,\ |
7390 | # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) |
7391 | |
7392 | cc-option = $(call try-run,\ |
7393 | - $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) |
7394 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) |
7395 | |
7396 | # cc-option-yn |
7397 | # Usage: flag := $(call cc-option-yn,-march=winchip-c6) |
7398 | cc-option-yn = $(call try-run,\ |
7399 | - $(CC) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) |
7400 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) |
7401 | |
7402 | # cc-option-align |
7403 | # Prefix align with either -falign or -malign |
7404 | diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c |
7405 | index 64343cc..86c3896 100644 |
7406 | --- a/scripts/kallsyms.c |
7407 | +++ b/scripts/kallsyms.c |
7408 | @@ -585,7 +585,7 @@ static int prefix_underscores_count(const char *str) |
7409 | { |
7410 | const char *tail = str; |
7411 | |
7412 | - while (*tail != '_') |
7413 | + while (*tail == '_') |
7414 | tail++; |
7415 | |
7416 | return tail - str; |
7417 | diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c |
7418 | index 5e17de9..5010952 100644 |
7419 | --- a/tools/perf/builtin-annotate.c |
7420 | +++ b/tools/perf/builtin-annotate.c |
7421 | @@ -1335,8 +1335,8 @@ static int __cmd_annotate(void) |
7422 | exit(-1); |
7423 | } |
7424 | |
7425 | - if (!force && (stat.st_uid != geteuid())) { |
7426 | - fprintf(stderr, "file: %s not owned by current user\n", input_name); |
7427 | + if (!force && stat.st_uid && (stat.st_uid != geteuid())) { |
7428 | + fprintf(stderr, "file: %s not owned by current user or root\n", input_name); |
7429 | exit(-1); |
7430 | } |
7431 | |
7432 | diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c |
7433 | index 8b2ec88..b8a75f6 100644 |
7434 | --- a/tools/perf/builtin-report.c |
7435 | +++ b/tools/perf/builtin-report.c |
7436 | @@ -1857,8 +1857,8 @@ static int __cmd_report(void) |
7437 | exit(-1); |
7438 | } |
7439 | |
7440 | - if (!force && (stat.st_uid != geteuid())) { |
7441 | - fprintf(stderr, "file: %s not owned by current user\n", input_name); |
7442 | + if (!force && stat.st_uid && (stat.st_uid != geteuid())) { |
7443 | + fprintf(stderr, "file: %s not owned by current user or root\n", input_name); |
7444 | exit(-1); |
7445 | } |
7446 | |
7447 | diff --git a/tools/perf/util/module.c b/tools/perf/util/module.c |
7448 | index ddabe92..702083d 100644 |
7449 | --- a/tools/perf/util/module.c |
7450 | +++ b/tools/perf/util/module.c |
7451 | @@ -422,7 +422,7 @@ static int mod_dso__load_module_paths(struct mod_dso *self) |
7452 | len += strlen(uts.release); |
7453 | len += strlen("/modules.dep"); |
7454 | |
7455 | - path = calloc(1, len); |
7456 | + path = calloc(1, len + 1); |
7457 | if (path == NULL) |
7458 | goto out_failure; |
7459 |