From owner-p4-projects@FreeBSD.ORG Wed Jun 14 23:49:35 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E276116A47D; Wed, 14 Jun 2006 23:49:34 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A69C416A47A for ; Wed, 14 Jun 2006 23:49:34 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 73C5543D45 for ; Wed, 14 Jun 2006 23:49:34 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5ENnYXk058349 for ; Wed, 14 Jun 2006 23:49:34 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5ENnYdj058346 for perforce@freebsd.org; Wed, 14 Jun 2006 23:49:34 GMT (envelope-from imp@freebsd.org) Date: Wed, 14 Jun 2006 23:49:34 GMT Message-Id: <200606142349.k5ENnYdj058346@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 99264 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Jun 2006 23:49:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=99264 Change 99264 by imp@imp_lighthouse on 2006/06/14 23:49:23 quick hack: the MCI part has a problem with byte order. It stores the bytes in the wrong order with a word in the buffers it reads and does a similar thing for write. Cope. Affected files ... .. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/sd-card.c#3 edit Differences ... ==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/sd-card.c#3 (text+ko) ==== @@ -126,6 +126,13 @@ } #endif +inline static unsigned int +swap(unsigned int a) +{ + return (((a & 0xff) << 24) | ((a & 0xff00) << 8) | ((a & 0xff0000) >> 8) + | ((a & 0xff000000) >> 24)); +} + int MCI_read (char* dest, unsigned source, unsigned length) { @@ -134,6 +141,7 @@ unsigned offset = (unsigned)source % sectorLength; AT91S_MCIDeviceStatus status; int sizeToRead; + unsigned int *walker; //See if we are requested to read partial sectors, and have the capability to do so if ((length % sectorLength) && !(MCI_Device_Features.Read_Partial)) @@ -160,6 +168,13 @@ if (status != AT91C_READ_OK) return -1; + //* Wait MCI Device Ready + AT91F_MCIDeviceWaitReady(AT91C_MCI_TIMEOUT); + // Fix erratum in MCI part + for (walker = (unsigned int *)dest; + walker < (unsigned int *)(dest + sizeToRead); walker++) + *walker = swap(*walker); + //Update counters & pointers length -= sizeToRead; dest += sizeToRead; @@ -183,6 +198,14 @@ if (status != AT91C_READ_OK) return -1; + //* Wait MCI Device Ready + AT91F_MCIDeviceWaitReady(AT91C_MCI_TIMEOUT); + + // Fix erratum in MCI part + for (walker = (unsigned int *)dest; + walker < (unsigned int *)(dest + sizeToRead); walker++) + *walker = swap(*walker); + //Update counters & pointers length -= sizeToRead; dest += sizeToRead;