View | Details | Raw Unified | Return to bug 3851 | Differences between
and this patch

Collapse All | Expand All

(-)linux-2.6.13-rc6/drivers/acpi/ec.c.0 (-112 / +59 lines)
Lines 212-230 Link Here
212
	ec->burst.expect_event = event;
212
	ec->burst.expect_event = event;
213
	smp_mb();
213
	smp_mb();
214
214
215
	result = wait_event_interruptible_timeout(ec->burst.wait,
215
	switch (event) {
216
						  !ec->burst.expect_event,
216
	case ACPI_EC_EVENT_OBF:
217
						  msecs_to_jiffies
217
		if (acpi_ec_read_status(ec) & event) {
218
						  (ACPI_EC_DELAY));
218
			ec->burst.expect_event = 0;
219
			return_VALUE(0);
220
		}
221
		break;
222
223
	case ACPI_EC_EVENT_IBE:
224
		if (~acpi_ec_read_status(ec) & event) {
225
			ec->burst.expect_event = 0;
226
			return_VALUE(0);
227
		}
228
		break;
229
	}
230
231
	result = wait_event_timeout(ec->burst.wait,
232
				    !ec->burst.expect_event,
233
				    msecs_to_jiffies(ACPI_EC_DELAY));
219
234
220
	ec->burst.expect_event = 0;
235
	ec->burst.expect_event = 0;
221
	smp_mb();
236
	smp_mb();
222
237
223
	if (result < 0) {
224
		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, " result  = %d ", result));
225
		return_VALUE(result);
226
	}
227
228
	/*
238
	/*
229
	 * Verify that the event in question has actually happened by
239
	 * Verify that the event in question has actually happened by
230
	 * querying EC status. Do the check even if operation timed-out
240
	 * querying EC status. Do the check even if operation timed-out
Lines 254-268 Link Here
254
264
255
	status = acpi_ec_read_status(ec);
265
	status = acpi_ec_read_status(ec);
256
	if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) {
266
	if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) {
267
		status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
268
		if (status)
269
			goto end;
257
		acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
270
		acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
258
					&ec->common.command_addr);
271
					&ec->common.command_addr);
259
		status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
272
		status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
260
		if (status) {
273
		if (status)
261
			acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
262
			return_VALUE(-EINVAL);
274
			return_VALUE(-EINVAL);
263
		}
264
		acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
275
		acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
265
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
266
		if (tmp != 0x90) {	/* Burst ACK byte */
276
		if (tmp != 0x90) {	/* Burst ACK byte */
267
			return_VALUE(-EINVAL);
277
			return_VALUE(-EINVAL);
268
		}
278
		}
Lines 270-299 Link Here
270
280
271
	atomic_set(&ec->burst.leaving_burst, 0);
281
	atomic_set(&ec->burst.leaving_burst, 0);
272
	return_VALUE(0);
282
	return_VALUE(0);
283
      end:
284
	printk("Error in acpi_ec_wait\n");
285
	return_VALUE(-1);
273
}
286
}
274
287
275
static int acpi_ec_leave_burst_mode(union acpi_ec *ec)
288
static int acpi_ec_leave_burst_mode(union acpi_ec *ec)
276
{
289
{
277
	int status = 0;
278
290
279
	ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
291
	ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
280
292
281
	atomic_set(&ec->burst.leaving_burst, 1);
293
	atomic_set(&ec->burst.leaving_burst, 1);
282
	status = acpi_ec_read_status(ec);
283
	if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)) {
284
		acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE,
285
					&ec->common.command_addr);
286
		status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
287
		if (status) {
288
			acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
289
			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
290
					  "------->wait fail\n"));
291
			return_VALUE(-EINVAL);
292
		}
293
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
294
		status = acpi_ec_read_status(ec);
295
	}
296
297
	return_VALUE(0);
294
	return_VALUE(0);
298
}
295
}
299
296
Lines 416-422 Link Here
416
	if (!ec || !data)
413
	if (!ec || !data)
417
		return_VALUE(-EINVAL);
414
		return_VALUE(-EINVAL);
418
415
419
      retry:
420
	*data = 0;
416
	*data = 0;
421
417
422
	if (ec->common.global_lock) {
418
	if (ec->common.global_lock) {
Lines 428-454 Link Here
428
	WARN_ON(in_interrupt());
424
	WARN_ON(in_interrupt());
429
	down(&ec->burst.sem);
425
	down(&ec->burst.sem);
430
426
431
	if (acpi_ec_enter_burst_mode(ec))
427
	acpi_ec_enter_burst_mode(ec);
428
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
429
	if (status) {
430
		printk("read EC, IB not empty\n");
432
		goto end;
431
		goto end;
433
432
	}
434
	acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
433
	acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
435
				&ec->common.command_addr);
434
				&ec->common.command_addr);
436
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
435
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
437
	acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
438
	if (status) {
436
	if (status) {
439
		goto end;
437
		printk("read EC, IB not empty\n");
440
	}
438
	}
441
439
442
	acpi_hw_low_level_write(8, address, &ec->common.data_addr);
440
	acpi_hw_low_level_write(8, address, &ec->common.data_addr);
443
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
441
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
444
	if (status) {
442
	if (status) {
445
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
443
		printk("read EC, OB not full\n");
446
		goto end;
444
		goto end;
447
	}
445
	}
448
449
	acpi_hw_low_level_read(8, data, &ec->common.data_addr);
446
	acpi_hw_low_level_read(8, data, &ec->common.data_addr);
450
	acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
451
452
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
447
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
453
			  *data, address));
448
			  *data, address));
454
449
Lines 459-473 Link Here
459
	if (ec->common.global_lock)
454
	if (ec->common.global_lock)
460
		acpi_release_global_lock(glk);
455
		acpi_release_global_lock(glk);
461
456
462
	if (atomic_read(&ec->burst.leaving_burst) == 2) {
463
		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aborted, retry ...\n"));
464
		while (atomic_read(&ec->burst.pending_gpe)) {
465
			msleep(1);
466
		}
467
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
468
		goto retry;
469
	}
470
471
	return_VALUE(status);
457
	return_VALUE(status);
472
}
458
}
473
459
Lines 475-487 Link Here
475
{
461
{
476
	int status = 0;
462
	int status = 0;
477
	u32 glk;
463
	u32 glk;
478
	u32 tmp;
479
464
480
	ACPI_FUNCTION_TRACE("acpi_ec_write");
465
	ACPI_FUNCTION_TRACE("acpi_ec_write");
481
466
482
	if (!ec)
467
	if (!ec)
483
		return_VALUE(-EINVAL);
468
		return_VALUE(-EINVAL);
484
      retry:
469
485
	if (ec->common.global_lock) {
470
	if (ec->common.global_lock) {
486
		status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
471
		status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
487
		if (ACPI_FAILURE(status))
472
		if (ACPI_FAILURE(status))
Lines 491-552 Link Here
491
	WARN_ON(in_interrupt());
476
	WARN_ON(in_interrupt());
492
	down(&ec->burst.sem);
477
	down(&ec->burst.sem);
493
478
494
	if (acpi_ec_enter_burst_mode(ec))
479
	acpi_ec_enter_burst_mode(ec);
495
		goto end;
496
480
497
	status = acpi_ec_read_status(ec);
481
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
498
	if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) {
482
	if (status) {
499
		acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
483
		printk("write EC, IB not empty\n");
500
					&ec->common.command_addr);
501
		status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
502
		if (status)
503
			goto end;
504
		acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
505
		if (tmp != 0x90)	/* Burst ACK byte */
506
			goto end;
507
	}
484
	}
508
	/*Now we are in burst mode */
509
510
	acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
485
	acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
511
				&ec->common.command_addr);
486
				&ec->common.command_addr);
512
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
487
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
513
	acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
514
	if (status) {
488
	if (status) {
515
		goto end;
489
		printk("write EC, IB not empty\n");
516
	}
490
	}
517
491
518
	acpi_hw_low_level_write(8, address, &ec->common.data_addr);
492
	acpi_hw_low_level_write(8, address, &ec->common.data_addr);
519
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
493
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
520
	if (status) {
494
	if (status) {
521
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
495
		printk("write EC, IB not empty\n");
522
		goto end;
523
	}
496
	}
524
497
525
	acpi_hw_low_level_write(8, data, &ec->common.data_addr);
498
	acpi_hw_low_level_write(8, data, &ec->common.data_addr);
526
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
527
	acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
528
	if (status)
529
		goto end;
530
499
531
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
500
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
532
			  data, address));
501
			  data, address));
533
502
534
      end:
535
	acpi_ec_leave_burst_mode(ec);
503
	acpi_ec_leave_burst_mode(ec);
536
	up(&ec->burst.sem);
504
	up(&ec->burst.sem);
537
505
538
	if (ec->common.global_lock)
506
	if (ec->common.global_lock)
539
		acpi_release_global_lock(glk);
507
		acpi_release_global_lock(glk);
540
508
541
	if (atomic_read(&ec->burst.leaving_burst) == 2) {
542
		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aborted, retry ...\n"));
543
		while (atomic_read(&ec->burst.pending_gpe)) {
544
			msleep(1);
545
		}
546
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
547
		goto retry;
548
	}
549
550
	return_VALUE(status);
509
	return_VALUE(status);
551
}
510
}
552
511
Lines 662-669 Link Here
662
	}
621
	}
663
622
664
	down(&ec->burst.sem);
623
	down(&ec->burst.sem);
665
	if (acpi_ec_enter_burst_mode(ec))
624
625
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
626
	if (status) {
627
		printk("query EC, IB not empty\n");
666
		goto end;
628
		goto end;
629
	}
667
	/*
630
	/*
668
	 * Query the EC to find out which _Qxx method we need to evaluate.
631
	 * Query the EC to find out which _Qxx method we need to evaluate.
669
	 * Note that successful completion of the query causes the ACPI_EC_SCI
632
	 * Note that successful completion of the query causes the ACPI_EC_SCI
Lines 673-699 Link Here
673
				&ec->common.command_addr);
636
				&ec->common.command_addr);
674
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
637
	status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
675
	if (status) {
638
	if (status) {
676
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
639
		printk("query EC, OB not full\n");
677
		goto end;
640
		goto end;
678
	}
641
	}
679
642
680
	acpi_hw_low_level_read(8, data, &ec->common.data_addr);
643
	acpi_hw_low_level_read(8, data, &ec->common.data_addr);
681
	acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
682
	if (!*data)
644
	if (!*data)
683
		status = -ENODATA;
645
		status = -ENODATA;
684
646
685
      end:
647
      end:
686
	acpi_ec_leave_burst_mode(ec);
687
	up(&ec->burst.sem);
648
	up(&ec->burst.sem);
688
649
689
	if (ec->common.global_lock)
650
	if (ec->common.global_lock)
690
		acpi_release_global_lock(glk);
651
		acpi_release_global_lock(glk);
691
652
692
	if (atomic_read(&ec->burst.leaving_burst) == 2) {
693
		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aborted, retry ...\n"));
694
		acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
695
		status = -ENODATA;
696
	}
697
	return_VALUE(status);
653
	return_VALUE(status);
698
}
654
}
699
655
Lines 818-848 Link Here
818
	if (!ec)
774
	if (!ec)
819
		return ACPI_INTERRUPT_NOT_HANDLED;
775
		return ACPI_INTERRUPT_NOT_HANDLED;
820
776
821
	acpi_disable_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
777
	acpi_clear_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
822
823
	value = acpi_ec_read_status(ec);
778
	value = acpi_ec_read_status(ec);
824
779
825
	if ((value & ACPI_EC_FLAG_IBF) &&
780
	switch (ec->burst.expect_event) {
826
	    !(value & ACPI_EC_FLAG_BURST) &&
781
	case ACPI_EC_EVENT_OBF:
827
	    (atomic_read(&ec->burst.leaving_burst) == 0)) {
782
		if (!(value & ACPI_EC_FLAG_OBF))
828
		/*
783
			break;
829
		 * the embedded controller disables 
784
	case ACPI_EC_EVENT_IBE:
830
		 * burst mode for any reason other 
785
		if ((value & ACPI_EC_FLAG_IBF))
831
		 * than the burst disable command
786
			break;
832
		 * to process critical event.
787
		ec->burst.expect_event = 0;
833
		 */
834
		atomic_set(&ec->burst.leaving_burst, 2);	/* block current pending transaction
835
								   and retry */
836
		wake_up(&ec->burst.wait);
788
		wake_up(&ec->burst.wait);
837
	} else {
789
		return ACPI_INTERRUPT_HANDLED;
838
		if ((ec->burst.expect_event == ACPI_EC_EVENT_OBF &&
790
	default:
839
		     (value & ACPI_EC_FLAG_OBF)) ||
791
		break;
840
		    (ec->burst.expect_event == ACPI_EC_EVENT_IBE &&
841
		     !(value & ACPI_EC_FLAG_IBF))) {
842
			ec->burst.expect_event = 0;
843
			wake_up(&ec->burst.wait);
844
			return ACPI_INTERRUPT_HANDLED;
845
		}
846
	}
792
	}
847
793
848
	if (value & ACPI_EC_FLAG_SCI) {
794
	if (value & ACPI_EC_FLAG_SCI) {
Lines 1166-1171 Link Here
1166
	if (result)
1112
	if (result)
1167
		goto end;
1113
		goto end;
1168
1114
1115
	printk("burst-mode-ec-10-Aug\n");
1169
	printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
1116
	printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
1170
	       acpi_device_name(device), acpi_device_bid(device),
1117
	       acpi_device_name(device), acpi_device_bid(device),
1171
	       (u32) ec->common.gpe_bit);
1118
	       (u32) ec->common.gpe_bit);

Return to bug 3851