From patchwork Mon Sep 7 18:46:58 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Albert Herranz X-Patchwork-Id: 46131 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n87IriLM015798 for ; Mon, 7 Sep 2009 18:53:44 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754166AbZIGSxk (ORCPT ); Mon, 7 Sep 2009 14:53:40 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754194AbZIGSxj (ORCPT ); Mon, 7 Sep 2009 14:53:39 -0400 Received: from web28315.mail.ukl.yahoo.com ([87.248.110.134]:22475 "HELO web28315.mail.ukl.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1754060AbZIGSxi (ORCPT ); Mon, 7 Sep 2009 14:53:38 -0400 Received: (qmail 76449 invoked by uid 60001); 7 Sep 2009 18:46:59 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.es; s=s1024; t=1252349219; bh=LOd9At9p0OsGF9NATKdiiw5Ia8FYLBmL/tNRemv72Sc=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:Cc:MIME-Version:Content-Type; b=EkpoPK/lyMlQOcW6Mu2zBTy1QyuQCk9xgCkPr04lbpLPwG0AMpeCik1EVAvJHIIjVPaIOJg6UE04MT4vaAhV5m/UQfqsembddJEzlJO+RBxNlw068spPTyF4TQ/i9QT4U+xVVHBZpsHbIPHpUACnaIrhqNmywZ+ZqUm4lBWff+U= DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.es; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:Cc:MIME-Version:Content-Type; b=2iSaG4IcHA6CMkQHuPoO54iv/V8cz0e0Q93cM1cd3VOHsWc0l+35mIcgiiaFKsOF30p0N2ZBy9AeGaMOkKleDXMjHdNcFP28qxT9tQXtHVcOtyyCn+7/kXf2bVdxi5HfXeutrWas+R0OQlZ4eHrauyeZghD8nIZSLrM6Ld8eK9M=; Message-ID: <369914.76148.qm@web28315.mail.ukl.yahoo.com> X-YMail-OSG: nQDDwmYVM1mN80eI.kkLuruwyFbXLlskovt9S1cL9WnmaY2.m3uJ6blE6iKe2W9SCLWj08lbIt8RQyHpsWpSxqzRwXcwfgyBPzJBrjUGGnJFx9pngKypJCqqJeFSkO1DJnQ_qPPaKwhjBNASJzMWdMkF6qgiWOxMNUpiWGNQwJJWv0FaVpF6UhYcqLJDWm0FCaUhCP867o5vkoVgnCfslxeqnoAwfM4CY1yKsGid1pSPgQOF8IKwx0VkuXgV9chN0NUsN3EUl1P7_JcLRQhn3Isz5ihV0hZBBgaLRo8osUi3p_Vtfdv42K1D3cNykpqv3sroJg-- Received: from [81.38.33.208] by web28315.mail.ukl.yahoo.com via HTTP; Mon, 07 Sep 2009 18:46:58 GMT X-Mailer: YahooMailClassic/6.1.2 YahooMailWebService/0.7.338.2 Date: Mon, 7 Sep 2009 18:46:58 +0000 (GMT) From: Albert Herranz Subject: [PATCH RFC 1/3] sdio: recognize io card without powercycle To: bcm43xx-dev@lists.berlios.de Cc: linux-mmc@vger.kernel.org, linux-wireless@vger.kernel.org MIME-Version: 1.0 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From 5c97462ae9188524faa0c57fa8b5bf8e9e0c125c Mon Sep 17 00:00:00 2001 From: Albert Herranz Date: Tue, 18 Aug 2009 21:06:32 +0200 Subject: [PATCH] sdio: recognize io card without powercycle SDIO Simplified Specification (at least V2.00) states that it is strongly recommended that the host executes either a power reset or issues a CMD52 (I/O Reset) to re-initialize an I/O card. Additionally, the CMD52 must be issued first because it cannot be issued after a CMD0. With this patch the Nintendo Wii SDIO-based WLAN card is detected after a system reset, without requiring a complete system powercycle. Signed-off-by: Albert Herranz --- drivers/mmc/core/core.c | 1 + drivers/mmc/core/sdio_ops.c | 36 ++++++++++++++++++++++++++++++------ drivers/mmc/core/sdio_ops.h | 1 + 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index d84c880..c768f70 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -890,6 +890,7 @@ void mmc_rescan(struct work_struct *work) mmc_claim_host(host); mmc_power_up(host); + sdio_go_idle(host); mmc_go_idle(host); mmc_send_if_cond(host, host->ocr_avail); diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c index 4eb7825..14d3204 100644 --- a/drivers/mmc/core/sdio_ops.c +++ b/drivers/mmc/core/sdio_ops.c @@ -67,13 +67,13 @@ int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) return err; } -int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, - unsigned addr, u8 in, u8* out) +static int mmc_io_rw_direct_host(struct mmc_host *host, int write, unsigned fn, + unsigned addr, u8 in, u8 *out) { struct mmc_command cmd; int err; - BUG_ON(!card); + BUG_ON(!host); BUG_ON(fn > 7); /* sanity check */ @@ -90,11 +90,11 @@ int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, cmd.arg |= in; cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_AC; - err = mmc_wait_for_cmd(card->host, &cmd, 0); + err = mmc_wait_for_cmd(host, &cmd, 0); if (err) return err; - if (mmc_host_is_spi(card->host)) { + if (mmc_host_is_spi(host)) { /* host driver already reported errors */ } else { if (cmd.resp[0] & R5_ERROR) @@ -106,7 +106,7 @@ int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, } if (out) { - if (mmc_host_is_spi(card->host)) + if (mmc_host_is_spi(host)) *out = (cmd.resp[0] >> 8) & 0xFF; else *out = cmd.resp[0] & 0xFF; @@ -115,6 +115,13 @@ int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, return 0; } +int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, + unsigned addr, u8 in, u8 *out) +{ + BUG_ON(!card); + return mmc_io_rw_direct_host(card->host, write, fn, addr, in, out); +} + int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz) { @@ -182,3 +189,20 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, return 0; } +int sdio_go_idle(struct mmc_host *host) +{ + int ret; + u8 abort; + + /* SDIO Simplified Specification V2.0, 4.4 Reset for SDIO */ + + ret = mmc_io_rw_direct_host(host, 0, 0, SDIO_CCCR_ABORT, 0, &abort); + if (ret) + abort = 0x08; + else + abort |= 0x08; + + ret = mmc_io_rw_direct_host(host, 1, 0, SDIO_CCCR_ABORT, abort, NULL); + return ret; +} + diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h index e2e74b0..9b546c7 100644 --- a/drivers/mmc/core/sdio_ops.h +++ b/drivers/mmc/core/sdio_ops.h @@ -17,6 +17,7 @@ int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn, unsigned addr, u8 in, u8* out); int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz); +int sdio_go_idle(struct mmc_host *host); #endif -- 1.6.0.4