LCOV - code coverage report
Current view: top level - drivers/mmc/core - mmc_ops.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 256 0.0 %
Date: 2014-02-18 Functions: 0 20 0.0 %
Branches: 0 182 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/drivers/mmc/core/mmc_ops.h
       3                 :            :  *
       4                 :            :  *  Copyright 2006-2007 Pierre Ossman
       5                 :            :  *
       6                 :            :  * This program is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2 of the License, or (at
       9                 :            :  * your option) any later version.
      10                 :            :  */
      11                 :            : 
      12                 :            : #include <linux/slab.h>
      13                 :            : #include <linux/export.h>
      14                 :            : #include <linux/types.h>
      15                 :            : #include <linux/scatterlist.h>
      16                 :            : 
      17                 :            : #include <linux/mmc/host.h>
      18                 :            : #include <linux/mmc/card.h>
      19                 :            : #include <linux/mmc/mmc.h>
      20                 :            : 
      21                 :            : #include "core.h"
      22                 :            : #include "mmc_ops.h"
      23                 :            : 
      24                 :            : #define MMC_OPS_TIMEOUT_MS      (10 * 60 * 1000) /* 10 minute timeout */
      25                 :            : 
      26                 :            : static inline int __mmc_send_status(struct mmc_card *card, u32 *status,
      27                 :            :                                     bool ignore_crc)
      28                 :            : {
      29                 :            :         int err;
      30                 :          0 :         struct mmc_command cmd = {0};
      31                 :            : 
      32 [ #  # ][ #  # ]:          0 :         BUG_ON(!card);
      33 [ #  # ][ #  # ]:          0 :         BUG_ON(!card->host);
      34                 :            : 
      35                 :          0 :         cmd.opcode = MMC_SEND_STATUS;
      36 [ #  # ][ #  # ]:          0 :         if (!mmc_host_is_spi(card->host))
      37                 :          0 :                 cmd.arg = card->rca << 16;
      38                 :          0 :         cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC;
      39         [ #  # ]:          0 :         if (ignore_crc)
      40                 :          0 :                 cmd.flags &= ~MMC_RSP_CRC;
      41                 :            : 
      42                 :          0 :         err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES);
      43   [ #  #  #  # ]:          0 :         if (err)
      44                 :            :                 return err;
      45                 :            : 
      46                 :            :         /* NOTE: callers are required to understand the difference
      47                 :            :          * between "native" and SPI format status words!
      48                 :            :          */
      49         [ #  # ]:          0 :         if (status)
      50                 :          0 :                 *status = cmd.resp[0];
      51                 :            : 
      52                 :            :         return 0;
      53                 :            : }
      54                 :            : 
      55                 :          0 : int mmc_send_status(struct mmc_card *card, u32 *status)
      56                 :            : {
      57                 :          0 :         return __mmc_send_status(card, status, false);
      58                 :            : }
      59                 :            : 
      60                 :          0 : static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card)
      61                 :            : {
      62                 :            :         int err;
      63                 :          0 :         struct mmc_command cmd = {0};
      64                 :            : 
      65         [ #  # ]:          0 :         BUG_ON(!host);
      66                 :            : 
      67                 :          0 :         cmd.opcode = MMC_SELECT_CARD;
      68                 :            : 
      69         [ #  # ]:          0 :         if (card) {
      70                 :          0 :                 cmd.arg = card->rca << 16;
      71                 :          0 :                 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
      72                 :            :         } else {
      73                 :            :                 cmd.arg = 0;
      74                 :            :                 cmd.flags = MMC_RSP_NONE | MMC_CMD_AC;
      75                 :            :         }
      76                 :            : 
      77                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
      78         [ #  # ]:          0 :         if (err)
      79                 :          0 :                 return err;
      80                 :            : 
      81                 :            :         return 0;
      82                 :            : }
      83                 :            : 
      84                 :          0 : int mmc_select_card(struct mmc_card *card)
      85                 :            : {
      86         [ #  # ]:          0 :         BUG_ON(!card);
      87                 :            : 
      88                 :          0 :         return _mmc_select_card(card->host, card);
      89                 :            : }
      90                 :            : 
      91                 :          0 : int mmc_deselect_cards(struct mmc_host *host)
      92                 :            : {
      93                 :          0 :         return _mmc_select_card(host, NULL);
      94                 :            : }
      95                 :            : 
      96                 :          0 : int mmc_go_idle(struct mmc_host *host)
      97                 :            : {
      98                 :            :         int err;
      99                 :          0 :         struct mmc_command cmd = {0};
     100                 :            : 
     101                 :            :         /*
     102                 :            :          * Non-SPI hosts need to prevent chipselect going active during
     103                 :            :          * GO_IDLE; that would put chips into SPI mode.  Remind them of
     104                 :            :          * that in case of hardware that won't pull up DAT3/nCS otherwise.
     105                 :            :          *
     106                 :            :          * SPI hosts ignore ios.chip_select; it's managed according to
     107                 :            :          * rules that must accommodate non-MMC slaves which this layer
     108                 :            :          * won't even know about.
     109                 :            :          */
     110         [ #  # ]:          0 :         if (!mmc_host_is_spi(host)) {
     111                 :          0 :                 mmc_set_chip_select(host, MMC_CS_HIGH);
     112                 :            :                 mmc_delay(1);
     113                 :            :         }
     114                 :            : 
     115                 :          0 :         cmd.opcode = MMC_GO_IDLE_STATE;
     116                 :          0 :         cmd.arg = 0;
     117                 :          0 :         cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC;
     118                 :            : 
     119                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, 0);
     120                 :            : 
     121                 :            :         mmc_delay(1);
     122                 :            : 
     123         [ #  # ]:          0 :         if (!mmc_host_is_spi(host)) {
     124                 :          0 :                 mmc_set_chip_select(host, MMC_CS_DONTCARE);
     125                 :            :                 mmc_delay(1);
     126                 :            :         }
     127                 :            : 
     128                 :          0 :         host->use_spi_crc = 0;
     129                 :            : 
     130                 :          0 :         return err;
     131                 :            : }
     132                 :            : 
     133                 :          0 : int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
     134                 :            : {
     135                 :          0 :         struct mmc_command cmd = {0};
     136                 :            :         int i, err = 0;
     137                 :            : 
     138         [ #  # ]:          0 :         BUG_ON(!host);
     139                 :            : 
     140                 :          0 :         cmd.opcode = MMC_SEND_OP_COND;
     141         [ #  # ]:          0 :         cmd.arg = mmc_host_is_spi(host) ? 0 : ocr;
     142                 :          0 :         cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;
     143                 :            : 
     144         [ #  # ]:          0 :         for (i = 100; i; i--) {
     145                 :          0 :                 err = mmc_wait_for_cmd(host, &cmd, 0);
     146         [ #  # ]:          0 :                 if (err)
     147                 :            :                         break;
     148                 :            : 
     149                 :            :                 /* if we're just probing, do a single pass */
     150         [ #  # ]:          0 :                 if (ocr == 0)
     151                 :            :                         break;
     152                 :            : 
     153                 :            :                 /* otherwise wait until reset completes */
     154         [ #  # ]:          0 :                 if (mmc_host_is_spi(host)) {
     155         [ #  # ]:          0 :                         if (!(cmd.resp[0] & R1_SPI_IDLE))
     156                 :            :                                 break;
     157                 :            :                 } else {
     158         [ #  # ]:          0 :                         if (cmd.resp[0] & MMC_CARD_BUSY)
     159                 :            :                                 break;
     160                 :            :                 }
     161                 :            : 
     162                 :            :                 err = -ETIMEDOUT;
     163                 :            : 
     164                 :            :                 mmc_delay(10);
     165                 :            :         }
     166                 :            : 
     167 [ #  # ][ #  # ]:          0 :         if (rocr && !mmc_host_is_spi(host))
     168                 :          0 :                 *rocr = cmd.resp[0];
     169                 :            : 
     170                 :          0 :         return err;
     171                 :            : }
     172                 :            : 
     173                 :          0 : int mmc_all_send_cid(struct mmc_host *host, u32 *cid)
     174                 :            : {
     175                 :            :         int err;
     176                 :          0 :         struct mmc_command cmd = {0};
     177                 :            : 
     178         [ #  # ]:          0 :         BUG_ON(!host);
     179         [ #  # ]:          0 :         BUG_ON(!cid);
     180                 :            : 
     181                 :          0 :         cmd.opcode = MMC_ALL_SEND_CID;
     182                 :            :         cmd.arg = 0;
     183                 :          0 :         cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;
     184                 :            : 
     185                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
     186         [ #  # ]:          0 :         if (err)
     187                 :            :                 return err;
     188                 :            : 
     189                 :          0 :         memcpy(cid, cmd.resp, sizeof(u32) * 4);
     190                 :            : 
     191                 :          0 :         return 0;
     192                 :            : }
     193                 :            : 
     194                 :          0 : int mmc_set_relative_addr(struct mmc_card *card)
     195                 :            : {
     196                 :            :         int err;
     197                 :          0 :         struct mmc_command cmd = {0};
     198                 :            : 
     199         [ #  # ]:          0 :         BUG_ON(!card);
     200         [ #  # ]:          0 :         BUG_ON(!card->host);
     201                 :            : 
     202                 :          0 :         cmd.opcode = MMC_SET_RELATIVE_ADDR;
     203                 :          0 :         cmd.arg = card->rca << 16;
     204                 :          0 :         cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
     205                 :            : 
     206                 :          0 :         err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES);
     207         [ #  # ]:          0 :         if (err)
     208                 :          0 :                 return err;
     209                 :            : 
     210                 :            :         return 0;
     211                 :            : }
     212                 :            : 
     213                 :            : static int
     214                 :          0 : mmc_send_cxd_native(struct mmc_host *host, u32 arg, u32 *cxd, int opcode)
     215                 :            : {
     216                 :            :         int err;
     217                 :          0 :         struct mmc_command cmd = {0};
     218                 :            : 
     219         [ #  # ]:          0 :         BUG_ON(!host);
     220         [ #  # ]:          0 :         BUG_ON(!cxd);
     221                 :            : 
     222                 :          0 :         cmd.opcode = opcode;
     223                 :          0 :         cmd.arg = arg;
     224                 :          0 :         cmd.flags = MMC_RSP_R2 | MMC_CMD_AC;
     225                 :            : 
     226                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
     227         [ #  # ]:          0 :         if (err)
     228                 :            :                 return err;
     229                 :            : 
     230                 :          0 :         memcpy(cxd, cmd.resp, sizeof(u32) * 4);
     231                 :            : 
     232                 :          0 :         return 0;
     233                 :            : }
     234                 :            : 
     235                 :            : /*
     236                 :            :  * NOTE: void *buf, caller for the buf is required to use DMA-capable
     237                 :            :  * buffer or on-stack buffer (with some overhead in callee).
     238                 :            :  */
     239                 :            : static int
     240                 :          0 : mmc_send_cxd_data(struct mmc_card *card, struct mmc_host *host,
     241                 :            :                 u32 opcode, void *buf, unsigned len)
     242                 :            : {
     243                 :          0 :         struct mmc_request mrq = {NULL};
     244                 :          0 :         struct mmc_command cmd = {0};
     245                 :          0 :         struct mmc_data data = {0};
     246                 :            :         struct scatterlist sg;
     247                 :            :         void *data_buf;
     248                 :            :         int is_on_stack;
     249                 :            : 
     250                 :            :         is_on_stack = object_is_on_stack(buf);
     251         [ #  # ]:          0 :         if (is_on_stack) {
     252                 :            :                 /*
     253                 :            :                  * dma onto stack is unsafe/nonportable, but callers to this
     254                 :            :                  * routine normally provide temporary on-stack buffers ...
     255                 :            :                  */
     256                 :            :                 data_buf = kmalloc(len, GFP_KERNEL);
     257         [ #  # ]:          0 :                 if (!data_buf)
     258                 :            :                         return -ENOMEM;
     259                 :            :         } else
     260                 :            :                 data_buf = buf;
     261                 :            : 
     262                 :          0 :         mrq.cmd = &cmd;
     263                 :          0 :         mrq.data = &data;
     264                 :            : 
     265                 :          0 :         cmd.opcode = opcode;
     266                 :          0 :         cmd.arg = 0;
     267                 :            : 
     268                 :            :         /* NOTE HACK:  the MMC_RSP_SPI_R1 is always correct here, but we
     269                 :            :          * rely on callers to never use this with "native" calls for reading
     270                 :            :          * CSD or CID.  Native versions of those commands use the R2 type,
     271                 :            :          * not R1 plus a data block.
     272                 :            :          */
     273                 :          0 :         cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
     274                 :            : 
     275                 :          0 :         data.blksz = len;
     276                 :          0 :         data.blocks = 1;
     277                 :          0 :         data.flags = MMC_DATA_READ;
     278                 :          0 :         data.sg = &sg;
     279                 :          0 :         data.sg_len = 1;
     280                 :            : 
     281                 :          0 :         sg_init_one(&sg, data_buf, len);
     282                 :            : 
     283         [ #  # ]:          0 :         if (opcode == MMC_SEND_CSD || opcode == MMC_SEND_CID) {
     284                 :            :                 /*
     285                 :            :                  * The spec states that CSR and CID accesses have a timeout
     286                 :            :                  * of 64 clock cycles.
     287                 :            :                  */
     288                 :          0 :                 data.timeout_ns = 0;
     289                 :          0 :                 data.timeout_clks = 64;
     290                 :            :         } else
     291                 :          0 :                 mmc_set_data_timeout(&data, card);
     292                 :            : 
     293                 :          0 :         mmc_wait_for_req(host, &mrq);
     294                 :            : 
     295         [ #  # ]:          0 :         if (is_on_stack) {
     296                 :          0 :                 memcpy(buf, data_buf, len);
     297                 :          0 :                 kfree(data_buf);
     298                 :            :         }
     299                 :            : 
     300         [ #  # ]:          0 :         if (cmd.error)
     301                 :          0 :                 return cmd.error;
     302         [ #  # ]:          0 :         if (data.error)
     303                 :          0 :                 return data.error;
     304                 :            : 
     305                 :            :         return 0;
     306                 :            : }
     307                 :            : 
     308                 :          0 : int mmc_send_csd(struct mmc_card *card, u32 *csd)
     309                 :            : {
     310                 :            :         int ret, i;
     311                 :            :         u32 *csd_tmp;
     312                 :            : 
     313         [ #  # ]:          0 :         if (!mmc_host_is_spi(card->host))
     314                 :          0 :                 return mmc_send_cxd_native(card->host, card->rca << 16,
     315                 :            :                                 csd, MMC_SEND_CSD);
     316                 :            : 
     317                 :            :         csd_tmp = kmalloc(16, GFP_KERNEL);
     318         [ #  # ]:          0 :         if (!csd_tmp)
     319                 :            :                 return -ENOMEM;
     320                 :            : 
     321                 :          0 :         ret = mmc_send_cxd_data(card, card->host, MMC_SEND_CSD, csd_tmp, 16);
     322         [ #  # ]:          0 :         if (ret)
     323                 :            :                 goto err;
     324                 :            : 
     325         [ #  # ]:          0 :         for (i = 0;i < 4;i++)
     326         [ #  # ]:          0 :                 csd[i] = be32_to_cpu(csd_tmp[i]);
     327                 :            : 
     328                 :            : err:
     329                 :          0 :         kfree(csd_tmp);
     330                 :          0 :         return ret;
     331                 :            : }
     332                 :            : 
     333                 :          0 : int mmc_send_cid(struct mmc_host *host, u32 *cid)
     334                 :            : {
     335                 :            :         int ret, i;
     336                 :            :         u32 *cid_tmp;
     337                 :            : 
     338         [ #  # ]:          0 :         if (!mmc_host_is_spi(host)) {
     339         [ #  # ]:          0 :                 if (!host->card)
     340                 :            :                         return -EINVAL;
     341                 :          0 :                 return mmc_send_cxd_native(host, host->card->rca << 16,
     342                 :            :                                 cid, MMC_SEND_CID);
     343                 :            :         }
     344                 :            : 
     345                 :            :         cid_tmp = kmalloc(16, GFP_KERNEL);
     346         [ #  # ]:          0 :         if (!cid_tmp)
     347                 :            :                 return -ENOMEM;
     348                 :            : 
     349                 :          0 :         ret = mmc_send_cxd_data(NULL, host, MMC_SEND_CID, cid_tmp, 16);
     350         [ #  # ]:          0 :         if (ret)
     351                 :            :                 goto err;
     352                 :            : 
     353         [ #  # ]:          0 :         for (i = 0;i < 4;i++)
     354         [ #  # ]:          0 :                 cid[i] = be32_to_cpu(cid_tmp[i]);
     355                 :            : 
     356                 :            : err:
     357                 :          0 :         kfree(cid_tmp);
     358                 :          0 :         return ret;
     359                 :            : }
     360                 :            : 
     361                 :          0 : int mmc_send_ext_csd(struct mmc_card *card, u8 *ext_csd)
     362                 :            : {
     363                 :          0 :         return mmc_send_cxd_data(card, card->host, MMC_SEND_EXT_CSD,
     364                 :            :                         ext_csd, 512);
     365                 :            : }
     366                 :            : EXPORT_SYMBOL_GPL(mmc_send_ext_csd);
     367                 :            : 
     368                 :          0 : int mmc_spi_read_ocr(struct mmc_host *host, int highcap, u32 *ocrp)
     369                 :            : {
     370                 :          0 :         struct mmc_command cmd = {0};
     371                 :            :         int err;
     372                 :            : 
     373                 :          0 :         cmd.opcode = MMC_SPI_READ_OCR;
     374         [ #  # ]:          0 :         cmd.arg = highcap ? (1 << 30) : 0;
     375                 :          0 :         cmd.flags = MMC_RSP_SPI_R3;
     376                 :            : 
     377                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, 0);
     378                 :            : 
     379                 :          0 :         *ocrp = cmd.resp[1];
     380                 :          0 :         return err;
     381                 :            : }
     382                 :            : 
     383                 :          0 : int mmc_spi_set_crc(struct mmc_host *host, int use_crc)
     384                 :            : {
     385                 :          0 :         struct mmc_command cmd = {0};
     386                 :            :         int err;
     387                 :            : 
     388                 :          0 :         cmd.opcode = MMC_SPI_CRC_ON_OFF;
     389                 :          0 :         cmd.flags = MMC_RSP_SPI_R1;
     390                 :          0 :         cmd.arg = use_crc;
     391                 :            : 
     392                 :          0 :         err = mmc_wait_for_cmd(host, &cmd, 0);
     393         [ #  # ]:          0 :         if (!err)
     394                 :          0 :                 host->use_spi_crc = use_crc;
     395                 :          0 :         return err;
     396                 :            : }
     397                 :            : 
     398                 :            : /**
     399                 :            :  *      __mmc_switch - modify EXT_CSD register
     400                 :            :  *      @card: the MMC card associated with the data transfer
     401                 :            :  *      @set: cmd set values
     402                 :            :  *      @index: EXT_CSD register index
     403                 :            :  *      @value: value to program into EXT_CSD register
     404                 :            :  *      @timeout_ms: timeout (ms) for operation performed by register write,
     405                 :            :  *                   timeout of zero implies maximum possible timeout
     406                 :            :  *      @use_busy_signal: use the busy signal as response type
     407                 :            :  *      @send_status: send status cmd to poll for busy
     408                 :            :  *
     409                 :            :  *      Modifies the EXT_CSD register for selected card.
     410                 :            :  */
     411                 :          0 : int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
     412                 :            :                 unsigned int timeout_ms, bool use_busy_signal, bool send_status)
     413                 :            : {
     414                 :            :         int err;
     415                 :          0 :         struct mmc_command cmd = {0};
     416                 :            :         unsigned long timeout;
     417                 :            :         u32 status = 0;
     418                 :            :         bool ignore_crc = false;
     419                 :            : 
     420         [ #  # ]:          0 :         BUG_ON(!card);
     421         [ #  # ]:          0 :         BUG_ON(!card->host);
     422                 :            : 
     423                 :          0 :         cmd.opcode = MMC_SWITCH;
     424                 :          0 :         cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
     425                 :          0 :                   (index << 16) |
     426                 :          0 :                   (value << 8) |
     427                 :            :                   set;
     428                 :            :         cmd.flags = MMC_CMD_AC;
     429         [ #  # ]:          0 :         if (use_busy_signal)
     430                 :          0 :                 cmd.flags |= MMC_RSP_SPI_R1B | MMC_RSP_R1B;
     431                 :            :         else
     432                 :          0 :                 cmd.flags |= MMC_RSP_SPI_R1 | MMC_RSP_R1;
     433                 :            : 
     434                 :            : 
     435                 :          0 :         cmd.cmd_timeout_ms = timeout_ms;
     436         [ #  # ]:          0 :         if (index == EXT_CSD_SANITIZE_START)
     437                 :          0 :                 cmd.sanitize_busy = true;
     438                 :            : 
     439                 :          0 :         err = mmc_wait_for_cmd(card->host, &cmd, MMC_CMD_RETRIES);
     440         [ #  # ]:          0 :         if (err)
     441                 :            :                 return err;
     442                 :            : 
     443                 :            :         /* No need to check card status in case of unblocking command */
     444         [ #  # ]:          0 :         if (!use_busy_signal)
     445                 :            :                 return 0;
     446                 :            : 
     447                 :            :         /*
     448                 :            :          * Must check status to be sure of no errors
     449                 :            :          * If CMD13 is to check the busy completion of the timing change,
     450                 :            :          * disable the check of CRC error.
     451                 :            :          */
     452 [ #  # ][ #  # ]:          0 :         if (index == EXT_CSD_HS_TIMING &&
     453                 :          0 :             !(card->host->caps & MMC_CAP_WAIT_WHILE_BUSY))
     454                 :            :                 ignore_crc = true;
     455                 :            : 
     456                 :          0 :         timeout = jiffies + msecs_to_jiffies(MMC_OPS_TIMEOUT_MS);
     457                 :            :         do {
     458         [ #  # ]:          0 :                 if (send_status) {
     459                 :            :                         err = __mmc_send_status(card, &status, ignore_crc);
     460         [ #  # ]:          0 :                         if (err)
     461                 :            :                                 return err;
     462                 :            :                 }
     463         [ #  # ]:          0 :                 if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY)
     464                 :            :                         break;
     465         [ #  # ]:          0 :                 if (mmc_host_is_spi(card->host))
     466                 :            :                         break;
     467                 :            : 
     468                 :            :                 /*
     469                 :            :                  * We are not allowed to issue a status command and the host
     470                 :            :                  * does'nt support MMC_CAP_WAIT_WHILE_BUSY, then we can only
     471                 :            :                  * rely on waiting for the stated timeout to be sufficient.
     472                 :            :                  */
     473         [ #  # ]:          0 :                 if (!send_status) {
     474                 :            :                         mmc_delay(timeout_ms);
     475                 :            :                         return 0;
     476                 :            :                 }
     477                 :            : 
     478                 :            :                 /* Timeout if the device never leaves the program state. */
     479         [ #  # ]:          0 :                 if (time_after(jiffies, timeout)) {
     480                 :          0 :                         pr_err("%s: Card stuck in programming state! %s\n",
     481                 :            :                                 mmc_hostname(card->host), __func__);
     482                 :          0 :                         return -ETIMEDOUT;
     483                 :            :                 }
     484         [ #  # ]:          0 :         } while (R1_CURRENT_STATE(status) == R1_STATE_PRG);
     485                 :            : 
     486         [ #  # ]:          0 :         if (mmc_host_is_spi(card->host)) {
     487         [ #  # ]:          0 :                 if (status & R1_SPI_ILLEGAL_COMMAND)
     488                 :            :                         return -EBADMSG;
     489                 :            :         } else {
     490         [ #  # ]:          0 :                 if (status & 0xFDFFA000)
     491                 :          0 :                         pr_warning("%s: unexpected status %#x after "
     492                 :            :                                "switch", mmc_hostname(card->host), status);
     493         [ #  # ]:          0 :                 if (status & R1_SWITCH_ERROR)
     494                 :            :                         return -EBADMSG;
     495                 :            :         }
     496                 :            : 
     497                 :            :         return 0;
     498                 :            : }
     499                 :            : EXPORT_SYMBOL_GPL(__mmc_switch);
     500                 :            : 
     501                 :          0 : int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
     502                 :            :                 unsigned int timeout_ms)
     503                 :            : {
     504                 :          0 :         return __mmc_switch(card, set, index, value, timeout_ms, true, true);
     505                 :            : }
     506                 :            : EXPORT_SYMBOL_GPL(mmc_switch);
     507                 :            : 
     508                 :            : static int
     509                 :          0 : mmc_send_bus_test(struct mmc_card *card, struct mmc_host *host, u8 opcode,
     510                 :            :                   u8 len)
     511                 :            : {
     512                 :          0 :         struct mmc_request mrq = {NULL};
     513                 :          0 :         struct mmc_command cmd = {0};
     514                 :          0 :         struct mmc_data data = {0};
     515                 :            :         struct scatterlist sg;
     516                 :            :         u8 *data_buf;
     517                 :            :         u8 *test_buf;
     518                 :            :         int i, err;
     519                 :            :         static u8 testdata_8bit[8] = { 0x55, 0xaa, 0, 0, 0, 0, 0, 0 };
     520                 :            :         static u8 testdata_4bit[4] = { 0x5a, 0, 0, 0 };
     521                 :            : 
     522                 :            :         /* dma onto stack is unsafe/nonportable, but callers to this
     523                 :            :          * routine normally provide temporary on-stack buffers ...
     524                 :            :          */
     525                 :          0 :         data_buf = kmalloc(len, GFP_KERNEL);
     526         [ #  # ]:          0 :         if (!data_buf)
     527                 :            :                 return -ENOMEM;
     528                 :            : 
     529         [ #  # ]:          0 :         if (len == 8)
     530                 :            :                 test_buf = testdata_8bit;
     531         [ #  # ]:          0 :         else if (len == 4)
     532                 :            :                 test_buf = testdata_4bit;
     533                 :            :         else {
     534                 :          0 :                 pr_err("%s: Invalid bus_width %d\n",
     535                 :            :                        mmc_hostname(host), len);
     536                 :          0 :                 kfree(data_buf);
     537                 :          0 :                 return -EINVAL;
     538                 :            :         }
     539                 :            : 
     540         [ #  # ]:          0 :         if (opcode == MMC_BUS_TEST_W)
     541                 :          0 :                 memcpy(data_buf, test_buf, len);
     542                 :            : 
     543                 :          0 :         mrq.cmd = &cmd;
     544                 :          0 :         mrq.data = &data;
     545                 :          0 :         cmd.opcode = opcode;
     546                 :          0 :         cmd.arg = 0;
     547                 :            : 
     548                 :            :         /* NOTE HACK:  the MMC_RSP_SPI_R1 is always correct here, but we
     549                 :            :          * rely on callers to never use this with "native" calls for reading
     550                 :            :          * CSD or CID.  Native versions of those commands use the R2 type,
     551                 :            :          * not R1 plus a data block.
     552                 :            :          */
     553                 :          0 :         cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
     554                 :            : 
     555                 :          0 :         data.blksz = len;
     556                 :          0 :         data.blocks = 1;
     557         [ #  # ]:          0 :         if (opcode == MMC_BUS_TEST_R)
     558                 :          0 :                 data.flags = MMC_DATA_READ;
     559                 :            :         else
     560                 :          0 :                 data.flags = MMC_DATA_WRITE;
     561                 :            : 
     562                 :          0 :         data.sg = &sg;
     563                 :          0 :         data.sg_len = 1;
     564                 :          0 :         mmc_set_data_timeout(&data, card);
     565                 :          0 :         sg_init_one(&sg, data_buf, len);
     566                 :          0 :         mmc_wait_for_req(host, &mrq);
     567                 :            :         err = 0;
     568         [ #  # ]:          0 :         if (opcode == MMC_BUS_TEST_R) {
     569         [ #  # ]:          0 :                 for (i = 0; i < len / 4; i++)
     570         [ #  # ]:          0 :                         if ((test_buf[i] ^ data_buf[i]) != 0xff) {
     571                 :            :                                 err = -EIO;
     572                 :            :                                 break;
     573                 :            :                         }
     574                 :            :         }
     575                 :          0 :         kfree(data_buf);
     576                 :            : 
     577         [ #  # ]:          0 :         if (cmd.error)
     578                 :          0 :                 return cmd.error;
     579         [ #  # ]:          0 :         if (data.error)
     580                 :          0 :                 return data.error;
     581                 :            : 
     582                 :            :         return err;
     583                 :            : }
     584                 :            : 
     585                 :          0 : int mmc_bus_test(struct mmc_card *card, u8 bus_width)
     586                 :            : {
     587                 :            :         int err, width;
     588                 :            : 
     589         [ #  # ]:          0 :         if (bus_width == MMC_BUS_WIDTH_8)
     590                 :            :                 width = 8;
     591         [ #  # ]:          0 :         else if (bus_width == MMC_BUS_WIDTH_4)
     592                 :            :                 width = 4;
     593         [ #  # ]:          0 :         else if (bus_width == MMC_BUS_WIDTH_1)
     594                 :            :                 return 0; /* no need for test */
     595                 :            :         else
     596                 :          0 :                 return -EINVAL;
     597                 :            : 
     598                 :            :         /*
     599                 :            :          * Ignore errors from BUS_TEST_W.  BUS_TEST_R will fail if there
     600                 :            :          * is a problem.  This improves chances that the test will work.
     601                 :            :          */
     602                 :          0 :         mmc_send_bus_test(card, card->host, MMC_BUS_TEST_W, width);
     603                 :          0 :         err = mmc_send_bus_test(card, card->host, MMC_BUS_TEST_R, width);
     604                 :          0 :         return err;
     605                 :            : }
     606                 :            : 
     607                 :          0 : int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status)
     608                 :            : {
     609                 :          0 :         struct mmc_command cmd = {0};
     610                 :            :         unsigned int opcode;
     611                 :            :         int err;
     612                 :            : 
     613         [ #  # ]:          0 :         if (!card->ext_csd.hpi) {
     614                 :          0 :                 pr_warning("%s: Card didn't support HPI command\n",
     615                 :            :                            mmc_hostname(card->host));
     616                 :          0 :                 return -EINVAL;
     617                 :            :         }
     618                 :            : 
     619                 :          0 :         opcode = card->ext_csd.hpi_cmd;
     620         [ #  # ]:          0 :         if (opcode == MMC_STOP_TRANSMISSION)
     621                 :          0 :                 cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
     622         [ #  # ]:          0 :         else if (opcode == MMC_SEND_STATUS)
     623                 :          0 :                 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
     624                 :            : 
     625                 :          0 :         cmd.opcode = opcode;
     626                 :          0 :         cmd.arg = card->rca << 16 | 1;
     627                 :            : 
     628                 :          0 :         err = mmc_wait_for_cmd(card->host, &cmd, 0);
     629         [ #  # ]:          0 :         if (err) {
     630                 :          0 :                 pr_warn("%s: error %d interrupting operation. "
     631                 :            :                         "HPI command response %#x\n", mmc_hostname(card->host),
     632                 :            :                         err, cmd.resp[0]);
     633                 :          0 :                 return err;
     634                 :            :         }
     635         [ #  # ]:          0 :         if (status)
     636                 :          0 :                 *status = cmd.resp[0];
     637                 :            : 
     638                 :            :         return 0;
     639                 :            : }

Generated by: LCOV version 1.9