RE: mmc-utils changes for Erase commands.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please send your patch in the appropriate format,
So it can be reviewed.

Thanks,
Avri

> 
> 
> mmc.h
> 36a37,45
>  > #define MMC_ERASE_GROUP_START   35    /* ac   [31:0] data addr   R1  */
>  > #define MMC_ERASE_GROUP_END     36    /* ac   [31:0] data addr   R1  */
>  > #define MMC_ERASE               38    /* ac   [31] Secure request
>  >                                               [30:16] set to 0  >                                               [15] Force
> Garbage Collect request4  >                                               [14:2] set to 0
> >                                               [1] Discard Enable  >                                               [0]
> Identify Write Blocks for Erase (or TRIM Enable)  > R1b */
> 
> mmc_cmds.h
> 33a34
>  > int do_erase(int nargs, char **argv);
> 
> mmc_cmds.c
> 226a227,291
>  > int erase(int fd, __u32 argin, __u32 start, __u32 end)  > {  >         int ret = 0;
>  >     struct mmc_ioc_cmd idata;
>  >     __u32  response;
>  >
>  >     // Set Start address
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE_GROUP_START;
>  >     idata.arg = start;
>  >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret)  {
>  >       perror("ioctl");
>  >       printf("Erase Group Start Address command failed\n");
>  >       return ret;
>  >     }
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0) {
>  >       printf("CMD13 returns: 0x%08x during CMD35\n", response);
>  >     }
>  >
>  >     // Set end address
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE_GROUP_END;
>  >     idata.arg = end;
>  >     idata.flags = MMC_RSP_R1 | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret) {
>  >       perror("ioctl");
>  >       printf("Erase Group End Address command failed\n");
>  >       return ret;
>  >     }
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0)
>  >       printf("CMD13 returns: 0x%08x during CMD36\n", response);
>  >
>  >     // Send Erase Command
>  >     memset(&idata, 0, sizeof(idata));
>  >     idata.opcode = MMC_ERASE;
>  >     idata.arg = argin;
>  >     idata.cmd_timeout_ms = 60000;
>  >     idata.data_timeout_ns = 60000000;
>  >     idata.flags = MMC_RSP_R1B | MMC_CMD_AC;
>  >     ret = ioctl(fd, MMC_IOC_CMD, &idata);
>  >     if (ret)  {
>  >       perror("ioctl");
>  >       printf("Erase command failed\n");
>  >       return ret;
>  >     }
>  >
>  >     // Send Status Command
>  >     // 1098 7654 3210 9876 5432 1098 7654 3210
>  >     // 3322 2222 2222 1111 1111 1100 0000 0000
>  >     // 1111 1111 1111 1xx1 xxxx xxxx 11xx xxxx  Device Status Error bits
>  >     // F    F    F    9    0    0    C    0     0xFFF900C0
>  >     ret = send_status(fd, &response);
>  >     if (response & 0xFFF900C0)
>  >       printf("CMD13 returns: 0x%08x during CMD38\n", response);
>  >     if (ret)
>  >       printf("Send Status Command returned 0x%08X\n", response);
>  >
>  >     return ret;
>  > }
>  >
> 1150a1216
>  >
> 1842a1909,1985
>  >
>  >
>  >
>  > int do_erase(int nargs, char **argv)
>  > {
>  >     int fd, ret;
>  >     char *device;
>  >     char **eptr=NULL;
>  >     __u32  argin, start, end;
>  >
>  >
>  >     if (nargs != 5) {
>  >         fprintf(stderr, "Usage: mmc erase <arg> <start address> <end
> address> </path/to/mmcblkX>\n");
>  >         exit(1);
>  >     }
>  >
>  >     if ((argv[1][0] == '0') && (argv[1][1] == 'x'))
>  >       argin = strtol(argv[1], eptr, 16);
>  >     else
>  >       argin = strtol(argv[1], eptr, 10);
>  >     if ((argv[2][0] == '0') && (argv[2][1] == 'x'))
>  >       start = strtol(argv[2], eptr, 16);
>  >     else
>  >       start = strtol(argv[2], eptr, 10);
>  >     if ((argv[3][0] == '0') && (argv[3][1] == 'x'))
>  >       end   = strtol(argv[3], eptr, 16);
>  >     else
>  >       end   = strtol(argv[3], eptr, 10);
>  >     device = argv[4];
>  >
>  >     fd = open(device, O_RDWR);
>  >     if (fd < 0) {
>  >         perror("open");
>  >         exit(1);
>  >     }
>  >
>  >     printf("Executing (0x%08X): ", argin);
>  >     switch(argin)  {
>  >     case 0x00000000:
>  >       printf("Erase ");
>  >       break;
>  >     case 0x00000003:
>  >       printf("Discard ");
>  >       break;
>  >     case 0x80000000:
>  >       printf("Secure Erase ");
>  >       break;
>  >     case 0x80008000:
>  >       printf("Secure Trim Step 2 ");
>  >       break;
>  >     case 0x80000001:
>  >       printf("Secure Trim Step 1 ");
>  >       break;
>  >     case 0x00000001:
>  >       printf("Trim ");
>  >       break;
>  >     default:
>  >       printf("Unknown Argument ");
>  >     }
>  >     printf("From:0x%08X To:0x%08X\n", start, end);
>  >
>  >     ret = erase(fd, argin, start, end);
>  >     if (ret) {
>  >         fprintf(stderr, "Error in Erase Command to %s with Arg=0x%08X
> Start=0x%08X End=0x%08X\n",
>  >             device,
>  >             argin,
>  >             start,
>  >             end);
>  >         exit(1);
>  >     }
>  >
>  >     return ret;
>  >
>  > }
>  >
>  >
>  >
> 
> mmc.c
> 29c29
> < #define MMC_VERSION    "0.1"
> ---
>  > #define MMC_VERSION    "0.1_KS"
> 135a136,140
>  >       NULL
>  >     },
>  >     { do_erase, -4,
>  >       "erase", "<arg> " "<start address> " "<end address> " "<device>\n"
>  >         "Send Erase command to the <device>.\nThis will delete all
> user data in the specified region of the device.",
> 
> 





[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux