From patchwork Thu Dec 18 14:16:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuli Izrailov X-Patchwork-Id: 5514781 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3CB219F1CD for ; Thu, 18 Dec 2014 16:05:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2F96F209D5 for ; Thu, 18 Dec 2014 16:05:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EC3C92022A for ; Thu, 18 Dec 2014 16:05:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751125AbaLRQFk (ORCPT ); Thu, 18 Dec 2014 11:05:40 -0500 Received: from mail-bl2on0054.outbound.protection.outlook.com ([65.55.169.54]:23503 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751116AbaLRQFj (ORCPT ); Thu, 18 Dec 2014 11:05:39 -0500 X-Greylist: delayed 876 seconds by postgrey-1.27 at vger.kernel.org; Thu, 18 Dec 2014 11:05:38 EST Received: from BN1PR02CA0030.namprd02.prod.outlook.com (10.141.56.30) by CO1PR02MB126.namprd02.prod.outlook.com (10.242.163.152) with Microsoft SMTP Server (TLS) id 15.1.31.17; Thu, 18 Dec 2014 14:16:36 +0000 Received: from BN1AFFO11FD010.protection.gbl (2a01:111:f400:7c10::179) by BN1PR02CA0030.outlook.office365.com (2a01:111:e400:2a::30) with Microsoft SMTP Server (TLS) id 15.1.49.12 via Frontend Transport; Thu, 18 Dec 2014 14:16:35 +0000 Received: from milsmgep12.sandisk.com (63.163.107.173) by BN1AFFO11FD010.mail.protection.outlook.com (10.58.52.70) with Microsoft SMTP Server id 15.1.26.17 via Frontend Transport; Thu, 18 Dec 2014 14:16:33 +0000 Received: from MILHUBIP04.sdcorp.global.sandisk.com ( [172.22.12.162]) by milsmgep12.sandisk.com (Symantec Messaging Gateway) with SMTP id 39.C5.04244.1C1E2945; Thu, 18 Dec 2014 06:16:33 -0800 (PST) Received: from milsmgip12.sandisk.com (10.177.8.100) by MILHUBIP04.sdcorp.global.sandisk.com (10.177.9.97) with Microsoft SMTP Server id 14.3.195.1; Thu, 18 Dec 2014 06:16:33 -0800 X-AuditID: ac160a69-f79526d000001094-ed-5492e1c1b2b7 Received: from sanbunt-desktop.sdcorp.global.sandisk.com ( [10.177.8.100]) by milsmgip12.sandisk.com (Symantec Messaging Gateway) with SMTP id EA.93.06319.FB1E2945; Thu, 18 Dec 2014 06:16:33 -0800 (PST) From: Yuli Izrailov To: CC: , , , Yuli Izrailov Subject: [PATCH] Support sending vendor specific commands. Date: Thu, 18 Dec 2014 09:16:03 -0500 Message-ID: <1418912163-27948-1-git-send-email-yuli.izrailov@sandisk.com> X-Mailer: git-send-email 1.7.9.5 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrHLMWRmVeSWpSXmKPExsWyRoxnke7Bh5NCDJ7tFLeYcHk7o8WR//2M FsfXhjswe9y5tofN48arhUwenzfJBTBHcdmkpOZklqUW6dslcGV0dS9lK/isUHHp+A3mBsaD kl2MnBwSAiYSG5Y8YoWwxSQu3FvP1sXIxSEkcIJR4v6L2SwQzg5GiaauE4wwHWtenWKCSJxj lFj0cyUTSIJNQF9i065e9i5GDg4RARmJxgPGIGFmgRqJDdf2gG0QFrCSWHrgNhuIzSKgKnFv z3Z2EJtXwFNi3qRNYK0SAgoScybZgIyXEHjOInFo9wJWiBpBiZMzn7BAzJSQOPjiBTOILSSg JrHj5jOmCYyCs5CUzUJStoCRaRWjWG5mTnFuemqBoZFecWJeSmZxtl5yfu4mRnCocmXuYFwx yfwQowAHoxIPr4TepBAh1sSy4srcQ4wSHMxKIryRl4BCvCmJlVWpRfnxRaU5qcWHGKU5WJTE eQWnZ/kLCaQnlqRmp6YWpBbBZJk4OKUaGANXfjBP3Ty54FLGSd3f0Tc+v5++bGnP89Tn/y3O Xy8r3K+n87jFU7Pedq/7QRb9g0es/sb8nvh+dXqvaGtErJGFkCXDpZSclR+mc2yd65ke/fpQ deZFxfoMm4f/P5q8ELhunn5ZpG2l82/7qt8/ZMNW12wSuXXBewnfvGtHlJMOt2y3DOdW/6zE UpyRaKjFXFScCACDdEPZUQIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprEJMWRmVeSWpSXmKPExsXCtZEjRffgw0khBpvf8ljcfPCDzWLC5e2M Fkf+9zNaHF8bbrHvYiuLA6vHnWt72DxuvFrI5DFtzXkmj8+b5AJYorhsUlJzMstSi/TtErgy urqXshV8Vqi4dPwGcwPjQckuRk4OCQETiTWvTjFB2GISF+6tZwOxhQTOMEosPgdWwyagL7Fp Vy87iC0iICXR87SZGcRmFqiSaL7UxAJiCwtYSSw9cBusl0VAVeLenu1g9bwCnhJN0/cCzecA mq8gMWeSzQRGrgWMDKsYxXIzc4pz0zMLDI30ihPzUjKLs/WS83M3MYJ9zRm1g/H6RPNDjEwc nFINjJOL2trucGh/478UL+q3g03p6NI3R+a82hEv9E0qptRAPzHuUcQU7tAz11Lr7n9UsGli eBtWIyHs5bNVKS6cv+e/XkP3Md1vC4wift/mu/XrfVxwR3TTnlu5b5lSr/w8f/5Y3L2/7Y/F 1wpff7jq4aHe+1OOiThvCahlPtBg8yJcT3Ddid1NIkosxRmJhlrMRcWJAD3AXLOlAQAA MIME-Version: 1.0 X-EOPAttributedMessage: 0 Received-SPF: Pass (protection.outlook.com: domain of sandisk.com designates 63.163.107.173 as permitted sender) receiver=protection.outlook.com; client-ip=63.163.107.173; helo=milsmgep12.sandisk.com; Authentication-Results: spf=pass (sender IP is 63.163.107.173) smtp.mailfrom=Yuliy.Izrailov@sandisk.com; X-Forefront-Antispam-Report: CIP:63.163.107.173; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(438002)(189002)(199003)(33646002)(77096005)(62966003)(47776003)(50466002)(64706001)(89996001)(46102003)(87936001)(120916001)(99396003)(77156002)(48376002)(229853001)(107046002)(2351001)(68736005)(110136001)(21056001)(31966008)(4396001)(69596002)(92566001)(19580395003)(97736003)(575784001)(20776003)(50226001)(81156004)(50986999)(36756003)(19580405001)(84676001)(106466001); DIR:OUT; SFP:1101; SCL:1; SRVR:CO1PR02MB126; H:milsmgep12.sandisk.com; FPR:; SPF:Pass; MLV:sfv; PTR:ErrorRetry; MX:1; A:1; LANG:en; X-Microsoft-Antispam: UriScan:; X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:;SRVR:CO1PR02MB126; X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004); SRVR:CO1PR02MB126; X-Forefront-PRVS: 042957ACD7 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:;SRVR:CO1PR02MB126; X-OriginatorOrg: sandisk.com Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This change adds support to invoke eMMC vendor specific commands (CMD60...CMD63). New command was added: "do_manufacturer". Only AC command type is supported at this stage, ADTC command type is not. AC - addressed commands, no data transfer. ADTC - addressed data transfer commands. Example: mmc manufacturer 60 ac r1 0x40302010 /dev/block/mmcblk0 Signed-off-by: Yuli Izrailov --- mmc.c | 10 +++++++ mmc.h | 8 ++++++ mmc_cmds.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mmc_cmds.h | 1 + 4 files changed, 111 insertions(+) diff --git a/mmc.c b/mmc.c index aeaedf6..5fc34fa 100644 --- a/mmc.c +++ b/mmc.c @@ -150,6 +150,16 @@ static struct Command commands[] = { " mmc rpmb write-block /dev/mmcblk0rpmb 0x02 - -", NULL }, + { do_manufacturer, 5, + "manufacturer", " " " " + " " " " "\n" + "Send a manufacturer specific command to the .\n" + " - [60 - 63]\n" + " - [ac] (adtc is not implemented)\n" + " - [r1, r1b]\n" + " - 4 byte arbitrary argument in hex", + NULL + }, { 0, 0, 0, 0 } }; diff --git a/mmc.h b/mmc.h index 5fe5fec..314b1b4 100644 --- a/mmc.h +++ b/mmc.h @@ -37,6 +37,14 @@ #define MMC_WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */ /* + * MMC manufacturer specific command definitions + */ +#define MMC_SEND_MANUFACTURER_1 60 +#define MMC_SEND_MANUFACTURER_2 61 +#define MMC_SEND_MANUFACTURER_3 62 +#define MMC_SEND_MANUFACTURER_4 63 + +/* * EXT_CSD fields */ #define EXT_CSD_S_CMD_SET 504 diff --git a/mmc_cmds.c b/mmc_cmds.c index cea943f..7eeb6fc 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -1677,3 +1677,95 @@ int do_rpmb_write_block(int nargs, char **argv) return ret; } + +static int str_to_u32(const char *src, __u32 *dest, int base) +{ + char *endptr; + __u32 tmp; + + tmp = strtoul(src, &endptr, base); + if (errno || *endptr) + return 1; + + *dest = tmp; + return 0; +} + +int do_manufacturer(int nargs, char **argv) +{ + int fd; + char *device; + unsigned int cmd_type; + unsigned int resp_type; + __u32 opcode; + __u32 arg; + struct mmc_ioc_cmd idata = {0}; + + /* Command number */ + if (str_to_u32(argv[1], &opcode, 10) || + (opcode != MMC_SEND_MANUFACTURER_1 && + opcode != MMC_SEND_MANUFACTURER_2 && + opcode != MMC_SEND_MANUFACTURER_3 && + opcode != MMC_SEND_MANUFACTURER_4)) { + fprintf(stderr, "%s: invalid argument '%s'\n", + argv[0], argv[1]); + exit(1); + } + + /* Command type */ + if (0 == strcasecmp("ac", argv[2])) { + cmd_type = MMC_CMD_AC; + } + else if (0 == strcasecmp("adtc", argv[2])) { + fprintf(stderr, "%s: 'adtc' is not implemented\n", + argv[0]); + exit(1); + } + else { + fprintf(stderr, "%s: invalid argument '%s'\n", + argv[0], argv[2]); + exit(1); + } + + /* Response type */ + if (0 == strcasecmp("r1b", argv[3])) { + resp_type = MMC_RSP_R1B; + } + else if (0 == strcasecmp("r1", argv[3])) { + resp_type = MMC_RSP_R1; + } + else { + fprintf(stderr, "%s: invalid argument '%s'\n", + argv[0], argv[3]); + exit(1); + } + + /* Argument */ + if (str_to_u32(argv[4], &arg, 16)) { + fprintf(stderr, "%s: invalid argument '%s'\n", + argv[0], argv[4]); + exit(1); + } + + /* Device */ + device = argv[5]; + fd = open(device, O_RDWR); + if (fd < 0) { + perror("open device"); + exit(1); + } + + /* Fill ioctl & send */ + idata.opcode = opcode; + idata.arg = arg; + idata.flags = (cmd_type | resp_type); + + if (ioctl(fd, MMC_IOC_CMD, &idata)) { + perror("ioctl"); + exit(1); + } + + close(fd); + + return 0; +} diff --git a/mmc_cmds.h b/mmc_cmds.h index 9e625c9..de4ac7a 100644 --- a/mmc_cmds.h +++ b/mmc_cmds.h @@ -32,3 +32,4 @@ int do_rpmb_write_key(int nargs, char **argv); int do_rpmb_read_counter(int nargs, char **argv); int do_rpmb_read_block(int nargs, char **argv); int do_rpmb_write_block(int nargs, char **argv); +int do_manufacturer(int nargs, char **argv);