From owner-p4-projects@FreeBSD.ORG Thu Oct 5 00:55:08 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 4654A16A417; Thu, 5 Oct 2006 00:55:08 +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 0CD6516A415 for ; Thu, 5 Oct 2006 00:55:07 +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 83C5F43D49 for ; Thu, 5 Oct 2006 00:55:07 +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 k950t72N083030 for ; Thu, 5 Oct 2006 00:55:07 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k950t7HF083027 for perforce@freebsd.org; Thu, 5 Oct 2006 00:55:07 GMT (envelope-from imp@freebsd.org) Date: Thu, 5 Oct 2006 00:55:07 GMT Message-Id: <200610050055.k950t7HF083027@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 107284 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: Thu, 05 Oct 2006 00:55:08 -0000 http://perforce.freebsd.org/chv.cgi?CH=107284 Change 107284 by imp@imp_lighthouse on 2006/10/05 00:54:24 Multi block read support, ifdef'd. It doesn't quite work right for reasons unknown. Committed so I don't lose it. Affected files ... .. //depot/projects/arm/src/sys/dev/mmc/mmcsd.c#10 edit Differences ... ==== //depot/projects/arm/src/sys/dev/mmc/mmcsd.c#10 (text+ko) ==== @@ -52,6 +52,8 @@ struct bio_queue_head bio_queue; }; +#define MULTI_BLOCK_READ_BROKEN + /* bus entry points */ static int mmcsd_probe(device_t dev); static int mmcsd_attach(device_t dev); @@ -143,12 +145,11 @@ struct mmcsd_softc *sc = (struct mmcsd_softc*)arg; struct bio *bp; int sz; - daddr_t end; + daddr_t block, end; struct mmc_command cmd; struct mmc_command stop; struct mmc_request req; struct mmc_data data; - uint32_t block; device_t dev; dev = sc->dev; @@ -166,32 +167,53 @@ sz = sc->disk->d_sectorsize; end = bp->bio_pblkno + (bp->bio_bcount / sz); // XXX should use read/write_mulit - for (block = bp->bio_pblkno; block < end; block++) { + for (block = bp->bio_pblkno; block < end;) { char *vaddr = bp->bio_data + (block - bp->bio_pblkno) * sz; memset(&req, 0, sizeof(req)); memset(&cmd, 0, sizeof(cmd)); memset(&stop, 0, sizeof(stop)); req.cmd = &cmd; cmd.data = &data; -// req.stop = &stop; - if (bp->bio_cmd == BIO_READ) + if (bp->bio_cmd == BIO_READ) { +#ifdef MULTI_BLOCK_READ + if (end - block > 1) + cmd.opcode = MMC_READ_MULTIPLE_BLOCK; + else + cmd.opcode = MMC_READ_SINGLE_BLOCK; +#else cmd.opcode = MMC_READ_SINGLE_BLOCK; - else +#endif + } else cmd.opcode = MMC_WRITE_BLOCK; cmd.arg = block << 9; cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; // data.timeout_ns = ; // data.timeout_clks = ; - data.len = 512; data.data = vaddr; data.mrq = &req; - if (bp->bio_cmd == BIO_READ) + if (bp->bio_cmd == BIO_READ) { data.flags = MMC_DATA_READ; - else +#ifdef MULTI_BLOCK_READ + data.len = bp->bio_bcount; + if (end - block > 1) { + req.stop = &stop; + data.flags |= MMC_DATA_MULTI; + } + printf("Len %d %lld-%lld flags %#x sz %d\n", + data.len, block, end, data.flags, sz); + block = end; +#else + data.len = sz; + block++; +#endif + } else { data.flags = MMC_DATA_WRITE; -// stop.opcode = MMC_STOP_TRANSMISSION; -// stop.arg = 0; -// stop.flags = MMC_RSP_R1B | MMC_CMD_AC; + data.len = sz; + block++; + } + stop.opcode = MMC_STOP_TRANSMISSION; + stop.arg = 0; + stop.flags = MMC_RSP_R1B | MMC_CMD_AC; MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev, &req); // XXX error handling