Contents of /trunk/kernel26-magellan-server/patches-2.6.27-r2/0106-2.6.27.7-all-fixes.patch
Parent Directory | Revision Log
Revision 728 -
(show annotations)
(download)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 64847 byte(s)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 64847 byte(s)
-ver bump to 2.6.27-r2: - updated to linux-2.6.27.10 - using tuxonice current-20081025 - adjusted kernel-configs to use tuxonice and enabled ufs filesystem support
1 | diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c |
2 | index 7b5a25d..4f6cf46 100644 |
3 | --- a/arch/arm/mm/cache-feroceon-l2.c |
4 | +++ b/arch/arm/mm/cache-feroceon-l2.c |
5 | @@ -148,7 +148,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end) |
6 | /* |
7 | * Clean and invalidate partial last cache line. |
8 | */ |
9 | - if (end & (CACHE_LINE_SIZE - 1)) { |
10 | + if (start < end && end & (CACHE_LINE_SIZE - 1)) { |
11 | l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1)); |
12 | end &= ~(CACHE_LINE_SIZE - 1); |
13 | } |
14 | @@ -156,7 +156,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end) |
15 | /* |
16 | * Invalidate all full cache lines between 'start' and 'end'. |
17 | */ |
18 | - while (start != end) { |
19 | + while (start < end) { |
20 | unsigned long range_end = calc_range_end(start, end); |
21 | l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE); |
22 | start = range_end; |
23 | diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c |
24 | index ded7dd2..c4460bf 100644 |
25 | --- a/arch/m68k/kernel/ints.c |
26 | +++ b/arch/m68k/kernel/ints.c |
27 | @@ -133,7 +133,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt, |
28 | { |
29 | int i; |
30 | |
31 | - BUG_ON(IRQ_USER + cnt >= NR_IRQS); |
32 | + BUG_ON(IRQ_USER + cnt > NR_IRQS); |
33 | m68k_first_user_vec = vec; |
34 | for (i = 0; i < cnt; i++) |
35 | irq_controller[IRQ_USER + i] = &user_irq_controller; |
36 | diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h |
37 | index fe566a3..eb685ed 100644 |
38 | --- a/arch/powerpc/include/asm/mpic.h |
39 | +++ b/arch/powerpc/include/asm/mpic.h |
40 | @@ -355,6 +355,8 @@ struct mpic |
41 | #define MPIC_NO_BIAS 0x00000400 |
42 | /* Ignore NIRQS as reported by FRR */ |
43 | #define MPIC_BROKEN_FRR_NIRQS 0x00000800 |
44 | +/* Destination only supports a single CPU at a time */ |
45 | +#define MPIC_SINGLE_DEST_CPU 0x00001000 |
46 | |
47 | /* MPIC HW modification ID */ |
48 | #define MPIC_REGSET_MASK 0xf0000000 |
49 | diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c |
50 | index 483b65c..613bf8c 100644 |
51 | --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c |
52 | +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c |
53 | @@ -78,7 +78,8 @@ void __init mpc85xx_ds_pic_init(void) |
54 | |
55 | mpic = mpic_alloc(np, r.start, |
56 | MPIC_PRIMARY | MPIC_WANTS_RESET | |
57 | - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, |
58 | + MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | |
59 | + MPIC_SINGLE_DEST_CPU, |
60 | 0, 256, " OpenPIC "); |
61 | BUG_ON(mpic == NULL); |
62 | of_node_put(np); |
63 | diff --git a/arch/powerpc/platforms/86xx/pic.c b/arch/powerpc/platforms/86xx/pic.c |
64 | index 8881c5d..668275d 100644 |
65 | --- a/arch/powerpc/platforms/86xx/pic.c |
66 | +++ b/arch/powerpc/platforms/86xx/pic.c |
67 | @@ -44,7 +44,8 @@ void __init mpc86xx_init_irq(void) |
68 | |
69 | mpic = mpic_alloc(np, res.start, |
70 | MPIC_PRIMARY | MPIC_WANTS_RESET | |
71 | - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, |
72 | + MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | |
73 | + MPIC_SINGLE_DEST_CPU, |
74 | 0, 256, " MPIC "); |
75 | of_node_put(np); |
76 | BUG_ON(mpic == NULL); |
77 | diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c |
78 | index 8e3478c..f6299cc 100644 |
79 | --- a/arch/powerpc/sysdev/mpic.c |
80 | +++ b/arch/powerpc/sysdev/mpic.c |
81 | @@ -563,6 +563,51 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic) |
82 | |
83 | #endif /* CONFIG_MPIC_U3_HT_IRQS */ |
84 | |
85 | +#ifdef CONFIG_SMP |
86 | +static int irq_choose_cpu(unsigned int virt_irq) |
87 | +{ |
88 | + cpumask_t mask = irq_desc[virt_irq].affinity; |
89 | + int cpuid; |
90 | + |
91 | + if (cpus_equal(mask, CPU_MASK_ALL)) { |
92 | + static int irq_rover; |
93 | + static DEFINE_SPINLOCK(irq_rover_lock); |
94 | + unsigned long flags; |
95 | + |
96 | + /* Round-robin distribution... */ |
97 | + do_round_robin: |
98 | + spin_lock_irqsave(&irq_rover_lock, flags); |
99 | + |
100 | + while (!cpu_online(irq_rover)) { |
101 | + if (++irq_rover >= NR_CPUS) |
102 | + irq_rover = 0; |
103 | + } |
104 | + cpuid = irq_rover; |
105 | + do { |
106 | + if (++irq_rover >= NR_CPUS) |
107 | + irq_rover = 0; |
108 | + } while (!cpu_online(irq_rover)); |
109 | + |
110 | + spin_unlock_irqrestore(&irq_rover_lock, flags); |
111 | + } else { |
112 | + cpumask_t tmp; |
113 | + |
114 | + cpus_and(tmp, cpu_online_map, mask); |
115 | + |
116 | + if (cpus_empty(tmp)) |
117 | + goto do_round_robin; |
118 | + |
119 | + cpuid = first_cpu(tmp); |
120 | + } |
121 | + |
122 | + return cpuid; |
123 | +} |
124 | +#else |
125 | +static int irq_choose_cpu(unsigned int virt_irq) |
126 | +{ |
127 | + return hard_smp_processor_id(); |
128 | +} |
129 | +#endif |
130 | |
131 | #define mpic_irq_to_hw(virq) ((unsigned int)irq_map[virq].hwirq) |
132 | |
133 | @@ -777,12 +822,18 @@ void mpic_set_affinity(unsigned int irq, cpumask_t cpumask) |
134 | struct mpic *mpic = mpic_from_irq(irq); |
135 | unsigned int src = mpic_irq_to_hw(irq); |
136 | |
137 | - cpumask_t tmp; |
138 | + if (mpic->flags & MPIC_SINGLE_DEST_CPU) { |
139 | + int cpuid = irq_choose_cpu(irq); |
140 | |
141 | - cpus_and(tmp, cpumask, cpu_online_map); |
142 | + mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), 1 << cpuid); |
143 | + } else { |
144 | + cpumask_t tmp; |
145 | |
146 | - mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), |
147 | - mpic_physmask(cpus_addr(tmp)[0])); |
148 | + cpus_and(tmp, cpumask, cpu_online_map); |
149 | + |
150 | + mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), |
151 | + mpic_physmask(cpus_addr(tmp)[0])); |
152 | + } |
153 | } |
154 | |
155 | static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) |
156 | diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c |
157 | index 632b13e..a947899 100644 |
158 | --- a/arch/s390/kernel/topology.c |
159 | +++ b/arch/s390/kernel/topology.c |
160 | @@ -65,18 +65,21 @@ static int machine_has_topology_irq; |
161 | static struct timer_list topology_timer; |
162 | static void set_topology_timer(void); |
163 | static DECLARE_WORK(topology_work, topology_work_fn); |
164 | +/* topology_lock protects the core linked list */ |
165 | +static DEFINE_SPINLOCK(topology_lock); |
166 | |
167 | cpumask_t cpu_core_map[NR_CPUS]; |
168 | |
169 | cpumask_t cpu_coregroup_map(unsigned int cpu) |
170 | { |
171 | struct core_info *core = &core_info; |
172 | + unsigned long flags; |
173 | cpumask_t mask; |
174 | |
175 | cpus_clear(mask); |
176 | if (!machine_has_topology) |
177 | return cpu_present_map; |
178 | - mutex_lock(&smp_cpu_state_mutex); |
179 | + spin_lock_irqsave(&topology_lock, flags); |
180 | while (core) { |
181 | if (cpu_isset(cpu, core->mask)) { |
182 | mask = core->mask; |
183 | @@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu) |
184 | } |
185 | core = core->next; |
186 | } |
187 | - mutex_unlock(&smp_cpu_state_mutex); |
188 | + spin_unlock_irqrestore(&topology_lock, flags); |
189 | if (cpus_empty(mask)) |
190 | mask = cpumask_of_cpu(cpu); |
191 | return mask; |
192 | @@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info) |
193 | union tl_entry *tle, *end; |
194 | struct core_info *core = &core_info; |
195 | |
196 | - mutex_lock(&smp_cpu_state_mutex); |
197 | + spin_lock_irq(&topology_lock); |
198 | clear_cores(); |
199 | tle = info->tle; |
200 | end = (union tl_entry *)((unsigned long)info + info->length); |
201 | @@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info) |
202 | } |
203 | tle = next_tle(tle); |
204 | } |
205 | - mutex_unlock(&smp_cpu_state_mutex); |
206 | + spin_unlock_irq(&topology_lock); |
207 | } |
208 | |
209 | static void topology_update_polarization_simple(void) |
210 | diff --git a/block/blk-merge.c b/block/blk-merge.c |
211 | index 5efc9e7..857dce7 100644 |
212 | --- a/block/blk-merge.c |
213 | +++ b/block/blk-merge.c |
214 | @@ -95,6 +95,9 @@ new_hw_segment: |
215 | nr_hw_segs++; |
216 | } |
217 | |
218 | + if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size) |
219 | + rq->bio->bi_seg_front_size = seg_size; |
220 | + |
221 | nr_phys_segs++; |
222 | bvprv = bv; |
223 | seg_size = bv->bv_len; |
224 | @@ -106,6 +109,10 @@ new_hw_segment: |
225 | rq->bio->bi_hw_front_size = hw_seg_size; |
226 | if (hw_seg_size > rq->biotail->bi_hw_back_size) |
227 | rq->biotail->bi_hw_back_size = hw_seg_size; |
228 | + if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size) |
229 | + rq->bio->bi_seg_front_size = seg_size; |
230 | + if (seg_size > rq->biotail->bi_seg_back_size) |
231 | + rq->biotail->bi_seg_back_size = seg_size; |
232 | rq->nr_phys_segments = nr_phys_segs; |
233 | rq->nr_hw_segments = nr_hw_segs; |
234 | } |
235 | @@ -133,7 +140,8 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio, |
236 | |
237 | if (!BIOVEC_PHYS_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt))) |
238 | return 0; |
239 | - if (bio->bi_size + nxt->bi_size > q->max_segment_size) |
240 | + if (bio->bi_seg_back_size + nxt->bi_seg_front_size > |
241 | + q->max_segment_size) |
242 | return 0; |
243 | |
244 | /* |
245 | @@ -377,6 +385,8 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, |
246 | { |
247 | int total_phys_segments; |
248 | int total_hw_segments; |
249 | + unsigned int seg_size = |
250 | + req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size; |
251 | |
252 | /* |
253 | * First check if the either of the requests are re-queued |
254 | @@ -392,8 +402,13 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, |
255 | return 0; |
256 | |
257 | total_phys_segments = req->nr_phys_segments + next->nr_phys_segments; |
258 | - if (blk_phys_contig_segment(q, req->biotail, next->bio)) |
259 | + if (blk_phys_contig_segment(q, req->biotail, next->bio)) { |
260 | + if (req->nr_phys_segments == 1) |
261 | + req->bio->bi_seg_front_size = seg_size; |
262 | + if (next->nr_phys_segments == 1) |
263 | + next->biotail->bi_seg_back_size = seg_size; |
264 | total_phys_segments--; |
265 | + } |
266 | |
267 | if (total_phys_segments > q->max_phys_segments) |
268 | return 0; |
269 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c |
270 | index ccae305..c54f38e 100644 |
271 | --- a/drivers/acpi/bus.c |
272 | +++ b/drivers/acpi/bus.c |
273 | @@ -95,21 +95,21 @@ int acpi_bus_get_status(struct acpi_device *device) |
274 | } |
275 | |
276 | /* |
277 | - * Otherwise we assume the status of our parent (unless we don't |
278 | - * have one, in which case status is implied). |
279 | + * According to ACPI spec some device can be present and functional |
280 | + * even if the parent is not present but functional. |
281 | + * In such conditions the child device should not inherit the status |
282 | + * from the parent. |
283 | */ |
284 | - else if (device->parent) |
285 | - device->status = device->parent->status; |
286 | else |
287 | STRUCT_TO_INT(device->status) = |
288 | ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | |
289 | ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; |
290 | |
291 | if (device->status.functional && !device->status.present) { |
292 | - printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " |
293 | - "functional but not present; setting present\n", |
294 | - device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); |
295 | - device->status.present = 1; |
296 | + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: " |
297 | + "functional but not present;\n", |
298 | + device->pnp.bus_id, |
299 | + (u32) STRUCT_TO_INT(device->status))); |
300 | } |
301 | |
302 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", |
303 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
304 | index 444cd9e..41b8e7c 100644 |
305 | --- a/drivers/acpi/ec.c |
306 | +++ b/drivers/acpi/ec.c |
307 | @@ -70,7 +70,7 @@ enum ec_command { |
308 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ |
309 | #define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */ |
310 | |
311 | -#define ACPI_EC_STORM_THRESHOLD 20 /* number of false interrupts |
312 | +#define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts |
313 | per one transaction */ |
314 | |
315 | enum { |
316 | @@ -100,8 +100,11 @@ struct transaction { |
317 | u8 *rdata; |
318 | unsigned short irq_count; |
319 | u8 command; |
320 | + u8 wi; |
321 | + u8 ri; |
322 | u8 wlen; |
323 | u8 rlen; |
324 | + bool done; |
325 | }; |
326 | |
327 | static struct acpi_ec { |
328 | @@ -178,34 +181,45 @@ static int ec_transaction_done(struct acpi_ec *ec) |
329 | unsigned long flags; |
330 | int ret = 0; |
331 | spin_lock_irqsave(&ec->curr_lock, flags); |
332 | - if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen)) |
333 | + if (!ec->curr || ec->curr->done) |
334 | ret = 1; |
335 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
336 | return ret; |
337 | } |
338 | |
339 | +static void start_transaction(struct acpi_ec *ec) |
340 | +{ |
341 | + ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; |
342 | + ec->curr->done = false; |
343 | + acpi_ec_write_cmd(ec, ec->curr->command); |
344 | +} |
345 | + |
346 | static void gpe_transaction(struct acpi_ec *ec, u8 status) |
347 | { |
348 | unsigned long flags; |
349 | spin_lock_irqsave(&ec->curr_lock, flags); |
350 | if (!ec->curr) |
351 | goto unlock; |
352 | - if (ec->curr->wlen > 0) { |
353 | - if ((status & ACPI_EC_FLAG_IBF) == 0) { |
354 | - acpi_ec_write_data(ec, *(ec->curr->wdata++)); |
355 | - --ec->curr->wlen; |
356 | - } else |
357 | - /* false interrupt, state didn't change */ |
358 | - ++ec->curr->irq_count; |
359 | - |
360 | - } else if (ec->curr->rlen > 0) { |
361 | + if (ec->curr->wlen > ec->curr->wi) { |
362 | + if ((status & ACPI_EC_FLAG_IBF) == 0) |
363 | + acpi_ec_write_data(ec, |
364 | + ec->curr->wdata[ec->curr->wi++]); |
365 | + else |
366 | + goto err; |
367 | + } else if (ec->curr->rlen > ec->curr->ri) { |
368 | if ((status & ACPI_EC_FLAG_OBF) == 1) { |
369 | - *(ec->curr->rdata++) = acpi_ec_read_data(ec); |
370 | - --ec->curr->rlen; |
371 | + ec->curr->rdata[ec->curr->ri++] = acpi_ec_read_data(ec); |
372 | + if (ec->curr->rlen == ec->curr->ri) |
373 | + ec->curr->done = true; |
374 | } else |
375 | - /* false interrupt, state didn't change */ |
376 | - ++ec->curr->irq_count; |
377 | - } |
378 | + goto err; |
379 | + } else if (ec->curr->wlen == ec->curr->wi && |
380 | + (status & ACPI_EC_FLAG_IBF) == 0) |
381 | + ec->curr->done = true; |
382 | + goto unlock; |
383 | +err: |
384 | + /* false interrupt, state didn't change */ |
385 | + ++ec->curr->irq_count; |
386 | unlock: |
387 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
388 | } |
389 | @@ -215,6 +229,15 @@ static int acpi_ec_wait(struct acpi_ec *ec) |
390 | if (wait_event_timeout(ec->wait, ec_transaction_done(ec), |
391 | msecs_to_jiffies(ACPI_EC_DELAY))) |
392 | return 0; |
393 | + /* try restart command if we get any false interrupts */ |
394 | + if (ec->curr->irq_count && |
395 | + (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) { |
396 | + pr_debug(PREFIX "controller reset, restart transaction\n"); |
397 | + start_transaction(ec); |
398 | + if (wait_event_timeout(ec->wait, ec_transaction_done(ec), |
399 | + msecs_to_jiffies(ACPI_EC_DELAY))) |
400 | + return 0; |
401 | + } |
402 | /* missing GPEs, switch back to poll mode */ |
403 | if (printk_ratelimit()) |
404 | pr_info(PREFIX "missing confirmations, " |
405 | @@ -239,10 +262,10 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state) |
406 | static int ec_poll(struct acpi_ec *ec) |
407 | { |
408 | unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY); |
409 | - msleep(1); |
410 | + udelay(ACPI_EC_UDELAY); |
411 | while (time_before(jiffies, delay)) { |
412 | gpe_transaction(ec, acpi_ec_read_status(ec)); |
413 | - msleep(1); |
414 | + udelay(ACPI_EC_UDELAY); |
415 | if (ec_transaction_done(ec)) |
416 | return 0; |
417 | } |
418 | @@ -264,9 +287,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, |
419 | /* start transaction */ |
420 | spin_lock_irqsave(&ec->curr_lock, tmp); |
421 | /* following two actions should be kept atomic */ |
422 | - t->irq_count = 0; |
423 | ec->curr = t; |
424 | - acpi_ec_write_cmd(ec, ec->curr->command); |
425 | + start_transaction(ec); |
426 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) |
427 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
428 | spin_unlock_irqrestore(&ec->curr_lock, tmp); |
429 | @@ -286,7 +308,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, |
430 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); |
431 | } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && |
432 | t->irq_count > ACPI_EC_STORM_THRESHOLD) { |
433 | - pr_debug(PREFIX "GPE storm detected\n"); |
434 | + pr_info(PREFIX "GPE storm detected, " |
435 | + "transactions will use polling mode\n"); |
436 | set_bit(EC_FLAGS_GPE_STORM, &ec->flags); |
437 | } |
438 | return ret; |
439 | @@ -558,17 +581,26 @@ static u32 acpi_ec_gpe_handler(void *data) |
440 | pr_debug(PREFIX "~~~> interrupt\n"); |
441 | status = acpi_ec_read_status(ec); |
442 | |
443 | - gpe_transaction(ec, status); |
444 | - if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0) |
445 | - wake_up(&ec->wait); |
446 | + if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) { |
447 | + gpe_transaction(ec, status); |
448 | + if (ec_transaction_done(ec) && |
449 | + (status & ACPI_EC_FLAG_IBF) == 0) |
450 | + wake_up(&ec->wait); |
451 | + } |
452 | |
453 | ec_check_sci(ec, status); |
454 | if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) && |
455 | !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) { |
456 | /* this is non-query, must be confirmation */ |
457 | - if (printk_ratelimit()) |
458 | - pr_info(PREFIX "non-query interrupt received," |
459 | + if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { |
460 | + if (printk_ratelimit()) |
461 | + pr_info(PREFIX "non-query interrupt received," |
462 | + " switching to interrupt mode\n"); |
463 | + } else { |
464 | + /* hush, STORM switches the mode every transaction */ |
465 | + pr_debug(PREFIX "non-query interrupt received," |
466 | " switching to interrupt mode\n"); |
467 | + } |
468 | set_bit(EC_FLAGS_GPE_MODE, &ec->flags); |
469 | } |
470 | return ACPI_INTERRUPT_HANDLED; |
471 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
472 | index f6f52c1..0450761 100644 |
473 | --- a/drivers/acpi/scan.c |
474 | +++ b/drivers/acpi/scan.c |
475 | @@ -276,6 +276,13 @@ int acpi_match_device_ids(struct acpi_device *device, |
476 | { |
477 | const struct acpi_device_id *id; |
478 | |
479 | + /* |
480 | + * If the device is not present, it is unnecessary to load device |
481 | + * driver for it. |
482 | + */ |
483 | + if (!device->status.present) |
484 | + return -ENODEV; |
485 | + |
486 | if (device->flags.hardware_id) { |
487 | for (id = ids; id->id[0]; id++) { |
488 | if (!strcmp((char*)id->id, device->pnp.hardware_id)) |
489 | @@ -1221,15 +1228,18 @@ acpi_add_single_object(struct acpi_device **child, |
490 | result = -ENODEV; |
491 | goto end; |
492 | } |
493 | - if (!device->status.present) { |
494 | - /* Bay and dock should be handled even if absent */ |
495 | - if (!ACPI_SUCCESS( |
496 | - acpi_is_child_device(device, acpi_bay_match)) && |
497 | - !ACPI_SUCCESS( |
498 | - acpi_is_child_device(device, acpi_dock_match))) { |
499 | - result = -ENODEV; |
500 | - goto end; |
501 | - } |
502 | + /* |
503 | + * When the device is neither present nor functional, the |
504 | + * device should not be added to Linux ACPI device tree. |
505 | + * When the status of the device is not present but functinal, |
506 | + * it should be added to Linux ACPI tree. For example : bay |
507 | + * device , dock device. |
508 | + * In such conditions it is unncessary to check whether it is |
509 | + * bay device or dock device. |
510 | + */ |
511 | + if (!device->status.present && !device->status.functional) { |
512 | + result = -ENODEV; |
513 | + goto end; |
514 | } |
515 | break; |
516 | default: |
517 | @@ -1402,7 +1412,12 @@ static int acpi_bus_scan(struct acpi_device *start, struct acpi_bus_ops *ops) |
518 | * TBD: Need notifications and other detection mechanisms |
519 | * in place before we can fully implement this. |
520 | */ |
521 | - if (child->status.present) { |
522 | + /* |
523 | + * When the device is not present but functional, it is also |
524 | + * necessary to scan the children of this device. |
525 | + */ |
526 | + if (child->status.present || (!child->status.present && |
527 | + child->status.functional)) { |
528 | status = acpi_get_next_object(ACPI_TYPE_ANY, chandle, |
529 | NULL, NULL); |
530 | if (ACPI_SUCCESS(status)) { |
531 | diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c |
532 | index 91dec44..4745792 100644 |
533 | --- a/drivers/acpi/system.c |
534 | +++ b/drivers/acpi/system.c |
535 | @@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj, |
536 | container_of(bin_attr, struct acpi_table_attr, attr); |
537 | struct acpi_table_header *table_header = NULL; |
538 | acpi_status status; |
539 | + char name[ACPI_NAME_SIZE]; |
540 | + |
541 | + if (strncmp(table_attr->name, "NULL", 4)) |
542 | + memcpy(name, table_attr->name, ACPI_NAME_SIZE); |
543 | + else |
544 | + memcpy(name, "\0\0\0\0", 4); |
545 | |
546 | status = |
547 | - acpi_get_table(table_attr->name, table_attr->instance, |
548 | + acpi_get_table(name, table_attr->instance, |
549 | &table_header); |
550 | if (ACPI_FAILURE(status)) |
551 | return -ENODEV; |
552 | @@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr, |
553 | struct acpi_table_header *header = NULL; |
554 | struct acpi_table_attr *attr = NULL; |
555 | |
556 | - memcpy(table_attr->name, table_header->signature, ACPI_NAME_SIZE); |
557 | + if (table_header->signature[0] != '\0') |
558 | + memcpy(table_attr->name, table_header->signature, |
559 | + ACPI_NAME_SIZE); |
560 | + else |
561 | + memcpy(table_attr->name, "NULL", 4); |
562 | |
563 | list_for_each_entry(attr, &acpi_table_attr_list, node) { |
564 | - if (!memcmp(table_header->signature, attr->name, |
565 | - ACPI_NAME_SIZE)) |
566 | + if (!memcmp(table_attr->name, attr->name, ACPI_NAME_SIZE)) |
567 | if (table_attr->instance < attr->instance) |
568 | table_attr->instance = attr->instance; |
569 | } |
570 | table_attr->instance++; |
571 | |
572 | if (table_attr->instance > 1 || (table_attr->instance == 1 && |
573 | - !acpi_get_table(table_header-> |
574 | - signature, 2, |
575 | - &header))) |
576 | - sprintf(table_attr->name + 4, "%d", table_attr->instance); |
577 | + !acpi_get_table |
578 | + (table_header->signature, 2, &header))) |
579 | + sprintf(table_attr->name + ACPI_NAME_SIZE, "%d", |
580 | + table_attr->instance); |
581 | |
582 | table_attr->attr.size = 0; |
583 | table_attr->attr.read = acpi_table_show; |
584 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c |
585 | index 8a59aaa..7a88dfd 100644 |
586 | --- a/drivers/char/ipmi/ipmi_msghandler.c |
587 | +++ b/drivers/char/ipmi/ipmi_msghandler.c |
588 | @@ -422,9 +422,11 @@ struct ipmi_smi { |
589 | /** |
590 | * The driver model view of the IPMI messaging driver. |
591 | */ |
592 | -static struct device_driver ipmidriver = { |
593 | - .name = "ipmi", |
594 | - .bus = &platform_bus_type |
595 | +static struct platform_driver ipmidriver = { |
596 | + .driver = { |
597 | + .name = "ipmi", |
598 | + .bus = &platform_bus_type |
599 | + } |
600 | }; |
601 | static DEFINE_MUTEX(ipmidriver_mutex); |
602 | |
603 | @@ -2384,9 +2386,9 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, |
604 | * representing the interfaced BMC already |
605 | */ |
606 | if (bmc->guid_set) |
607 | - old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid); |
608 | + old_bmc = ipmi_find_bmc_guid(&ipmidriver.driver, bmc->guid); |
609 | else |
610 | - old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver, |
611 | + old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
612 | bmc->id.product_id, |
613 | bmc->id.device_id); |
614 | |
615 | @@ -2416,7 +2418,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, |
616 | snprintf(name, sizeof(name), |
617 | "ipmi_bmc.%4.4x", bmc->id.product_id); |
618 | |
619 | - while (ipmi_find_bmc_prod_dev_id(&ipmidriver, |
620 | + while (ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
621 | bmc->id.product_id, |
622 | bmc->id.device_id)) { |
623 | if (!warn_printed) { |
624 | @@ -2446,7 +2448,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, |
625 | " Unable to allocate platform device\n"); |
626 | return -ENOMEM; |
627 | } |
628 | - bmc->dev->dev.driver = &ipmidriver; |
629 | + bmc->dev->dev.driver = &ipmidriver.driver; |
630 | dev_set_drvdata(&bmc->dev->dev, bmc); |
631 | kref_init(&bmc->refcount); |
632 | |
633 | @@ -4247,7 +4249,7 @@ static int ipmi_init_msghandler(void) |
634 | if (initialized) |
635 | return 0; |
636 | |
637 | - rv = driver_register(&ipmidriver); |
638 | + rv = driver_register(&ipmidriver.driver); |
639 | if (rv) { |
640 | printk(KERN_ERR PFX "Could not register IPMI driver\n"); |
641 | return rv; |
642 | @@ -4308,7 +4310,7 @@ static __exit void cleanup_ipmi(void) |
643 | remove_proc_entry(proc_ipmi_root->name, NULL); |
644 | #endif /* CONFIG_PROC_FS */ |
645 | |
646 | - driver_unregister(&ipmidriver); |
647 | + driver_unregister(&ipmidriver.driver); |
648 | |
649 | initialized = 0; |
650 | |
651 | diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c |
652 | index 8e8afb6..7e860da 100644 |
653 | --- a/drivers/char/ipmi/ipmi_si_intf.c |
654 | +++ b/drivers/char/ipmi/ipmi_si_intf.c |
655 | @@ -114,9 +114,11 @@ static char *si_to_str[] = { "kcs", "smic", "bt" }; |
656 | |
657 | #define DEVICE_NAME "ipmi_si" |
658 | |
659 | -static struct device_driver ipmi_driver = { |
660 | - .name = DEVICE_NAME, |
661 | - .bus = &platform_bus_type |
662 | +static struct platform_driver ipmi_driver = { |
663 | + .driver = { |
664 | + .name = DEVICE_NAME, |
665 | + .bus = &platform_bus_type |
666 | + } |
667 | }; |
668 | |
669 | |
670 | @@ -2868,7 +2870,7 @@ static int try_smi_init(struct smi_info *new_smi) |
671 | goto out_err; |
672 | } |
673 | new_smi->dev = &new_smi->pdev->dev; |
674 | - new_smi->dev->driver = &ipmi_driver; |
675 | + new_smi->dev->driver = &ipmi_driver.driver; |
676 | |
677 | rv = platform_device_add(new_smi->pdev); |
678 | if (rv) { |
679 | @@ -2983,7 +2985,7 @@ static __devinit int init_ipmi_si(void) |
680 | initialized = 1; |
681 | |
682 | /* Register the device drivers. */ |
683 | - rv = driver_register(&ipmi_driver); |
684 | + rv = driver_register(&ipmi_driver.driver); |
685 | if (rv) { |
686 | printk(KERN_ERR |
687 | "init_ipmi_si: Unable to register driver: %d\n", |
688 | @@ -3052,7 +3054,7 @@ static __devinit int init_ipmi_si(void) |
689 | #ifdef CONFIG_PPC_OF |
690 | of_unregister_platform_driver(&ipmi_of_platform_driver); |
691 | #endif |
692 | - driver_unregister(&ipmi_driver); |
693 | + driver_unregister(&ipmi_driver.driver); |
694 | printk(KERN_WARNING |
695 | "ipmi_si: Unable to find any System Interface(s)\n"); |
696 | return -ENODEV; |
697 | @@ -3151,7 +3153,7 @@ static __exit void cleanup_ipmi_si(void) |
698 | cleanup_one_si(e); |
699 | mutex_unlock(&smi_infos_lock); |
700 | |
701 | - driver_unregister(&ipmi_driver); |
702 | + driver_unregister(&ipmi_driver.driver); |
703 | } |
704 | module_exit(cleanup_ipmi_si); |
705 | |
706 | diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c |
707 | index 0f70dc2..7e909e8 100644 |
708 | --- a/drivers/hwmon/ibmaem.c |
709 | +++ b/drivers/hwmon/ibmaem.c |
710 | @@ -88,9 +88,11 @@ |
711 | static DEFINE_IDR(aem_idr); |
712 | static DEFINE_SPINLOCK(aem_idr_lock); |
713 | |
714 | -static struct device_driver aem_driver = { |
715 | - .name = DRVNAME, |
716 | - .bus = &platform_bus_type, |
717 | +static struct platform_driver aem_driver = { |
718 | + .driver = { |
719 | + .name = DRVNAME, |
720 | + .bus = &platform_bus_type, |
721 | + } |
722 | }; |
723 | |
724 | struct aem_ipmi_data { |
725 | @@ -583,7 +585,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) |
726 | data->pdev = platform_device_alloc(DRVNAME, data->id); |
727 | if (!data->pdev) |
728 | goto dev_err; |
729 | - data->pdev->dev.driver = &aem_driver; |
730 | + data->pdev->dev.driver = &aem_driver.driver; |
731 | |
732 | res = platform_device_add(data->pdev); |
733 | if (res) |
734 | @@ -716,7 +718,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, |
735 | data->pdev = platform_device_alloc(DRVNAME, data->id); |
736 | if (!data->pdev) |
737 | goto dev_err; |
738 | - data->pdev->dev.driver = &aem_driver; |
739 | + data->pdev->dev.driver = &aem_driver.driver; |
740 | |
741 | res = platform_device_add(data->pdev); |
742 | if (res) |
743 | @@ -1085,7 +1087,7 @@ static int __init aem_init(void) |
744 | { |
745 | int res; |
746 | |
747 | - res = driver_register(&aem_driver); |
748 | + res = driver_register(&aem_driver.driver); |
749 | if (res) { |
750 | printk(KERN_ERR "Can't register aem driver\n"); |
751 | return res; |
752 | @@ -1097,7 +1099,7 @@ static int __init aem_init(void) |
753 | return 0; |
754 | |
755 | ipmi_reg_err: |
756 | - driver_unregister(&aem_driver); |
757 | + driver_unregister(&aem_driver.driver); |
758 | return res; |
759 | |
760 | } |
761 | @@ -1107,7 +1109,7 @@ static void __exit aem_exit(void) |
762 | struct aem_data *p1, *next1; |
763 | |
764 | ipmi_smi_watcher_unregister(&driver_data.bmc_events); |
765 | - driver_unregister(&aem_driver); |
766 | + driver_unregister(&aem_driver.driver); |
767 | list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list) |
768 | aem_delete(p1); |
769 | } |
770 | diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c |
771 | index 385e32b..cbedf95 100644 |
772 | --- a/drivers/input/mouse/alps.c |
773 | +++ b/drivers/input/mouse/alps.c |
774 | @@ -54,6 +54,7 @@ static const struct alps_model_info alps_model_data[] = { |
775 | { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */ |
776 | { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, |
777 | { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */ |
778 | + { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude E6500 */ |
779 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 } /* Dell Vostro 1400 */ |
780 | }; |
781 | |
782 | diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c |
783 | index ff05fe8..97ef945 100644 |
784 | --- a/drivers/md/dm-raid1.c |
785 | +++ b/drivers/md/dm-raid1.c |
786 | @@ -1598,6 +1598,7 @@ static void mirror_dtr(struct dm_target *ti) |
787 | |
788 | del_timer_sync(&ms->timer); |
789 | flush_workqueue(ms->kmirrord_wq); |
790 | + flush_scheduled_work(); |
791 | dm_kcopyd_client_destroy(ms->kcopyd_client); |
792 | destroy_workqueue(ms->kmirrord_wq); |
793 | free_context(ms, ti, ms->nr_mirrors); |
794 | diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c |
795 | index b59e472..d74df58 100644 |
796 | --- a/drivers/media/video/tvaudio.c |
797 | +++ b/drivers/media/video/tvaudio.c |
798 | @@ -1576,13 +1576,13 @@ static int tvaudio_get_ctrl(struct CHIPSTATE *chip, |
799 | return 0; |
800 | } |
801 | case V4L2_CID_AUDIO_BASS: |
802 | - if (desc->flags & CHIP_HAS_BASSTREBLE) |
803 | + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
804 | break; |
805 | ctrl->value = chip->bass; |
806 | return 0; |
807 | case V4L2_CID_AUDIO_TREBLE: |
808 | - if (desc->flags & CHIP_HAS_BASSTREBLE) |
809 | - return -EINVAL; |
810 | + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
811 | + break; |
812 | ctrl->value = chip->treble; |
813 | return 0; |
814 | } |
815 | @@ -1642,16 +1642,15 @@ static int tvaudio_set_ctrl(struct CHIPSTATE *chip, |
816 | return 0; |
817 | } |
818 | case V4L2_CID_AUDIO_BASS: |
819 | - if (desc->flags & CHIP_HAS_BASSTREBLE) |
820 | + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
821 | break; |
822 | chip->bass = ctrl->value; |
823 | chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); |
824 | |
825 | return 0; |
826 | case V4L2_CID_AUDIO_TREBLE: |
827 | - if (desc->flags & CHIP_HAS_BASSTREBLE) |
828 | - return -EINVAL; |
829 | - |
830 | + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
831 | + break; |
832 | chip->treble = ctrl->value; |
833 | chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); |
834 | |
835 | @@ -1695,7 +1694,7 @@ static int chip_command(struct i2c_client *client, |
836 | break; |
837 | case V4L2_CID_AUDIO_BASS: |
838 | case V4L2_CID_AUDIO_TREBLE: |
839 | - if (desc->flags & CHIP_HAS_BASSTREBLE) |
840 | + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) |
841 | return -EINVAL; |
842 | break; |
843 | default: |
844 | diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c |
845 | index 60775be..b35eb92 100644 |
846 | --- a/drivers/misc/sony-laptop.c |
847 | +++ b/drivers/misc/sony-laptop.c |
848 | @@ -2315,8 +2315,10 @@ end: |
849 | */ |
850 | static int sony_pic_disable(struct acpi_device *device) |
851 | { |
852 | - if (ACPI_FAILURE(acpi_evaluate_object(device->handle, |
853 | - "_DIS", NULL, NULL))) |
854 | + acpi_status ret = acpi_evaluate_object(device->handle, "_DIS", NULL, |
855 | + NULL); |
856 | + |
857 | + if (ACPI_FAILURE(ret) && ret != AE_NOT_FOUND) |
858 | return -ENXIO; |
859 | |
860 | dprintk("Device disabled\n"); |
861 | diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig |
862 | index 4a11296..60a0453 100644 |
863 | --- a/drivers/net/Kconfig |
864 | +++ b/drivers/net/Kconfig |
865 | @@ -2046,6 +2046,7 @@ config R8169 |
866 | tristate "Realtek 8169 gigabit ethernet support" |
867 | depends on PCI |
868 | select CRC32 |
869 | + select MII |
870 | ---help--- |
871 | Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter. |
872 | |
873 | diff --git a/drivers/net/bnx2x_init.h b/drivers/net/bnx2x_init.h |
874 | index 130927c..a6c0b3a 100644 |
875 | --- a/drivers/net/bnx2x_init.h |
876 | +++ b/drivers/net/bnx2x_init.h |
877 | @@ -564,14 +564,15 @@ static const struct arb_line write_arb_addr[NUM_WR_Q-1] = { |
878 | |
879 | static void bnx2x_init_pxp(struct bnx2x *bp) |
880 | { |
881 | + u16 devctl; |
882 | int r_order, w_order; |
883 | u32 val, i; |
884 | |
885 | pci_read_config_word(bp->pdev, |
886 | - bp->pcie_cap + PCI_EXP_DEVCTL, (u16 *)&val); |
887 | - DP(NETIF_MSG_HW, "read 0x%x from devctl\n", (u16)val); |
888 | - w_order = ((val & PCI_EXP_DEVCTL_PAYLOAD) >> 5); |
889 | - r_order = ((val & PCI_EXP_DEVCTL_READRQ) >> 12); |
890 | + bp->pcie_cap + PCI_EXP_DEVCTL, &devctl); |
891 | + DP(NETIF_MSG_HW, "read 0x%x from devctl\n", devctl); |
892 | + w_order = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); |
893 | + r_order = ((devctl & PCI_EXP_DEVCTL_READRQ) >> 12); |
894 | |
895 | if (r_order > MAX_RD_ORD) { |
896 | DP(NETIF_MSG_HW, "read order of %d order adjusted to %d\n", |
897 | diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c |
898 | index a8eb3c4..53459db 100644 |
899 | --- a/drivers/net/bnx2x_main.c |
900 | +++ b/drivers/net/bnx2x_main.c |
901 | @@ -6480,6 +6480,7 @@ load_int_disable: |
902 | bnx2x_free_irq(bp); |
903 | load_error: |
904 | bnx2x_free_mem(bp); |
905 | + bp->port.pmf = 0; |
906 | |
907 | /* TBD we really need to reset the chip |
908 | if we want to recover from this */ |
909 | @@ -6790,6 +6791,7 @@ unload_error: |
910 | /* Report UNLOAD_DONE to MCP */ |
911 | if (!BP_NOMCP(bp)) |
912 | bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE); |
913 | + bp->port.pmf = 0; |
914 | |
915 | /* Free SKBs, SGEs, TPA pool and driver internals */ |
916 | bnx2x_free_skbs(bp); |
917 | @@ -10203,8 +10205,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, |
918 | return -ENOMEM; |
919 | } |
920 | |
921 | - netif_carrier_off(dev); |
922 | - |
923 | bp = netdev_priv(dev); |
924 | bp->msglevel = debug; |
925 | |
926 | @@ -10228,6 +10228,8 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, |
927 | goto init_one_exit; |
928 | } |
929 | |
930 | + netif_carrier_off(dev); |
931 | + |
932 | bp->common.name = board_info[ent->driver_data].name; |
933 | printk(KERN_INFO "%s: %s (%c%d) PCI-E x%d %s found at mem %lx," |
934 | " IRQ %d, ", dev->name, bp->common.name, |
935 | diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c |
936 | index 0676c6d..a225827 100644 |
937 | --- a/drivers/net/wireless/ath5k/base.c |
938 | +++ b/drivers/net/wireless/ath5k/base.c |
939 | @@ -294,9 +294,9 @@ static inline u64 ath5k_extend_tsf(struct ath5k_hw *ah, u32 rstamp) |
940 | } |
941 | |
942 | /* Interrupt handling */ |
943 | -static int ath5k_init(struct ath5k_softc *sc); |
944 | +static int ath5k_init(struct ath5k_softc *sc, bool is_resume); |
945 | static int ath5k_stop_locked(struct ath5k_softc *sc); |
946 | -static int ath5k_stop_hw(struct ath5k_softc *sc); |
947 | +static int ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend); |
948 | static irqreturn_t ath5k_intr(int irq, void *dev_id); |
949 | static void ath5k_tasklet_reset(unsigned long data); |
950 | |
951 | @@ -584,7 +584,7 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state) |
952 | |
953 | ath5k_led_off(sc); |
954 | |
955 | - ath5k_stop_hw(sc); |
956 | + ath5k_stop_hw(sc, true); |
957 | |
958 | free_irq(pdev->irq, sc); |
959 | pci_save_state(pdev); |
960 | @@ -599,8 +599,7 @@ ath5k_pci_resume(struct pci_dev *pdev) |
961 | { |
962 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
963 | struct ath5k_softc *sc = hw->priv; |
964 | - struct ath5k_hw *ah = sc->ah; |
965 | - int i, err; |
966 | + int err; |
967 | |
968 | pci_restore_state(pdev); |
969 | |
970 | @@ -621,21 +620,11 @@ ath5k_pci_resume(struct pci_dev *pdev) |
971 | goto err_no_irq; |
972 | } |
973 | |
974 | - err = ath5k_init(sc); |
975 | + err = ath5k_init(sc, true); |
976 | if (err) |
977 | goto err_irq; |
978 | ath5k_led_enable(sc); |
979 | |
980 | - /* |
981 | - * Reset the key cache since some parts do not |
982 | - * reset the contents on initial power up or resume. |
983 | - * |
984 | - * FIXME: This may need to be revisited when mac80211 becomes |
985 | - * aware of suspend/resume. |
986 | - */ |
987 | - for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) |
988 | - ath5k_hw_reset_key(ah, i); |
989 | - |
990 | return 0; |
991 | err_irq: |
992 | free_irq(pdev->irq, sc); |
993 | @@ -657,7 +646,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw) |
994 | struct ath5k_softc *sc = hw->priv; |
995 | struct ath5k_hw *ah = sc->ah; |
996 | u8 mac[ETH_ALEN]; |
997 | - unsigned int i; |
998 | int ret; |
999 | |
1000 | ATH5K_DBG(sc, ATH5K_DEBUG_ANY, "devid 0x%x\n", pdev->device); |
1001 | @@ -676,13 +664,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw) |
1002 | __set_bit(ATH_STAT_MRRETRY, sc->status); |
1003 | |
1004 | /* |
1005 | - * Reset the key cache since some parts do not |
1006 | - * reset the contents on initial power up. |
1007 | - */ |
1008 | - for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) |
1009 | - ath5k_hw_reset_key(ah, i); |
1010 | - |
1011 | - /* |
1012 | * Collect the channel list. The 802.11 layer |
1013 | * is resposible for filtering this list based |
1014 | * on settings like the phy mode and regulatory |
1015 | @@ -2197,12 +2178,18 @@ ath5k_beacon_config(struct ath5k_softc *sc) |
1016 | \********************/ |
1017 | |
1018 | static int |
1019 | -ath5k_init(struct ath5k_softc *sc) |
1020 | +ath5k_init(struct ath5k_softc *sc, bool is_resume) |
1021 | { |
1022 | - int ret; |
1023 | + struct ath5k_hw *ah = sc->ah; |
1024 | + int ret, i; |
1025 | |
1026 | mutex_lock(&sc->lock); |
1027 | |
1028 | + if (is_resume && !test_bit(ATH_STAT_STARTED, sc->status)) |
1029 | + goto out_ok; |
1030 | + |
1031 | + __clear_bit(ATH_STAT_STARTED, sc->status); |
1032 | + |
1033 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mode %d\n", sc->opmode); |
1034 | |
1035 | /* |
1036 | @@ -2220,7 +2207,7 @@ ath5k_init(struct ath5k_softc *sc) |
1037 | */ |
1038 | sc->curchan = sc->hw->conf.channel; |
1039 | sc->curband = &sc->sbands[sc->curchan->band]; |
1040 | - ret = ath5k_hw_reset(sc->ah, sc->opmode, sc->curchan, false); |
1041 | + ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, false); |
1042 | if (ret) { |
1043 | ATH5K_ERR(sc, "unable to reset hardware: %d\n", ret); |
1044 | goto done; |
1045 | @@ -2229,7 +2216,14 @@ ath5k_init(struct ath5k_softc *sc) |
1046 | * This is needed only to setup initial state |
1047 | * but it's best done after a reset. |
1048 | */ |
1049 | - ath5k_hw_set_txpower_limit(sc->ah, 0); |
1050 | + ath5k_hw_set_txpower_limit(ah, 0); |
1051 | + |
1052 | + /* |
1053 | + * Reset the key cache since some parts do not reset the |
1054 | + * contents on initial power up or resume from suspend. |
1055 | + */ |
1056 | + for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) |
1057 | + ath5k_hw_reset_key(ah, i); |
1058 | |
1059 | /* |
1060 | * Setup the hardware after reset: the key cache |
1061 | @@ -2249,13 +2243,17 @@ ath5k_init(struct ath5k_softc *sc) |
1062 | AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL | |
1063 | AR5K_INT_MIB; |
1064 | |
1065 | - ath5k_hw_set_intr(sc->ah, sc->imask); |
1066 | + ath5k_hw_set_intr(ah, sc->imask); |
1067 | + |
1068 | + __set_bit(ATH_STAT_STARTED, sc->status); |
1069 | + |
1070 | /* Set ack to be sent at low bit-rates */ |
1071 | - ath5k_hw_set_ack_bitrate_high(sc->ah, false); |
1072 | + ath5k_hw_set_ack_bitrate_high(ah, false); |
1073 | |
1074 | mod_timer(&sc->calib_tim, round_jiffies(jiffies + |
1075 | msecs_to_jiffies(ath5k_calinterval * 1000))); |
1076 | |
1077 | +out_ok: |
1078 | ret = 0; |
1079 | done: |
1080 | mmiowb(); |
1081 | @@ -2310,7 +2308,7 @@ ath5k_stop_locked(struct ath5k_softc *sc) |
1082 | * stop is preempted). |
1083 | */ |
1084 | static int |
1085 | -ath5k_stop_hw(struct ath5k_softc *sc) |
1086 | +ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend) |
1087 | { |
1088 | int ret; |
1089 | |
1090 | @@ -2341,6 +2339,9 @@ ath5k_stop_hw(struct ath5k_softc *sc) |
1091 | } |
1092 | } |
1093 | ath5k_txbuf_free(sc, sc->bbuf); |
1094 | + if (!is_suspend) |
1095 | + __clear_bit(ATH_STAT_STARTED, sc->status); |
1096 | + |
1097 | mmiowb(); |
1098 | mutex_unlock(&sc->lock); |
1099 | |
1100 | @@ -2719,12 +2720,12 @@ err: |
1101 | |
1102 | static int ath5k_start(struct ieee80211_hw *hw) |
1103 | { |
1104 | - return ath5k_init(hw->priv); |
1105 | + return ath5k_init(hw->priv, false); |
1106 | } |
1107 | |
1108 | static void ath5k_stop(struct ieee80211_hw *hw) |
1109 | { |
1110 | - ath5k_stop_hw(hw->priv); |
1111 | + ath5k_stop_hw(hw->priv, false); |
1112 | } |
1113 | |
1114 | static int ath5k_add_interface(struct ieee80211_hw *hw, |
1115 | diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h |
1116 | index 7ec2f37..214a565 100644 |
1117 | --- a/drivers/net/wireless/ath5k/base.h |
1118 | +++ b/drivers/net/wireless/ath5k/base.h |
1119 | @@ -132,11 +132,12 @@ struct ath5k_softc { |
1120 | size_t desc_len; /* size of TX/RX descriptors */ |
1121 | u16 cachelsz; /* cache line size */ |
1122 | |
1123 | - DECLARE_BITMAP(status, 4); |
1124 | + DECLARE_BITMAP(status, 5); |
1125 | #define ATH_STAT_INVALID 0 /* disable hardware accesses */ |
1126 | #define ATH_STAT_MRRETRY 1 /* multi-rate retry support */ |
1127 | #define ATH_STAT_PROMISC 2 |
1128 | #define ATH_STAT_LEDSOFT 3 /* enable LED gpio status */ |
1129 | +#define ATH_STAT_STARTED 4 /* opened & irqs enabled */ |
1130 | |
1131 | unsigned int filter_flags; /* HW flags, AR5K_RX_FILTER_* */ |
1132 | unsigned int curmode; /* current phy mode */ |
1133 | diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c |
1134 | index ad1a5b4..9b40cbe 100644 |
1135 | --- a/drivers/net/wireless/ath5k/hw.c |
1136 | +++ b/drivers/net/wireless/ath5k/hw.c |
1137 | @@ -826,9 +826,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, |
1138 | mdelay(1); |
1139 | |
1140 | /* |
1141 | - * Write some more initial register settings |
1142 | + * Write some more initial register settings for revised chips |
1143 | */ |
1144 | - if (ah->ah_version == AR5K_AR5212) { |
1145 | + if (ah->ah_version == AR5K_AR5212 && |
1146 | + ah->ah_phy_revision > 0x41) { |
1147 | ath5k_hw_reg_write(ah, 0x0002a002, 0x982c); |
1148 | |
1149 | if (channel->hw_value == CHANNEL_G) |
1150 | @@ -847,19 +848,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, |
1151 | else |
1152 | ath5k_hw_reg_write(ah, 0x00000000, 0x994c); |
1153 | |
1154 | - /* Some bits are disabled here, we know nothing about |
1155 | - * register 0xa228 yet, most of the times this ends up |
1156 | - * with a value 0x9b5 -haven't seen any dump with |
1157 | - * a different value- */ |
1158 | - /* Got this from decompiling binary HAL */ |
1159 | - data = ath5k_hw_reg_read(ah, 0xa228); |
1160 | - data &= 0xfffffdff; |
1161 | - ath5k_hw_reg_write(ah, data, 0xa228); |
1162 | - |
1163 | - data = ath5k_hw_reg_read(ah, 0xa228); |
1164 | - data &= 0xfffe03ff; |
1165 | - ath5k_hw_reg_write(ah, data, 0xa228); |
1166 | - data = 0; |
1167 | + /* Got this from legacy-hal */ |
1168 | + AR5K_REG_DISABLE_BITS(ah, 0xa228, 0x200); |
1169 | + |
1170 | + AR5K_REG_MASKED_BITS(ah, 0xa228, 2 << 10, ~0x1fc00); |
1171 | |
1172 | /* Just write 0x9b5 ? */ |
1173 | /* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */ |
1174 | diff --git a/drivers/net/wireless/ath5k/initvals.c b/drivers/net/wireless/ath5k/initvals.c |
1175 | index 2806b21..cf7ebd1 100644 |
1176 | --- a/drivers/net/wireless/ath5k/initvals.c |
1177 | +++ b/drivers/net/wireless/ath5k/initvals.c |
1178 | @@ -810,6 +810,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = { |
1179 | { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, |
1180 | { AR5K_PHY(642), |
1181 | { 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } }, |
1182 | + { 0xa228, |
1183 | + { 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } }, |
1184 | { 0xa23c, |
1185 | { 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } }, |
1186 | }; |
1187 | diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h |
1188 | index ffdf487..a68f97c 100644 |
1189 | --- a/drivers/net/wireless/hostap/hostap_wlan.h |
1190 | +++ b/drivers/net/wireless/hostap/hostap_wlan.h |
1191 | @@ -918,9 +918,12 @@ struct hostap_interface { |
1192 | |
1193 | /* |
1194 | * TX meta data - stored in skb->cb buffer, so this must not be increased over |
1195 | - * the 40-byte limit |
1196 | + * the 48-byte limit. |
1197 | + * THE PADDING THIS STARTS WITH IS A HORRIBLE HACK THAT SHOULD NOT LIVE |
1198 | + * TO SEE THE DAY. |
1199 | */ |
1200 | struct hostap_skb_tx_data { |
1201 | + unsigned int __padding_for_default_qdiscs; |
1202 | u32 magic; /* HOSTAP_SKB_TX_DATA_MAGIC */ |
1203 | u8 rate; /* transmit rate */ |
1204 | #define HOSTAP_TX_FLAGS_WDS BIT(0) |
1205 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c |
1206 | index 72a6743..cf7056e 100644 |
1207 | --- a/drivers/net/wireless/iwlwifi/iwl-agn.c |
1208 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c |
1209 | @@ -3275,7 +3275,11 @@ static void iwl4965_mac_update_tkip_key(struct ieee80211_hw *hw, |
1210 | return; |
1211 | } |
1212 | |
1213 | - iwl_scan_cancel_timeout(priv, 100); |
1214 | + if (iwl_scan_cancel(priv)) { |
1215 | + /* cancel scan failed, just live w/ bad key and rely |
1216 | + briefly on SW decryption */ |
1217 | + return; |
1218 | + } |
1219 | |
1220 | key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK); |
1221 | key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); |
1222 | diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c |
1223 | index ca5deb6..0cebbc4 100644 |
1224 | --- a/drivers/net/wireless/rtl8187_dev.c |
1225 | +++ b/drivers/net/wireless/rtl8187_dev.c |
1226 | @@ -45,6 +45,9 @@ static struct usb_device_id rtl8187_table[] __devinitdata = { |
1227 | {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187}, |
1228 | /* Sitecom */ |
1229 | {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187}, |
1230 | + {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B}, |
1231 | + /* Abocom */ |
1232 | + {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187}, |
1233 | {} |
1234 | }; |
1235 | |
1236 | diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c |
1237 | index c1b9ea3..98b9df7 100644 |
1238 | --- a/drivers/pnp/pnpacpi/core.c |
1239 | +++ b/drivers/pnp/pnpacpi/core.c |
1240 | @@ -148,9 +148,13 @@ static int __init pnpacpi_add_device(struct acpi_device *device) |
1241 | acpi_status status; |
1242 | struct pnp_dev *dev; |
1243 | |
1244 | + /* |
1245 | + * If a PnPacpi device is not present , the device |
1246 | + * driver should not be loaded. |
1247 | + */ |
1248 | status = acpi_get_handle(device->handle, "_CRS", &temp); |
1249 | if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) || |
1250 | - is_exclusive_device(device)) |
1251 | + is_exclusive_device(device) || (!device->status.present)) |
1252 | return 0; |
1253 | |
1254 | dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device)); |
1255 | diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c |
1256 | index 1fe0901..7716145 100644 |
1257 | --- a/drivers/scsi/dpt_i2o.c |
1258 | +++ b/drivers/scsi/dpt_i2o.c |
1259 | @@ -2445,7 +2445,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd) |
1260 | hba_status = detailed_status >> 8; |
1261 | |
1262 | // calculate resid for sg |
1263 | - scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+5)); |
1264 | + scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+20)); |
1265 | |
1266 | pHba = (adpt_hba*) cmd->device->host->hostdata[0]; |
1267 | |
1268 | @@ -2456,7 +2456,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd) |
1269 | case I2O_SCSI_DSC_SUCCESS: |
1270 | cmd->result = (DID_OK << 16); |
1271 | // handle underflow |
1272 | - if(readl(reply+5) < cmd->underflow ) { |
1273 | + if (readl(reply+20) < cmd->underflow) { |
1274 | cmd->result = (DID_ERROR <<16); |
1275 | printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name); |
1276 | } |
1277 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
1278 | index 94a720e..00f6780 100644 |
1279 | --- a/drivers/scsi/qla2xxx/qla_def.h |
1280 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
1281 | @@ -2546,7 +2546,6 @@ typedef struct scsi_qla_host { |
1282 | uint8_t fcode_revision[16]; |
1283 | uint32_t fw_revision[4]; |
1284 | |
1285 | - uint16_t fdt_odd_index; |
1286 | uint32_t fdt_wrt_disable; |
1287 | uint32_t fdt_erase_cmd; |
1288 | uint32_t fdt_block_size; |
1289 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
1290 | index ee89ddd..3a0a178 100644 |
1291 | --- a/drivers/scsi/qla2xxx/qla_init.c |
1292 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
1293 | @@ -974,7 +974,6 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) |
1294 | &ha->fw_minor_version, |
1295 | &ha->fw_subminor_version, |
1296 | &ha->fw_attributes, &ha->fw_memory_size); |
1297 | - qla2x00_resize_request_q(ha); |
1298 | ha->flags.npiv_supported = 0; |
1299 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) || |
1300 | IS_QLA84XX(ha)) && |
1301 | @@ -986,6 +985,7 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) |
1302 | ha->max_npiv_vports = |
1303 | MIN_MULTI_ID_FABRIC - 1; |
1304 | } |
1305 | + qla2x00_resize_request_q(ha); |
1306 | |
1307 | if (ql2xallocfwdump) |
1308 | qla2x00_alloc_fw_dump(ha); |
1309 | diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c |
1310 | index 813bc77..c07e879 100644 |
1311 | --- a/drivers/scsi/qla2xxx/qla_mbx.c |
1312 | +++ b/drivers/scsi/qla2xxx/qla_mbx.c |
1313 | @@ -1964,7 +1964,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt, |
1314 | *cur_iocb_cnt = mcp->mb[7]; |
1315 | if (orig_iocb_cnt) |
1316 | *orig_iocb_cnt = mcp->mb[10]; |
1317 | - if (max_npiv_vports) |
1318 | + if (ha->flags.npiv_supported && max_npiv_vports) |
1319 | *max_npiv_vports = mcp->mb[11]; |
1320 | } |
1321 | |
1322 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
1323 | index 6d0f0e5..86e143c 100644 |
1324 | --- a/drivers/scsi/qla2xxx/qla_os.c |
1325 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
1326 | @@ -730,6 +730,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
1327 | if (ha->isp_ops->abort_command(ha, sp)) { |
1328 | DEBUG2(printk("%s(%ld): abort_command " |
1329 | "mbx failed.\n", __func__, ha->host_no)); |
1330 | + ret = FAILED; |
1331 | } else { |
1332 | DEBUG3(printk("%s(%ld): abort_command " |
1333 | "mbx success.\n", __func__, ha->host_no)); |
1334 | diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c |
1335 | index 1bca744..910c3b3 100644 |
1336 | --- a/drivers/scsi/qla2xxx/qla_sup.c |
1337 | +++ b/drivers/scsi/qla2xxx/qla_sup.c |
1338 | @@ -546,6 +546,7 @@ qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, |
1339 | void |
1340 | qla2xxx_get_flash_info(scsi_qla_host_t *ha) |
1341 | { |
1342 | +#define FLASH_BLK_SIZE_4K 0x1000 |
1343 | #define FLASH_BLK_SIZE_32K 0x8000 |
1344 | #define FLASH_BLK_SIZE_64K 0x10000 |
1345 | uint16_t cnt, chksum; |
1346 | @@ -577,7 +578,6 @@ qla2xxx_get_flash_info(scsi_qla_host_t *ha) |
1347 | goto no_flash_data; |
1348 | } |
1349 | |
1350 | - ha->fdt_odd_index = le16_to_cpu(fdt->man_id) == 0x1f; |
1351 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; |
1352 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd); |
1353 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); |
1354 | @@ -590,10 +590,10 @@ qla2xxx_get_flash_info(scsi_qla_host_t *ha) |
1355 | } |
1356 | |
1357 | DEBUG2(qla_printk(KERN_DEBUG, ha, "Flash[FDT]: (0x%x/0x%x) erase=0x%x " |
1358 | - "pro=%x upro=%x idx=%d wrtd=0x%x blk=0x%x.\n", |
1359 | + "pro=%x upro=%x wrtd=0x%x blk=0x%x.\n", |
1360 | le16_to_cpu(fdt->man_id), le16_to_cpu(fdt->id), ha->fdt_erase_cmd, |
1361 | ha->fdt_protect_sec_cmd, ha->fdt_unprotect_sec_cmd, |
1362 | - ha->fdt_odd_index, ha->fdt_wrt_disable, ha->fdt_block_size)); |
1363 | + ha->fdt_wrt_disable, ha->fdt_block_size)); |
1364 | return; |
1365 | |
1366 | no_flash_data: |
1367 | @@ -614,8 +614,7 @@ no_flash_data: |
1368 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; |
1369 | break; |
1370 | case 0x1f: /* Atmel 26DF081A. */ |
1371 | - ha->fdt_odd_index = 1; |
1372 | - ha->fdt_block_size = FLASH_BLK_SIZE_64K; |
1373 | + ha->fdt_block_size = FLASH_BLK_SIZE_4K; |
1374 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320); |
1375 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339); |
1376 | ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336); |
1377 | @@ -627,9 +626,9 @@ no_flash_data: |
1378 | } |
1379 | |
1380 | DEBUG2(qla_printk(KERN_DEBUG, ha, "Flash[MID]: (0x%x/0x%x) erase=0x%x " |
1381 | - "pro=%x upro=%x idx=%d wrtd=0x%x blk=0x%x.\n", man_id, flash_id, |
1382 | + "pro=%x upro=%x wrtd=0x%x blk=0x%x.\n", man_id, flash_id, |
1383 | ha->fdt_erase_cmd, ha->fdt_protect_sec_cmd, |
1384 | - ha->fdt_unprotect_sec_cmd, ha->fdt_odd_index, ha->fdt_wrt_disable, |
1385 | + ha->fdt_unprotect_sec_cmd, ha->fdt_wrt_disable, |
1386 | ha->fdt_block_size)); |
1387 | } |
1388 | |
1389 | @@ -710,13 +709,9 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, |
1390 | qla24xx_unprotect_flash(ha); |
1391 | |
1392 | for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { |
1393 | - if (ha->fdt_odd_index) { |
1394 | - findex = faddr << 2; |
1395 | - fdata = findex & sec_mask; |
1396 | - } else { |
1397 | - findex = faddr; |
1398 | - fdata = (findex & sec_mask) << 2; |
1399 | - } |
1400 | + |
1401 | + findex = faddr; |
1402 | + fdata = (findex & sec_mask) << 2; |
1403 | |
1404 | /* Are we at the beginning of a sector? */ |
1405 | if ((findex & rest_addr) == 0) { |
1406 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
1407 | index d996a61..61524fc 100644 |
1408 | --- a/drivers/usb/class/cdc-acm.c |
1409 | +++ b/drivers/usb/class/cdc-acm.c |
1410 | @@ -158,16 +158,12 @@ static int acm_wb_is_avail(struct acm *acm) |
1411 | } |
1412 | |
1413 | /* |
1414 | - * Finish write. |
1415 | + * Finish write. Caller must hold acm->write_lock |
1416 | */ |
1417 | static void acm_write_done(struct acm *acm, struct acm_wb *wb) |
1418 | { |
1419 | - unsigned long flags; |
1420 | - |
1421 | - spin_lock_irqsave(&acm->write_lock, flags); |
1422 | wb->use = 0; |
1423 | acm->transmitting--; |
1424 | - spin_unlock_irqrestore(&acm->write_lock, flags); |
1425 | } |
1426 | |
1427 | /* |
1428 | @@ -482,6 +478,7 @@ static void acm_write_bulk(struct urb *urb) |
1429 | { |
1430 | struct acm_wb *wb = urb->context; |
1431 | struct acm *acm = wb->instance; |
1432 | + unsigned long flags; |
1433 | |
1434 | if (verbose || urb->status |
1435 | || (urb->actual_length != urb->transfer_buffer_length)) |
1436 | @@ -490,7 +487,9 @@ static void acm_write_bulk(struct urb *urb) |
1437 | urb->transfer_buffer_length, |
1438 | urb->status); |
1439 | |
1440 | + spin_lock_irqsave(&acm->write_lock, flags); |
1441 | acm_write_done(acm, wb); |
1442 | + spin_unlock_irqrestore(&acm->write_lock, flags); |
1443 | if (ACM_READY(acm)) |
1444 | schedule_work(&acm->work); |
1445 | else |
1446 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
1447 | index 286b443..9cfa366 100644 |
1448 | --- a/drivers/usb/core/message.c |
1449 | +++ b/drivers/usb/core/message.c |
1450 | @@ -1091,6 +1091,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) |
1451 | continue; |
1452 | dev_dbg(&dev->dev, "unregistering interface %s\n", |
1453 | dev_name(&interface->dev)); |
1454 | + interface->unregistering = 1; |
1455 | usb_remove_sysfs_intf_files(interface); |
1456 | device_del(&interface->dev); |
1457 | } |
1458 | diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c |
1459 | index 5e1f5d5..668a6d6 100644 |
1460 | --- a/drivers/usb/core/sysfs.c |
1461 | +++ b/drivers/usb/core/sysfs.c |
1462 | @@ -816,7 +816,7 @@ int usb_create_sysfs_intf_files(struct usb_interface *intf) |
1463 | struct usb_host_interface *alt = intf->cur_altsetting; |
1464 | int retval; |
1465 | |
1466 | - if (intf->sysfs_files_created) |
1467 | + if (intf->sysfs_files_created || intf->unregistering) |
1468 | return 0; |
1469 | |
1470 | /* The interface string may be present in some altsettings |
1471 | diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c |
1472 | index 5ee1590..c1d34df 100644 |
1473 | --- a/drivers/usb/gadget/f_acm.c |
1474 | +++ b/drivers/usb/gadget/f_acm.c |
1475 | @@ -463,7 +463,11 @@ static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value, |
1476 | notify->wLength = cpu_to_le16(length); |
1477 | memcpy(buf, data, length); |
1478 | |
1479 | + /* ep_queue() can complete immediately if it fills the fifo... */ |
1480 | + spin_unlock(&acm->lock); |
1481 | status = usb_ep_queue(ep, req, GFP_ATOMIC); |
1482 | + spin_lock(&acm->lock); |
1483 | + |
1484 | if (status < 0) { |
1485 | ERROR(acm->port.func.config->cdev, |
1486 | "acm ttyGS%d can't notify serial state, %d\n", |
1487 | diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig |
1488 | index 228797e..a657c94 100644 |
1489 | --- a/drivers/usb/host/Kconfig |
1490 | +++ b/drivers/usb/host/Kconfig |
1491 | @@ -110,29 +110,18 @@ config USB_ISP116X_HCD |
1492 | |
1493 | config USB_ISP1760_HCD |
1494 | tristate "ISP 1760 HCD support" |
1495 | - depends on USB && EXPERIMENTAL |
1496 | + depends on USB && EXPERIMENTAL && (PCI || PPC_OF) |
1497 | ---help--- |
1498 | The ISP1760 chip is a USB 2.0 host controller. |
1499 | |
1500 | This driver does not support isochronous transfers or OTG. |
1501 | + This USB controller is usually attached to a non-DMA-Master |
1502 | + capable bus. NXP's eval kit brings this chip on PCI card |
1503 | + where the chip itself is behind a PLB to simulate such |
1504 | + a bus. |
1505 | |
1506 | To compile this driver as a module, choose M here: the |
1507 | - module will be called isp1760-hcd. |
1508 | - |
1509 | -config USB_ISP1760_PCI |
1510 | - bool "Support for the PCI bus" |
1511 | - depends on USB_ISP1760_HCD && PCI |
1512 | - ---help--- |
1513 | - Enables support for the device present on the PCI bus. |
1514 | - This should only be required if you happen to have the eval kit from |
1515 | - NXP and you are going to test it. |
1516 | - |
1517 | -config USB_ISP1760_OF |
1518 | - bool "Support for the OF platform bus" |
1519 | - depends on USB_ISP1760_HCD && PPC_OF |
1520 | - ---help--- |
1521 | - Enables support for the device present on the PowerPC |
1522 | - OpenFirmware platform bus. |
1523 | + module will be called isp1760. |
1524 | |
1525 | config USB_OHCI_HCD |
1526 | tristate "OHCI HCD support" |
1527 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
1528 | index 86e38b0..dc21ade 100644 |
1529 | --- a/drivers/usb/host/ehci-hcd.c |
1530 | +++ b/drivers/usb/host/ehci-hcd.c |
1531 | @@ -643,7 +643,7 @@ static int ehci_run (struct usb_hcd *hcd) |
1532 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
1533 | { |
1534 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
1535 | - u32 status, pcd_status = 0, cmd; |
1536 | + u32 status, masked_status, pcd_status = 0, cmd; |
1537 | int bh; |
1538 | |
1539 | spin_lock (&ehci->lock); |
1540 | @@ -656,14 +656,14 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
1541 | goto dead; |
1542 | } |
1543 | |
1544 | - status &= INTR_MASK; |
1545 | - if (!status) { /* irq sharing? */ |
1546 | + masked_status = status & INTR_MASK; |
1547 | + if (!masked_status) { /* irq sharing? */ |
1548 | spin_unlock(&ehci->lock); |
1549 | return IRQ_NONE; |
1550 | } |
1551 | |
1552 | /* clear (just) interrupts */ |
1553 | - ehci_writel(ehci, status, &ehci->regs->status); |
1554 | + ehci_writel(ehci, masked_status, &ehci->regs->status); |
1555 | cmd = ehci_readl(ehci, &ehci->regs->command); |
1556 | bh = 0; |
1557 | |
1558 | @@ -731,19 +731,18 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
1559 | |
1560 | /* PCI errors [4.15.2.4] */ |
1561 | if (unlikely ((status & STS_FATAL) != 0)) { |
1562 | + ehci_err(ehci, "fatal error\n"); |
1563 | dbg_cmd (ehci, "fatal", ehci_readl(ehci, |
1564 | &ehci->regs->command)); |
1565 | dbg_status (ehci, "fatal", status); |
1566 | - if (status & STS_HALT) { |
1567 | - ehci_err (ehci, "fatal error\n"); |
1568 | + ehci_halt(ehci); |
1569 | dead: |
1570 | - ehci_reset (ehci); |
1571 | - ehci_writel(ehci, 0, &ehci->regs->configured_flag); |
1572 | - /* generic layer kills/unlinks all urbs, then |
1573 | - * uses ehci_stop to clean up the rest |
1574 | - */ |
1575 | - bh = 1; |
1576 | - } |
1577 | + ehci_reset(ehci); |
1578 | + ehci_writel(ehci, 0, &ehci->regs->configured_flag); |
1579 | + /* generic layer kills/unlinks all urbs, then |
1580 | + * uses ehci_stop to clean up the rest |
1581 | + */ |
1582 | + bh = 1; |
1583 | } |
1584 | |
1585 | if (bh) |
1586 | diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c |
1587 | index 0eba894..9c9da35 100644 |
1588 | --- a/drivers/usb/host/ehci-ps3.c |
1589 | +++ b/drivers/usb/host/ehci-ps3.c |
1590 | @@ -205,6 +205,7 @@ static int ps3_ehci_remove(struct ps3_system_bus_device *dev) |
1591 | |
1592 | tmp = hcd->irq; |
1593 | |
1594 | + ehci_shutdown(hcd); |
1595 | usb_remove_hcd(hcd); |
1596 | |
1597 | ps3_system_bus_set_driver_data(dev, NULL); |
1598 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
1599 | index 4a0c5a7..a081ee6 100644 |
1600 | --- a/drivers/usb/host/ehci-sched.c |
1601 | +++ b/drivers/usb/host/ehci-sched.c |
1602 | @@ -918,7 +918,7 @@ iso_stream_init ( |
1603 | */ |
1604 | stream->usecs = HS_USECS_ISO (maxp); |
1605 | bandwidth = stream->usecs * 8; |
1606 | - bandwidth /= 1 << (interval - 1); |
1607 | + bandwidth /= interval; |
1608 | |
1609 | } else { |
1610 | u32 addr; |
1611 | @@ -951,7 +951,7 @@ iso_stream_init ( |
1612 | } else |
1613 | stream->raw_mask = smask_out [hs_transfers - 1]; |
1614 | bandwidth = stream->usecs + stream->c_usecs; |
1615 | - bandwidth /= 1 << (interval + 2); |
1616 | + bandwidth /= interval << 3; |
1617 | |
1618 | /* stream->splits gets created from raw_mask later */ |
1619 | stream->address = cpu_to_hc32(ehci, addr); |
1620 | diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c |
1621 | index 051ef7b..78b8aaa 100644 |
1622 | --- a/drivers/usb/host/isp1760-if.c |
1623 | +++ b/drivers/usb/host/isp1760-if.c |
1624 | @@ -14,16 +14,16 @@ |
1625 | #include "../core/hcd.h" |
1626 | #include "isp1760-hcd.h" |
1627 | |
1628 | -#ifdef CONFIG_USB_ISP1760_OF |
1629 | +#ifdef CONFIG_PPC_OF |
1630 | #include <linux/of.h> |
1631 | #include <linux/of_platform.h> |
1632 | #endif |
1633 | |
1634 | -#ifdef CONFIG_USB_ISP1760_PCI |
1635 | +#ifdef CONFIG_PCI |
1636 | #include <linux/pci.h> |
1637 | #endif |
1638 | |
1639 | -#ifdef CONFIG_USB_ISP1760_OF |
1640 | +#ifdef CONFIG_PPC_OF |
1641 | static int of_isp1760_probe(struct of_device *dev, |
1642 | const struct of_device_id *match) |
1643 | { |
1644 | @@ -128,7 +128,7 @@ static struct of_platform_driver isp1760_of_driver = { |
1645 | }; |
1646 | #endif |
1647 | |
1648 | -#ifdef CONFIG_USB_ISP1760_PCI |
1649 | +#ifdef CONFIG_PCI |
1650 | static u32 nxp_pci_io_base; |
1651 | static u32 iolength; |
1652 | static u32 pci_mem_phy0; |
1653 | @@ -287,28 +287,28 @@ static struct pci_driver isp1761_pci_driver = { |
1654 | |
1655 | static int __init isp1760_init(void) |
1656 | { |
1657 | - int ret = -ENODEV; |
1658 | + int ret; |
1659 | |
1660 | init_kmem_once(); |
1661 | |
1662 | -#ifdef CONFIG_USB_ISP1760_OF |
1663 | +#ifdef CONFIG_PPC_OF |
1664 | ret = of_register_platform_driver(&isp1760_of_driver); |
1665 | if (ret) { |
1666 | deinit_kmem_cache(); |
1667 | return ret; |
1668 | } |
1669 | #endif |
1670 | -#ifdef CONFIG_USB_ISP1760_PCI |
1671 | +#ifdef CONFIG_PCI |
1672 | ret = pci_register_driver(&isp1761_pci_driver); |
1673 | if (ret) |
1674 | goto unreg_of; |
1675 | #endif |
1676 | return ret; |
1677 | |
1678 | -#ifdef CONFIG_USB_ISP1760_PCI |
1679 | +#ifdef CONFIG_PCI |
1680 | unreg_of: |
1681 | #endif |
1682 | -#ifdef CONFIG_USB_ISP1760_OF |
1683 | +#ifdef CONFIG_PPC_OF |
1684 | of_unregister_platform_driver(&isp1760_of_driver); |
1685 | #endif |
1686 | deinit_kmem_cache(); |
1687 | @@ -318,10 +318,10 @@ module_init(isp1760_init); |
1688 | |
1689 | static void __exit isp1760_exit(void) |
1690 | { |
1691 | -#ifdef CONFIG_USB_ISP1760_OF |
1692 | +#ifdef CONFIG_PPC_OF |
1693 | of_unregister_platform_driver(&isp1760_of_driver); |
1694 | #endif |
1695 | -#ifdef CONFIG_USB_ISP1760_PCI |
1696 | +#ifdef CONFIG_PCI |
1697 | pci_unregister_driver(&isp1761_pci_driver); |
1698 | #endif |
1699 | deinit_kmem_cache(); |
1700 | diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c |
1701 | index 2089d8a..3c1a3b5 100644 |
1702 | --- a/drivers/usb/host/ohci-ps3.c |
1703 | +++ b/drivers/usb/host/ohci-ps3.c |
1704 | @@ -192,7 +192,7 @@ fail_start: |
1705 | return result; |
1706 | } |
1707 | |
1708 | -static int ps3_ohci_remove (struct ps3_system_bus_device *dev) |
1709 | +static int ps3_ohci_remove(struct ps3_system_bus_device *dev) |
1710 | { |
1711 | unsigned int tmp; |
1712 | struct usb_hcd *hcd = |
1713 | @@ -205,6 +205,7 @@ static int ps3_ohci_remove (struct ps3_system_bus_device *dev) |
1714 | |
1715 | tmp = hcd->irq; |
1716 | |
1717 | + ohci_shutdown(hcd); |
1718 | usb_remove_hcd(hcd); |
1719 | |
1720 | ps3_system_bus_set_driver_data(dev, NULL); |
1721 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
1722 | index 061df9b..ccebf89 100644 |
1723 | --- a/drivers/usb/storage/unusual_devs.h |
1724 | +++ b/drivers/usb/storage/unusual_devs.h |
1725 | @@ -1251,6 +1251,13 @@ UNUSUAL_DEV( 0x0839, 0x000a, 0x0001, 0x0001, |
1726 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1727 | US_FL_FIX_INQUIRY), |
1728 | |
1729 | +/* Reported by Luciano Rocha <luciano@eurotux.com> */ |
1730 | +UNUSUAL_DEV( 0x0840, 0x0082, 0x0001, 0x0001, |
1731 | + "Argosy", |
1732 | + "Storage", |
1733 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1734 | + US_FL_FIX_CAPACITY), |
1735 | + |
1736 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. |
1737 | * Flag will support Bulk devices which use a standards-violating 32-byte |
1738 | * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with |
1739 | diff --git a/fs/namespace.c b/fs/namespace.c |
1740 | index 6e283c9..1bd5ba2 100644 |
1741 | --- a/fs/namespace.c |
1742 | +++ b/fs/namespace.c |
1743 | @@ -1553,8 +1553,13 @@ static noinline int do_remount(struct nameidata *nd, int flags, int mnt_flags, |
1744 | if (!err) |
1745 | nd->path.mnt->mnt_flags = mnt_flags; |
1746 | up_write(&sb->s_umount); |
1747 | - if (!err) |
1748 | + if (!err) { |
1749 | security_sb_post_remount(nd->path.mnt, flags, data); |
1750 | + |
1751 | + spin_lock(&vfsmount_lock); |
1752 | + touch_mnt_namespace(nd->path.mnt->mnt_ns); |
1753 | + spin_unlock(&vfsmount_lock); |
1754 | + } |
1755 | return err; |
1756 | } |
1757 | |
1758 | diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c |
1759 | index f9a8b89..7a510a6 100644 |
1760 | --- a/fs/proc/proc_sysctl.c |
1761 | +++ b/fs/proc/proc_sysctl.c |
1762 | @@ -31,6 +31,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, |
1763 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
1764 | inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */ |
1765 | inode->i_mode = table->mode; |
1766 | + inode->i_uid = inode->i_gid = 0; |
1767 | if (!table->child) { |
1768 | inode->i_mode |= S_IFREG; |
1769 | inode->i_op = &proc_sys_inode_operations; |
1770 | diff --git a/include/linux/bio.h b/include/linux/bio.h |
1771 | index 0933a14..3d83947 100644 |
1772 | --- a/include/linux/bio.h |
1773 | +++ b/include/linux/bio.h |
1774 | @@ -98,6 +98,13 @@ struct bio { |
1775 | unsigned int bi_size; /* residual I/O count */ |
1776 | |
1777 | /* |
1778 | + * To keep track of the max segment size, we account for the |
1779 | + * sizes of the first and last mergeable segments in this bio. |
1780 | + */ |
1781 | + unsigned int bi_seg_front_size; |
1782 | + unsigned int bi_seg_back_size; |
1783 | + |
1784 | + /* |
1785 | * To keep track of the max hw size, we account for the |
1786 | * sizes of the first and last virtually mergeable segments |
1787 | * in this bio |
1788 | diff --git a/include/linux/usb.h b/include/linux/usb.h |
1789 | index 94ac74a..2e434dc 100644 |
1790 | --- a/include/linux/usb.h |
1791 | +++ b/include/linux/usb.h |
1792 | @@ -108,6 +108,7 @@ enum usb_interface_condition { |
1793 | * (in probe()), bound to a driver, or unbinding (in disconnect()) |
1794 | * @is_active: flag set when the interface is bound and not suspended. |
1795 | * @sysfs_files_created: sysfs attributes exist |
1796 | + * @unregistering: flag set when the interface is being unregistered |
1797 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup |
1798 | * capability during autosuspend. |
1799 | * @needs_altsetting0: flag set when a set-interface request for altsetting 0 |
1800 | @@ -163,6 +164,7 @@ struct usb_interface { |
1801 | enum usb_interface_condition condition; /* state of binding */ |
1802 | unsigned is_active:1; /* the interface is not suspended */ |
1803 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ |
1804 | + unsigned unregistering:1; /* unregistration is in progress */ |
1805 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ |
1806 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ |
1807 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ |
1808 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
1809 | index 77427c8..81e9a82 100644 |
1810 | --- a/mm/hugetlb.c |
1811 | +++ b/mm/hugetlb.c |
1812 | @@ -1797,6 +1797,7 @@ int unmap_ref_private(struct mm_struct *mm, |
1813 | struct page *page, |
1814 | unsigned long address) |
1815 | { |
1816 | + struct hstate *h = hstate_vma(vma); |
1817 | struct vm_area_struct *iter_vma; |
1818 | struct address_space *mapping; |
1819 | struct prio_tree_iter iter; |
1820 | @@ -1806,7 +1807,7 @@ int unmap_ref_private(struct mm_struct *mm, |
1821 | * vm_pgoff is in PAGE_SIZE units, hence the different calculation |
1822 | * from page cache lookup which is in HPAGE_SIZE units. |
1823 | */ |
1824 | - address = address & huge_page_mask(hstate_vma(vma)); |
1825 | + address = address & huge_page_mask(h); |
1826 | pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) |
1827 | + (vma->vm_pgoff >> PAGE_SHIFT); |
1828 | mapping = (struct address_space *)page_private(page); |
1829 | @@ -1825,7 +1826,7 @@ int unmap_ref_private(struct mm_struct *mm, |
1830 | */ |
1831 | if (!is_vma_resv_set(iter_vma, HPAGE_RESV_OWNER)) |
1832 | unmap_hugepage_range(iter_vma, |
1833 | - address, address + HPAGE_SIZE, |
1834 | + address, address + huge_page_size(h), |
1835 | page); |
1836 | } |
1837 | |
1838 | diff --git a/mm/page_isolation.c b/mm/page_isolation.c |
1839 | index b70a7fe..5e0ffd9 100644 |
1840 | --- a/mm/page_isolation.c |
1841 | +++ b/mm/page_isolation.c |
1842 | @@ -130,10 +130,11 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) |
1843 | if (page && get_pageblock_migratetype(page) != MIGRATE_ISOLATE) |
1844 | break; |
1845 | } |
1846 | - if (pfn < end_pfn) |
1847 | + page = __first_valid_page(start_pfn, end_pfn - start_pfn); |
1848 | + if ((pfn < end_pfn) || !page) |
1849 | return -EBUSY; |
1850 | /* Check all pages are free or Marked as ISOLATED */ |
1851 | - zone = page_zone(pfn_to_page(pfn)); |
1852 | + zone = page_zone(page); |
1853 | spin_lock_irqsave(&zone->lock, flags); |
1854 | ret = __test_page_isolated_in_pageblock(start_pfn, end_pfn); |
1855 | spin_unlock_irqrestore(&zone->lock, flags); |
1856 | diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c |
1857 | index 8f5a403..a631a1f 100644 |
1858 | --- a/net/ipv4/proc.c |
1859 | +++ b/net/ipv4/proc.c |
1860 | @@ -237,43 +237,45 @@ static const struct snmp_mib snmp4_net_list[] = { |
1861 | SNMP_MIB_SENTINEL |
1862 | }; |
1863 | |
1864 | +static void icmpmsg_put_line(struct seq_file *seq, unsigned long *vals, |
1865 | + unsigned short *type, int count) |
1866 | +{ |
1867 | + int j; |
1868 | + |
1869 | + if (count) { |
1870 | + seq_printf(seq, "\nIcmpMsg:"); |
1871 | + for (j = 0; j < count; ++j) |
1872 | + seq_printf(seq, " %sType%u", |
1873 | + type[j] & 0x100 ? "Out" : "In", |
1874 | + type[j] & 0xff); |
1875 | + seq_printf(seq, "\nIcmpMsg:"); |
1876 | + for (j = 0; j < count; ++j) |
1877 | + seq_printf(seq, " %lu", vals[j]); |
1878 | + } |
1879 | +} |
1880 | + |
1881 | static void icmpmsg_put(struct seq_file *seq) |
1882 | { |
1883 | #define PERLINE 16 |
1884 | |
1885 | - int j, i, count; |
1886 | - static int out[PERLINE]; |
1887 | + int i, count; |
1888 | + unsigned short type[PERLINE]; |
1889 | + unsigned long vals[PERLINE], val; |
1890 | struct net *net = seq->private; |
1891 | |
1892 | count = 0; |
1893 | for (i = 0; i < ICMPMSG_MIB_MAX; i++) { |
1894 | - |
1895 | - if (snmp_fold_field((void **) net->mib.icmpmsg_statistics, i)) |
1896 | - out[count++] = i; |
1897 | - if (count < PERLINE) |
1898 | - continue; |
1899 | - |
1900 | - seq_printf(seq, "\nIcmpMsg:"); |
1901 | - for (j = 0; j < PERLINE; ++j) |
1902 | - seq_printf(seq, " %sType%u", i & 0x100 ? "Out" : "In", |
1903 | - i & 0xff); |
1904 | - seq_printf(seq, "\nIcmpMsg: "); |
1905 | - for (j = 0; j < PERLINE; ++j) |
1906 | - seq_printf(seq, " %lu", |
1907 | - snmp_fold_field((void **) net->mib.icmpmsg_statistics, |
1908 | - out[j])); |
1909 | - seq_putc(seq, '\n'); |
1910 | - } |
1911 | - if (count) { |
1912 | - seq_printf(seq, "\nIcmpMsg:"); |
1913 | - for (j = 0; j < count; ++j) |
1914 | - seq_printf(seq, " %sType%u", out[j] & 0x100 ? "Out" : |
1915 | - "In", out[j] & 0xff); |
1916 | - seq_printf(seq, "\nIcmpMsg:"); |
1917 | - for (j = 0; j < count; ++j) |
1918 | - seq_printf(seq, " %lu", snmp_fold_field((void **) |
1919 | - net->mib.icmpmsg_statistics, out[j])); |
1920 | + val = snmp_fold_field((void **) net->mib.icmpmsg_statistics, i); |
1921 | + if (val) { |
1922 | + type[count] = i; |
1923 | + vals[count++] = val; |
1924 | + } |
1925 | + if (count == PERLINE) { |
1926 | + icmpmsg_put_line(seq, vals, type, count); |
1927 | + count = 0; |
1928 | + } |
1929 | } |
1930 | + icmpmsg_put_line(seq, vals, type, count); |
1931 | |
1932 | #undef PERLINE |
1933 | } |
1934 | diff --git a/scripts/package/builddeb b/scripts/package/builddeb |
1935 | index ba6bf5d..1264b8e 100644 |
1936 | --- a/scripts/package/builddeb |
1937 | +++ b/scripts/package/builddeb |
1938 | @@ -15,15 +15,18 @@ set -e |
1939 | version=$KERNELRELEASE |
1940 | revision=`cat .version` |
1941 | tmpdir="$objtree/debian/tmp" |
1942 | +fwdir="$objtree/debian/fwtmp" |
1943 | packagename=linux-$version |
1944 | +fwpackagename=linux-firmware-image |
1945 | |
1946 | if [ "$ARCH" == "um" ] ; then |
1947 | packagename=user-mode-linux-$version |
1948 | fi |
1949 | |
1950 | # Setup the directory structure |
1951 | -rm -rf "$tmpdir" |
1952 | +rm -rf "$tmpdir" "$fwdir" |
1953 | mkdir -p "$tmpdir/DEBIAN" "$tmpdir/lib" "$tmpdir/boot" |
1954 | +mkdir -p "$fwdir/DEBIAN" "$fwdir/lib" |
1955 | if [ "$ARCH" == "um" ] ; then |
1956 | mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/share/doc/$packagename" "$tmpdir/usr/bin" |
1957 | fi |
1958 | @@ -107,6 +110,7 @@ Standards-Version: 3.6.1 |
1959 | |
1960 | Package: $packagename |
1961 | Provides: kernel-image-$version, linux-image-$version |
1962 | +Suggests: $fwpackagename |
1963 | Architecture: any |
1964 | Description: Linux kernel, version $version |
1965 | This package contains the Linux kernel, modules and corresponding other |
1966 | @@ -118,8 +122,24 @@ fi |
1967 | chown -R root:root "$tmpdir" |
1968 | chmod -R go-w "$tmpdir" |
1969 | |
1970 | +# Do we have firmware? Move it out of the way and build it into a package. |
1971 | +if [ -e "$tmpdir/lib/firmware" ]; then |
1972 | + mv "$tmpdir/lib/firmware" "$fwdir/lib/" |
1973 | + |
1974 | + cat <<EOF >> debian/control |
1975 | + |
1976 | +Package: $fwpackagename |
1977 | +Architecture: all |
1978 | +Description: Linux kernel firmware, version $version |
1979 | + This package contains firmware from the Linux kernel, version $version |
1980 | +EOF |
1981 | + |
1982 | + dpkg-gencontrol -isp -p$fwpackagename -P"$fwdir" |
1983 | + dpkg --build "$fwdir" .. |
1984 | +fi |
1985 | + |
1986 | # Perform the final magic |
1987 | -dpkg-gencontrol -isp |
1988 | +dpkg-gencontrol -isp -p$packagename |
1989 | dpkg --build "$tmpdir" .. |
1990 | |
1991 | exit 0 |