From takeharu1219@ybb.ne.jp  Sat Jan  5 02:40:11 2008
Return-Path: <takeharu1219@ybb.ne.jp>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 77F3416A476
	for <FreeBSD-gnats-submit@freebsd.org>; Sat,  5 Jan 2008 02:40:11 +0000 (UTC)
	(envelope-from takeharu1219@ybb.ne.jp)
Received: from ybbsmtp12.mail.ogk.yahoo.co.jp (ybbsmtp12.mail.ogk.yahoo.co.jp [124.83.153.132])
	by mx1.freebsd.org (Postfix) with SMTP id 18A6213C442
	for <FreeBSD-gnats-submit@freebsd.org>; Sat,  5 Jan 2008 02:40:10 +0000 (UTC)
	(envelope-from takeharu1219@ybb.ne.jp)
Received: (qmail 69258 invoked by alias); 5 Jan 2008 02:40:09 -0000
Received: from unknown (HELO ?127.0.0.1?) (takeharu1219@219.35.170.86 with plain)
  by ybbsmtp12.mail.ogk.yahoo.co.jp with SMTP; 5 Jan 2008 02:40:09 -0000
Message-Id: <477EEDE9.7030908@ybb.ne.jp>
Date: Sat, 05 Jan 2008 11:39:37 +0900
From: Takeharu KATO <takeharu1219@ybb.ne.jp>
To: FreeBSD-gnats-submit@freebsd.org
Subject: cpufreq(est) reports invalid frequency.

>Number:         119350
>Category:       i386
>Synopsis:       [i386] [patch] cpufreq(est) reports invalid frequency.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    rpaulo
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jan 05 02:50:00 UTC 2008
>Closed-Date:    Thu Feb 28 19:11:27 UTC 2008
>Last-Modified:  Sat Mar  8 14:20:03 UTC 2008
>Originator:     Takeharu KATO
>Release:        FreeBSD 8.0-CURRENT i386
>Organization:
none
>Environment:
System: FreeBSD ambrose 8.0-CURRENT FreeBSD 8.0-CURRENT #20: Sat Jan 5 10:36:22 UTC 2008 root@ambrose:/usr/obj/usr/src/sys/GENERIC i386
	machine: Panasonic CF-R7
	OS     : FreeBSD
	target : i386
>Description:
	Cpufreq(est) does not check setting values which are reported from
	acpi_perf, so cpu freqency table in cpufreq driver contains
	invalid setting value(invalid id16 value). 
	Due to this issue, the powerd can not decrease clock speed when cpu
	is in idle.

	Some people reports same issue on various machines.

	According to comments in sys/i386/cpufreq/est.c,
	the auther of the driver regards this as TODO thing
	(see following lines.).
	--
	for (i = 0; i < count; i++) {
	/*
	 * TODO: Figure out validity checks for id16.  Linux checks
	 * that the control and status values match.
	 */
	--

>How-To-Repeat:
	<code/input/activities to reproduce the problem (multiple lines)>
	Run powerd on CF-R7.
>Fix:
	I wrote the patch to fix the issue.
	This patch checks whether id16 value is acutally effective or not,
	and if it is effective then register setting values to cpufreq tables.





--------------020608060902050406020903
Content-Type: text/plain;
 name="est-fix.patch"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="est-fix.patch"

LS0tIHN5cy5vcmlnL2kzODYvY3B1ZnJlcS9lc3QuYwkyMDA2LTA1LTExIDE3OjM1OjQ0LjAw
MDAwMDAwMCArMDAwMAorKysgc3lzL2kzODYvY3B1ZnJlcS9lc3QuYwkyMDA4LTAxLTA1IDEw
OjU2OjE0LjQzNTg4MjIxMyArMDAwMApAQCAtOTAyLDYgKzkwMiw4IEBACiBzdGF0aWMgaW50
CWVzdF9zZXQoZGV2aWNlX3QgZGV2LCBjb25zdCBzdHJ1Y3QgY2Zfc2V0dGluZyAqc2V0KTsK
IHN0YXRpYyBpbnQJZXN0X2dldChkZXZpY2VfdCBkZXYsIHN0cnVjdCBjZl9zZXR0aW5nICpz
ZXQpOwogc3RhdGljIGludAllc3RfdHlwZShkZXZpY2VfdCBkZXYsIGludCAqdHlwZSk7Citz
dGF0aWMgaW50CWVzdF9zZXRfaWQxNih1aW50MTZfdCBpZDE2LCBpbnQgbmVlZF9jaGVjayk7
CitzdGF0aWMgdm9pZAllc3RfZ2V0X2lkMTYodWludDE2X3QgKmlkMTZfcCk7CiAKIHN0YXRp
YyBkZXZpY2VfbWV0aG9kX3QgZXN0X21ldGhvZHNbXSA9IHsKIAkvKiBEZXZpY2UgaW50ZXJm
YWNlICovCkBAIC0xMDY4LDcgKzEwNzAsNiBAQAogCiAJcmV0dXJuICgwKTsKIH0KLQogc3Rh
dGljIGludAogZXN0X2FjcGlfaW5mbyhkZXZpY2VfdCBkZXYsIGZyZXFfaW5mbyAqKmZyZXFz
KQogewpAQCAtMTA3Niw3ICsxMDc3LDggQEAKIAlzdHJ1Y3QgY2Zfc2V0dGluZyAqc2V0czsK
IAlmcmVxX2luZm8gKnRhYmxlOwogCWRldmljZV90IHBlcmZfZGV2OwotCWludCBjb3VudCwg
ZXJyb3IsIGk7CisJaW50IGNvdW50LCBlcnJvciwgaSwgaWR4OworCXVpbnQxNl90IHNhdmVk
X2lkMTY7CiAKIAlwZXJmX2RldiA9IGRldmljZV9maW5kX2NoaWxkKGRldmljZV9nZXRfcGFy
ZW50KGRldiksICJhY3BpX3BlcmYiLCAtMSk7CiAJaWYgKHBlcmZfZGV2ID09IE5VTEwgfHwg
IWRldmljZV9pc19hdHRhY2hlZChwZXJmX2RldikpCkBAIC0xMDk4LDE5ICsxMTAwLDM4IEBA
CiAJCWVycm9yID0gRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8
IGNvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwLCBpZHggPSAwOyBpIDwgY291bnQ7IGkrKykg
ewogCQkvKgotCQkgKiBUT0RPOiBGaWd1cmUgb3V0IHZhbGlkaXR5IGNoZWNrcyBmb3IgaWQx
Ni4gIExpbnV4IGNoZWNrcwotCQkgKiB0aGF0IHRoZSBjb250cm9sIGFuZCBzdGF0dXMgdmFs
dWVzIG1hdGNoLgorCQkgKiBDb25maXJtIGlkMTYgdmFsdWUgaXMgY29ycmVjdC4KIAkJICov
Ci0JCXRhYmxlW2ldLmZyZXEgPSBzZXRzW2ldLmZyZXE7Ci0JCXRhYmxlW2ldLnZvbHRzID0g
c2V0c1tpXS52b2x0czsKLQkJdGFibGVbaV0uaWQxNiA9IHNldHNbaV0uc3BlY1swXTsKLQkJ
dGFibGVbaV0ucG93ZXIgPSBzZXRzW2ldLnBvd2VyOworCQlpZiAoc2V0c1tpXS5mcmVxID4g
MCkgeworCisJCQkvKiBzYXZlIGN1cnJlbnQgdmFsdWUgICovCisJCQllc3RfZ2V0X2lkMTYo
JnNhdmVkX2lkMTYpOworCisJCQkvKiAKKwkJCSAqIFRyeSB0byBzZXQgc3BlY2lmaWVkIHZh
bHVlIAorCQkJICovCisJCQllcnJvciA9IGVzdF9zZXRfaWQxNihzZXRzW2ldLnNwZWNbMF0s
IDEpOworCQkJaWYgKGVycm9yID09IDApIHsKKwkJCQlpZiAoYm9vdHZlcmJvc2UpIAorCQkJ
CQlwcmludGYoIkludmFsaWQgZnJlcSAldSwgaWdub3JlZC5cbiIsIAorCQkJCQkgICAgc2V0
c1tpXS5zcGVjWzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJdGFibGVbaWR4XS5mcmVxID0gc2V0
c1tpXS5mcmVxOworCQkJCXRhYmxlW2lkeF0udm9sdHMgPSBzZXRzW2ldLnZvbHRzOworCQkJ
CXRhYmxlW2lkeF0uaWQxNiA9IHNldHNbaV0uc3BlY1swXTsKKwkJCQl0YWJsZVtpZHhdLnBv
d2VyID0gc2V0c1tpXS5wb3dlcjsKKwkJCQkrK2lkeDsKKwkJCX0KKworCQkJLyogcmVzdG9y
ZSBzYXZlZCBzZXR0aW5nICovCisJCQllc3Rfc2V0X2lkMTYoc2V0c1tpXS5zcGVjWzBdLCAw
KTsgCisJCX0KIAl9CiAKIAkvKiBNYXJrIGVuZCBvZiB0YWJsZSB3aXRoIGEgdGVybWluYXRv
ci4gKi8KLQliemVybygmdGFibGVbaV0sIHNpemVvZihmcmVxX2luZm8pKTsKKwliemVybygm
dGFibGVbaWR4XSwgc2l6ZW9mKGZyZXFfaW5mbykpOwogCiAJc2MtPmFjcGlfc2V0dGluZ3Mg
PSBUUlVFOwogCSpmcmVxcyA9IHRhYmxlOwpAQCAtMTE0OCw2ICsxMTY5LDQxIEBACiAJKmZy
ZXFzID0gcC0+ZnJlcXRhYjsKIAlyZXR1cm4gKDApOwogfQorc3RhdGljIHZvaWQKK2VzdF9n
ZXRfaWQxNih1aW50MTZfdCAqaWQxNl9wKSB7CisJKmlkMTZfcCA9IHJkbXNyKE1TUl9QRVJG
X1NUQVRVUykgJiAweGZmZmY7Cit9CisKK3N0YXRpYyBpbnQKK2VzdF9zZXRfaWQxNih1aW50
MTZfdCBpZDE2LCBpbnQgbmVlZF9jaGVjaykgeworCXVpbnQ2NF90IG1zcjsKKwl1aW50MTZf
dCBuZXdfaWQxNjsKKwlpbnQgcmMgPSAwOworCisJLyoKKwkgKiBUcnkgdG8gc2V0IGZyZXEu
CisJICovCisKKwkvKiBSZWFkIHRoZSBjdXJyZW50IHJlZ2lzdGVyLCBtYXNrIG91dCB0aGUg
b2xkLCBzZXQgdGhlIG5ldyBpZC4gKi8KKwltc3IgPSByZG1zcihNU1JfUEVSRl9DVEwpOwor
CW1zciA9IChtc3IgJiB+MHhmZmZmKSB8IGlkMTY7CisJd3Jtc3IoTVNSX1BFUkZfQ1RMLCBt
c3IpOworCisJLyogV2FpdCBhIHNob3J0IHdoaWxlIGZvciB0aGUgbmV3IHNldHRpbmcuICBY
WFggSXMgdGhpcyBuZWNlc3Nhcnk/ICovCisJREVMQVkoRVNUX1RSQU5TX0xBVCk7CisKKwlp
ZiAgKG5lZWRfY2hlY2spIHsKKwkJZXN0X2dldF9pZDE2KCZuZXdfaWQxNik7CQkKKwkJaWYg
KG5ld19pZDE2ICE9IGlkMTYpIHsKKwkJCWlmIChib290dmVyYm9zZSkgCisJCQkJcHJpbnRm
KCJJbnZhbGlkIGlkMTYgKHNldCwgY3VyKSA9ICgldSwgJXUpXG4iLCAKKwkJCQkgICAgaWQx
NiwgbmV3X2lkMTYpOworCQkJcmMgPSBFTlhJTzsgLyogQ2FuIG5vdCBzZXQgdGhpcyB2YWx1
ZSAqLworCQl9CisJfQorCisJcmV0dXJuIChyYyk7Cit9CiAKIHN0YXRpYyBmcmVxX2luZm8g
KgogZXN0X2dldF9jdXJyZW50KGZyZXFfaW5mbyAqZnJlcV9saXN0KQpAQCAtMTE2Miw3ICsx
MjE4LDcgQEAKIAkgKiB3ZSBnZXQgYSB0ZW1wb3JhcnkgaW52YWxpZCByZXN1bHQuCiAJICov
CiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZDE2ID0gcmRtc3IoTVNSX1BFUkZf
U1RBVFVTKSAmIDB4ZmZmZjsKKwkJZXN0X2dldF9pZDE2KCZpZDE2KTsKIAkJZm9yIChmID0g
ZnJlcV9saXN0OyBmLT5pZDE2ICE9IDA7IGYrKykgewogCQkJaWYgKGYtPmlkMTYgPT0gaWQx
NikKIAkJCQlyZXR1cm4gKGYpOwpAQCAtMTIwMSw3ICsxMjU3LDYgQEAKIHsKIAlzdHJ1Y3Qg
ZXN0X3NvZnRjICpzYzsKIAlmcmVxX2luZm8gKmY7Ci0JdWludDY0X3QgbXNyOwogCiAJLyog
RmluZCB0aGUgc2V0dGluZyBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIG9uZS4gKi8KIAlzYyA9
IGRldmljZV9nZXRfc29mdGMoZGV2KTsKQEAgLTEyMTMsOSArMTI2OCw3IEBACiAJCXJldHVy
biAoRUlOVkFMKTsKIAogCS8qIFJlYWQgdGhlIGN1cnJlbnQgcmVnaXN0ZXIsIG1hc2sgb3V0
IHRoZSBvbGQsIHNldCB0aGUgbmV3IGlkLiAqLwotCW1zciA9IHJkbXNyKE1TUl9QRVJGX0NU
TCk7Ci0JbXNyID0gKG1zciAmIH4weGZmZmYpIHwgZi0+aWQxNjsKLQl3cm1zcihNU1JfUEVS
Rl9DVEwsIG1zcik7CisJZXN0X3NldF9pZDE2KGYtPmlkMTYsIDApOwogCiAJLyogV2FpdCBh
IHNob3J0IHdoaWxlIGZvciB0aGUgbmV3IHNldHRpbmcuICBYWFggSXMgdGhpcyBuZWNlc3Nh
cnk/ICovCiAJREVMQVkoRVNUX1RSQU5TX0xBVCk7Cg==
--------------020608060902050406020903--

>Release-Note:
>Audit-Trail:

From: Takeharu KATO <takeharu1219@ybb.ne.jp>
To: bug-followup@FreeBSD.org,  takeharu1219@ybb.ne.jp
Cc:  
Subject: Re: kern/119350: cpufreq(est) reports invalid frequency.
Date: Sun, 06 Jan 2008 00:14:37 +0900

 Hi,
 
 I sent wrong patch by mistake, so I re-post correct patch.
 
 
 --- sys.orig2/i386/cpufreq/est.c	2006-05-11 17:35:44.000000000 +0000
 +++ sys/i386/cpufreq/est.c	2008-01-05 18:39:22.022325881 +0000
 @@ -902,6 +902,8 @@
  static int	est_set(device_t dev, const struct cf_setting *set);
  static int	est_get(device_t dev, struct cf_setting *set);
  static int	est_type(device_t dev, int *type);
 +static int	est_set_id16(uint16_t id16, int need_check);
 +static void	est_get_id16(uint16_t *id16_p);
  
  static device_method_t est_methods[] = {
  	/* Device interface */
 @@ -1068,7 +1070,6 @@
  
  	return (0);
  }
 -
  static int
  est_acpi_info(device_t dev, freq_info **freqs)
  {
 @@ -1076,7 +1077,8 @@
  	struct cf_setting *sets;
  	freq_info *table;
  	device_t perf_dev;
 -	int count, error, i;
 +	int count, error, i, idx;
 +	uint16_t saved_id16;
  
  	perf_dev = device_find_child(device_get_parent(dev), "acpi_perf", -1);
  	if (perf_dev == NULL || !device_is_attached(perf_dev))
 @@ -1098,19 +1100,39 @@
  		error = ENOMEM;
  		goto out;
  	}
 -	for (i = 0; i < count; i++) {
 +	for (i = 0, idx = 0; i < count; i++) {
  		/*
 -		 * TODO: Figure out validity checks for id16.  Linux checks
 -		 * that the control and status values match.
 +		 * Confirm id16 value is correct.
  		 */
 -		table[i].freq = sets[i].freq;
 -		table[i].volts = sets[i].volts;
 -		table[i].id16 = sets[i].spec[0];
 -		table[i].power = sets[i].power;
 +		if (sets[i].freq > 0) {
 +
 +			/* save current value  */
 +			est_get_id16(&saved_id16);
 +
 +			/* 
 +			 * Try to set specified value 
 +			 */
 +			error = est_set_id16(sets[i].spec[0], 1);
 +			if (error != 0) {
 +				if (bootverbose) 
 +					device_printf(dev, 
 +					    "Invalid freq %u, ignored.\n", 
 +					    sets[i].freq);
 +			} else {
 +				table[idx].freq = sets[i].freq;
 +				table[idx].volts = sets[i].volts;
 +				table[idx].id16 = sets[i].spec[0];
 +				table[idx].power = sets[i].power;
 +				++idx;
 +			}
 +
 +			/* restore saved setting */
 +			est_set_id16(sets[i].spec[0], 0); 
 +		}
  	}
  
  	/* Mark end of table with a terminator. */
 -	bzero(&table[i], sizeof(freq_info));
 +	bzero(&table[idx], sizeof(freq_info));
  
  	sc->acpi_settings = TRUE;
  	*freqs = table;
 @@ -1148,6 +1170,37 @@
  	*freqs = p->freqtab;
  	return (0);
  }
 +static void
 +est_get_id16(uint16_t *id16_p) {
 +	*id16_p = rdmsr(MSR_PERF_STATUS) & 0xffff;
 +}
 +
 +static int
 +est_set_id16(uint16_t id16, int need_check) {
 +	uint64_t msr;
 +	uint16_t new_id16;
 +	int rc = 0;
 +
 +	/*
 +	 * Try to set freq.
 +	 */
 +
 +	/* Read the current register, mask out the old, set the new id. */
 +	msr = rdmsr(MSR_PERF_CTL);
 +	msr = (msr & ~0xffff) | id16;
 +	wrmsr(MSR_PERF_CTL, msr);
 +
 +	/* Wait a short while for the new setting.  XXX Is this necessary? */
 +	DELAY(EST_TRANS_LAT);
 +
 +	if  (need_check) {
 +		est_get_id16(&new_id16);		
 +		if (new_id16 != id16) 
 +			rc = ENXIO; /* Can not set this value */
 +	}
 +
 +	return (rc);
 +}
  
  static freq_info *
  est_get_current(freq_info *freq_list)
 @@ -1162,7 +1215,7 @@
  	 * we get a temporary invalid result.
  	 */
  	for (i = 0; i < 5; i++) {
 -		id16 = rdmsr(MSR_PERF_STATUS) & 0xffff;
 +		est_get_id16(&id16);
  		for (f = freq_list; f->id16 != 0; f++) {
  			if (f->id16 == id16)
  				return (f);
 @@ -1201,7 +1254,6 @@
  {
  	struct est_softc *sc;
  	freq_info *f;
 -	uint64_t msr;
  
  	/* Find the setting matching the requested one. */
  	sc = device_get_softc(dev);
 @@ -1213,12 +1265,7 @@
  		return (EINVAL);
  
  	/* Read the current register, mask out the old, set the new id. */
 -	msr = rdmsr(MSR_PERF_CTL);
 -	msr = (msr & ~0xffff) | f->id16;
 -	wrmsr(MSR_PERF_CTL, msr);
 -
 -	/* Wait a short while for the new setting.  XXX Is this necessary? */
 -	DELAY(EST_TRANS_LAT);
 +	est_set_id16(f->id16, 0);
  
  	return (0);
  }
 
Responsible-Changed-From-To: freebsd-bugs->freebsd-i386 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Sat Jan 5 17:37:07 UTC 2008 
Responsible-Changed-Why:  
Reclassify. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=119350 
State-Changed-From-To: open->closed 
State-Changed-By: rpaulo 
State-Changed-When: Thu Feb 28 19:10:11 UTC 2008 
State-Changed-Why:  
Committed to HEAD. Will MFC in a week. Thanks! 


Responsible-Changed-From-To: freebsd-i386->rpaulo 
Responsible-Changed-By: rpaulo 
Responsible-Changed-When: Thu Feb 28 19:10:11 UTC 2008 
Responsible-Changed-Why:  
Mine. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=119350 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: i386/119350: commit references a PR
Date: Thu, 28 Feb 2008 19:10:52 +0000 (UTC)

 rpaulo      2008-02-28 19:10:42 UTC
 
   FreeBSD src repository
 
   Modified files:
     sys/i386/cpufreq     est.c 
   Log:
   Validate the id16 values gathered from ACPI (previously a TODO item).
   Style changes by me and njl.
   
   Approved by:     njl (mentor)
   Reviewed by:     njl (mentor)
   Submitted by:    Takeharu KATO <takeharu1219 at ybb.ne.jp>
   PR:              119350
   MFC after:       1 week
   
   Revision  Changes    Path
   1.12      +59 -17    src/sys/i386/cpufreq/est.c
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: i386/119350: commit references a PR
Date: Sat,  8 Mar 2008 14:12:42 +0000 (UTC)

 rpaulo      2008-03-08 14:12:35 UTC
 
   FreeBSD src repository
 
   Modified files:        (Branch: RELENG_7)
     sys/i386/cpufreq     est.c 
   Log:
   MFC r1.12:
     Validate the id16 values gathered from ACPI (previously a TODO
     item).
     Style changes by me and njl.
   
     Submitted by:    Takeharu KATO <takeharu1219 at ybb.ne.jp>
     PR:              119350
   
   Revision  Changes    Path
   1.11.2.1  +59 -17    src/sys/i386/cpufreq/est.c
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: i386/119350: commit references a PR
Date: Sat,  8 Mar 2008 14:14:42 +0000 (UTC)

 rpaulo      2008-03-08 14:14:35 UTC
 
   FreeBSD src repository
 
   Modified files:        (Branch: RELENG_6)
     sys/i386/cpufreq     est.c 
   Log:
   MFC r1.12:
     Validate the id16 values gathered from ACPI (previously a TODO
     item).
     Style changes by me and njl.
   
     Submitted by:    Takeharu KATO <takeharu1219 at ybb.ne.jp>
     PR:              119350
   
   Revision  Changes    Path
   1.7.2.2   +59 -17    src/sys/i386/cpufreq/est.c
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
>Unformatted:
 This is a multi-part message in MIME format.
 --------------020608060902050406020903
 Content-Type: text/plain; charset=ISO-2022-JP
 Content-Transfer-Encoding: 7bit
 
