Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later 2 : : /* 3 : : * linux/drivers/mmc/core/sd_ops.h 4 : : * 5 : : * Copyright 2006-2007 Pierre Ossman 6 : : */ 7 : : 8 : : #include <linux/slab.h> 9 : : #include <linux/types.h> 10 : : #include <linux/export.h> 11 : : #include <linux/scatterlist.h> 12 : : 13 : : #include <linux/mmc/host.h> 14 : : #include <linux/mmc/card.h> 15 : : #include <linux/mmc/mmc.h> 16 : : #include <linux/mmc/sd.h> 17 : : 18 : : #include "core.h" 19 : : #include "sd_ops.h" 20 : : 21 : 3 : int mmc_app_cmd(struct mmc_host *host, struct mmc_card *card) 22 : : { 23 : : int err; 24 : 3 : struct mmc_command cmd = {}; 25 : : 26 : 3 : if (WARN_ON(card && card->host != host)) 27 : : return -EINVAL; 28 : : 29 : 3 : cmd.opcode = MMC_APP_CMD; 30 : : 31 : 3 : if (card) { 32 : 3 : cmd.arg = card->rca << 16; 33 : 3 : cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; 34 : : } else { 35 : 3 : cmd.arg = 0; 36 : 3 : cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_BCR; 37 : : } 38 : : 39 : 3 : err = mmc_wait_for_cmd(host, &cmd, 0); 40 : 3 : if (err) 41 : : return err; 42 : : 43 : : /* Check that card supported application commands */ 44 : 3 : if (!mmc_host_is_spi(host) && !(cmd.resp[0] & R1_APP_CMD)) 45 : : return -EOPNOTSUPP; 46 : : 47 : 3 : return 0; 48 : : } 49 : : EXPORT_SYMBOL_GPL(mmc_app_cmd); 50 : : 51 : 3 : static int mmc_wait_for_app_cmd(struct mmc_host *host, struct mmc_card *card, 52 : : struct mmc_command *cmd) 53 : : { 54 : 3 : struct mmc_request mrq = {}; 55 : : int i, err = -EIO; 56 : : 57 : : /* 58 : : * We have to resend MMC_APP_CMD for each attempt so 59 : : * we cannot use the retries field in mmc_command. 60 : : */ 61 : 3 : for (i = 0; i <= MMC_CMD_RETRIES; i++) { 62 : 3 : err = mmc_app_cmd(host, card); 63 : 3 : if (err) { 64 : : /* no point in retrying; no APP commands allowed */ 65 : 0 : if (mmc_host_is_spi(host)) { 66 : 0 : if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) 67 : : break; 68 : : } 69 : 0 : continue; 70 : : } 71 : : 72 : 3 : memset(&mrq, 0, sizeof(struct mmc_request)); 73 : : 74 : 3 : memset(cmd->resp, 0, sizeof(cmd->resp)); 75 : 3 : cmd->retries = 0; 76 : : 77 : 3 : mrq.cmd = cmd; 78 : 3 : cmd->data = NULL; 79 : : 80 : 3 : mmc_wait_for_req(host, &mrq); 81 : : 82 : 3 : err = cmd->error; 83 : 3 : if (!cmd->error) 84 : : break; 85 : : 86 : : /* no point in retrying illegal APP commands */ 87 : 0 : if (mmc_host_is_spi(host)) { 88 : 0 : if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) 89 : : break; 90 : : } 91 : : } 92 : : 93 : 3 : return err; 94 : : } 95 : : 96 : 3 : int mmc_app_set_bus_width(struct mmc_card *card, int width) 97 : : { 98 : 3 : struct mmc_command cmd = {}; 99 : : 100 : 3 : cmd.opcode = SD_APP_SET_BUS_WIDTH; 101 : 3 : cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; 102 : : 103 : 3 : switch (width) { 104 : : case MMC_BUS_WIDTH_1: 105 : : cmd.arg = SD_BUS_WIDTH_1; 106 : : break; 107 : : case MMC_BUS_WIDTH_4: 108 : 3 : cmd.arg = SD_BUS_WIDTH_4; 109 : 3 : break; 110 : : default: 111 : : return -EINVAL; 112 : : } 113 : : 114 : 3 : return mmc_wait_for_app_cmd(card->host, card, &cmd); 115 : : } 116 : : 117 : 3 : int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) 118 : : { 119 : 3 : struct mmc_command cmd = {}; 120 : : int i, err = 0; 121 : : 122 : 3 : cmd.opcode = SD_APP_OP_COND; 123 : 3 : if (mmc_host_is_spi(host)) 124 : 0 : cmd.arg = ocr & (1 << 30); /* SPI only defines one bit */ 125 : : else 126 : 3 : cmd.arg = ocr; 127 : 3 : cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; 128 : : 129 : 3 : for (i = 100; i; i--) { 130 : 3 : err = mmc_wait_for_app_cmd(host, NULL, &cmd); 131 : 3 : if (err) 132 : : break; 133 : : 134 : : /* if we're just probing, do a single pass */ 135 : 3 : if (ocr == 0) 136 : : break; 137 : : 138 : : /* otherwise wait until reset completes */ 139 : 3 : if (mmc_host_is_spi(host)) { 140 : 0 : if (!(cmd.resp[0] & R1_SPI_IDLE)) 141 : : break; 142 : : } else { 143 : 3 : if (cmd.resp[0] & MMC_CARD_BUSY) 144 : : break; 145 : : } 146 : : 147 : : err = -ETIMEDOUT; 148 : : 149 : 2 : mmc_delay(10); 150 : : } 151 : : 152 : 3 : if (!i) 153 : 0 : pr_err("%s: card never left busy state\n", mmc_hostname(host)); 154 : : 155 : 3 : if (rocr && !mmc_host_is_spi(host)) 156 : 3 : *rocr = cmd.resp[0]; 157 : : 158 : 3 : return err; 159 : : } 160 : : 161 : 3 : int mmc_send_if_cond(struct mmc_host *host, u32 ocr) 162 : : { 163 : 3 : struct mmc_command cmd = {}; 164 : : int err; 165 : : static const u8 test_pattern = 0xAA; 166 : : u8 result_pattern; 167 : : 168 : : /* 169 : : * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND 170 : : * before SD_APP_OP_COND. This command will harmlessly fail for 171 : : * SD 1.0 cards. 172 : : */ 173 : 3 : cmd.opcode = SD_SEND_IF_COND; 174 : 3 : cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern; 175 : 3 : cmd.flags = MMC_RSP_SPI_R7 | MMC_RSP_R7 | MMC_CMD_BCR; 176 : : 177 : 3 : err = mmc_wait_for_cmd(host, &cmd, 0); 178 : 3 : if (err) 179 : : return err; 180 : : 181 : 3 : if (mmc_host_is_spi(host)) 182 : 0 : result_pattern = cmd.resp[1] & 0xFF; 183 : : else 184 : 3 : result_pattern = cmd.resp[0] & 0xFF; 185 : : 186 : 3 : if (result_pattern != test_pattern) 187 : : return -EIO; 188 : : 189 : 3 : return 0; 190 : : } 191 : : 192 : 3 : int mmc_send_relative_addr(struct mmc_host *host, unsigned int *rca) 193 : : { 194 : : int err; 195 : 3 : struct mmc_command cmd = {}; 196 : : 197 : 3 : cmd.opcode = SD_SEND_RELATIVE_ADDR; 198 : : cmd.arg = 0; 199 : 3 : cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR; 200 : : 201 : 3 : err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); 202 : 3 : if (err) 203 : : return err; 204 : : 205 : 3 : *rca = cmd.resp[0] >> 16; 206 : : 207 : 3 : return 0; 208 : : } 209 : : 210 : 3 : int mmc_app_send_scr(struct mmc_card *card) 211 : : { 212 : : int err; 213 : 3 : struct mmc_request mrq = {}; 214 : 3 : struct mmc_command cmd = {}; 215 : 3 : struct mmc_data data = {}; 216 : : struct scatterlist sg; 217 : : __be32 *scr; 218 : : 219 : : /* NOTE: caller guarantees scr is heap-allocated */ 220 : : 221 : 3 : err = mmc_app_cmd(card->host, card); 222 : 3 : if (err) 223 : : return err; 224 : : 225 : : /* dma onto stack is unsafe/nonportable, but callers to this 226 : : * routine normally provide temporary on-stack buffers ... 227 : : */ 228 : : scr = kmalloc(sizeof(card->raw_scr), GFP_KERNEL); 229 : 3 : if (!scr) 230 : : return -ENOMEM; 231 : : 232 : 3 : mrq.cmd = &cmd; 233 : 3 : mrq.data = &data; 234 : : 235 : 3 : cmd.opcode = SD_APP_SEND_SCR; 236 : 3 : cmd.arg = 0; 237 : 3 : cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; 238 : : 239 : 3 : data.blksz = 8; 240 : 3 : data.blocks = 1; 241 : 3 : data.flags = MMC_DATA_READ; 242 : 3 : data.sg = &sg; 243 : 3 : data.sg_len = 1; 244 : : 245 : 3 : sg_init_one(&sg, scr, 8); 246 : : 247 : 3 : mmc_set_data_timeout(&data, card); 248 : : 249 : 3 : mmc_wait_for_req(card->host, &mrq); 250 : : 251 : 3 : card->raw_scr[0] = be32_to_cpu(scr[0]); 252 : 3 : card->raw_scr[1] = be32_to_cpu(scr[1]); 253 : : 254 : 3 : kfree(scr); 255 : : 256 : 3 : if (cmd.error) 257 : : return cmd.error; 258 : 3 : if (data.error) 259 : 0 : return data.error; 260 : : 261 : : return 0; 262 : : } 263 : : 264 : 3 : int mmc_sd_switch(struct mmc_card *card, int mode, int group, 265 : : u8 value, u8 *resp) 266 : : { 267 : 3 : struct mmc_request mrq = {}; 268 : 3 : struct mmc_command cmd = {}; 269 : 3 : struct mmc_data data = {}; 270 : : struct scatterlist sg; 271 : : 272 : : /* NOTE: caller guarantees resp is heap-allocated */ 273 : : 274 : 3 : mode = !!mode; 275 : 3 : value &= 0xF; 276 : : 277 : 3 : mrq.cmd = &cmd; 278 : 3 : mrq.data = &data; 279 : : 280 : 3 : cmd.opcode = SD_SWITCH; 281 : 3 : cmd.arg = mode << 31 | 0x00FFFFFF; 282 : 3 : cmd.arg &= ~(0xF << (group * 4)); 283 : 3 : cmd.arg |= value << (group * 4); 284 : 3 : cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; 285 : : 286 : 3 : data.blksz = 64; 287 : 3 : data.blocks = 1; 288 : 3 : data.flags = MMC_DATA_READ; 289 : 3 : data.sg = &sg; 290 : 3 : data.sg_len = 1; 291 : : 292 : 3 : sg_init_one(&sg, resp, 64); 293 : : 294 : 3 : mmc_set_data_timeout(&data, card); 295 : : 296 : 3 : mmc_wait_for_req(card->host, &mrq); 297 : : 298 : 3 : if (cmd.error) 299 : : return cmd.error; 300 : 3 : if (data.error) 301 : 0 : return data.error; 302 : : 303 : : return 0; 304 : : } 305 : : 306 : 3 : int mmc_app_sd_status(struct mmc_card *card, void *ssr) 307 : : { 308 : : int err; 309 : 3 : struct mmc_request mrq = {}; 310 : 3 : struct mmc_command cmd = {}; 311 : 3 : struct mmc_data data = {}; 312 : : struct scatterlist sg; 313 : : 314 : : /* NOTE: caller guarantees ssr is heap-allocated */ 315 : : 316 : 3 : err = mmc_app_cmd(card->host, card); 317 : 3 : if (err) 318 : : return err; 319 : : 320 : 3 : mrq.cmd = &cmd; 321 : 3 : mrq.data = &data; 322 : : 323 : 3 : cmd.opcode = SD_APP_SD_STATUS; 324 : 3 : cmd.arg = 0; 325 : 3 : cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_ADTC; 326 : : 327 : 3 : data.blksz = 64; 328 : 3 : data.blocks = 1; 329 : 3 : data.flags = MMC_DATA_READ; 330 : 3 : data.sg = &sg; 331 : 3 : data.sg_len = 1; 332 : : 333 : 3 : sg_init_one(&sg, ssr, 64); 334 : : 335 : 3 : mmc_set_data_timeout(&data, card); 336 : : 337 : 3 : mmc_wait_for_req(card->host, &mrq); 338 : : 339 : 3 : if (cmd.error) 340 : : return cmd.error; 341 : 3 : if (data.error) 342 : 0 : return data.error; 343 : : 344 : : return 0; 345 : : }