On Tue, 26 Sept 2023 at 12:02, Avri Altman <avri.altman@xxxxxxx> wrote: > > We used to have this odd way of printing the manufacturer name. To that > end we cached the entire database beforehand which is completely > useless. > > While at it, get rid of some more redundant code. > > Signed-off-by: Avri Altman <avri.altman@xxxxxxx> I tried building this for arm64 but get the following errors/warnings: lsmmc.c: In function ‘get_manufacturer’: lsmmc.c:56:38: error: division ‘sizeof (struct ids_database *) / sizeof (struct ids_database)’ does not compute the number of array elements [-Werror=sizeof-pointer-div] 56 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) | ^ lsmmc.c:287:25: note: in expansion of macro ‘ARRAY_SIZE’ 287 | unsigned int ids_cnt = ARRAY_SIZE(db); | ^~~~~~~~~~ lsmmc.c:286:23: note: first ‘sizeof’ operand was declared here 286 | struct ids_database *db = config->bus == MMC ? mmc_database : sd_database; | ^~ cc1: all warnings being treated as errors make: *** [Makefile:38: lsmmc.o] Error 1 Can you have a look? Kind regards Uffe > --- > lsmmc.c | 150 ++++++++++++++------------------------------------------ > 1 file changed, 37 insertions(+), 113 deletions(-) > > diff --git a/lsmmc.c b/lsmmc.c > index 85779bb..7e3165a 100644 > --- a/lsmmc.c > +++ b/lsmmc.c > @@ -53,16 +53,19 @@ > #define MASK(high, low) (MASKTOBIT0(high) & ~MASKTOBIT0(low - 1)) > #define BITS(value, high, low) (((value) & MASK((high), (low))) >> (low)) > #define IDS_MAX 256 > +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) > + > +enum bus_type { > + MMC = 1, > + SD, > +}; > > struct config { > char *idsfile; > char *dir; > bool verbose; > - int interfaces; > - char **interface; > - char **mmc_ids; > - char **sd_ids; > > + enum bus_type bus; > char *type; > char *cid; > char *csd; > @@ -78,189 +81,157 @@ enum REG_TYPE { > }; > > struct ids_database { > - char *type; > int id; > char *manufacturer; > }; > > -struct ids_database database[] = { > +static struct ids_database sd_database[] = { > { > - .type = "sd", > .id = 0x01, > .manufacturer = "Panasonic", > }, > { > - .type = "sd", > .id = 0x02, > .manufacturer = "Toshiba/Kingston/Viking", > }, > { > - .type = "sd", > .id = 0x03, > .manufacturer = "SanDisk", > }, > { > - .type = "sd", > .id = 0x08, > .manufacturer = "Silicon Power", > }, > { > - .type = "sd", > .id = 0x18, > .manufacturer = "Infineon", > }, > { > - .type = "sd", > .id = 0x1b, > .manufacturer = "Transcend/Samsung", > }, > { > - .type = "sd", > .id = 0x1c, > .manufacturer = "Transcend", > }, > { > - .type = "sd", > .id = 0x1d, > .manufacturer = "Corsair/AData", > }, > { > - .type = "sd", > .id = 0x1e, > .manufacturer = "Transcend", > }, > { > - .type = "sd", > .id = 0x1f, > .manufacturer = "Kingston", > }, > { > - .type = "sd", > .id = 0x27, > .manufacturer = "Delkin/Phison", > }, > { > - .type = "sd", > .id = 0x28, > .manufacturer = "Lexar", > }, > { > - .type = "sd", > .id = 0x30, > .manufacturer = "SanDisk", > }, > { > - .type = "sd", > .id = 0x31, > .manufacturer = "Silicon Power", > }, > { > - .type = "sd", > .id = 0x33, > .manufacturer = "STMicroelectronics", > }, > { > - .type = "sd", > .id = 0x41, > .manufacturer = "Kingston", > }, > { > - .type = "sd", > .id = 0x6f, > .manufacturer = "STMicroelectronics", > }, > { > - .type = "sd", > .id = 0x74, > .manufacturer = "Transcend", > }, > { > - .type = "sd", > .id = 0x76, > .manufacturer = "Patriot", > }, > { > - .type = "sd", > .id = 0x82, > .manufacturer = "Gobe/Sony", > }, > { > - .type = "sd", > .id = 0x89, > .manufacturer = "Unknown", > }, > +}; > + > +static struct ids_database mmc_database[] = { > { > - .type = "mmc", > .id = 0x00, > .manufacturer = "SanDisk", > }, > { > - .type = "mmc", > .id = 0x02, > .manufacturer = "Kingston/SanDisk", > }, > { > - .type = "mmc", > .id = 0x03, > .manufacturer = "Toshiba", > }, > { > - .type = "mmc", > .id = 0x05, > .manufacturer = "Unknown", > }, > { > - .type = "mmc", > .id = 0x06, > .manufacturer = "Unknown", > }, > { > - .type = "mmc", > .id = 0x11, > .manufacturer = "Toshiba", > }, > { > - .type = "mmc", > .id = 0x13, > .manufacturer = "Micron", > }, > { > - .type = "mmc", > .id = 0x15, > .manufacturer = "Samsung/SanDisk/LG", > }, > { > - .type = "mmc", > .id = 0x37, > .manufacturer = "KingMax", > }, > { > - .type = "mmc", > .id = 0x44, > .manufacturer = "ATP", > }, > { > - .type = "mmc", > .id = 0x45, > .manufacturer = "SanDisk Corporation", > }, > { > - .type = "mmc", > .id = 0x2c, > .manufacturer = "Kingston", > }, > { > - .type = "mmc", > .id = 0x70, > .manufacturer = "Kingston", > }, > { > - .type = "mmc", > .id = 0xfe, > .manufacturer = "Micron", > }, > }; > > + > /* Command line parsing functions */ > void usage(void) > { > @@ -310,47 +281,18 @@ int parse_opts(int argc, char **argv, struct config *config) > return 0; > } > > -int parse_ids(struct config *config) > +static char *get_manufacturer(struct config *config, unsigned int manid) > { > - unsigned int ids_cnt = sizeof(database) / sizeof(struct ids_database); > - unsigned int value; > - char **ids; > - char *type; > + struct ids_database *db = config->bus == MMC ? mmc_database : sd_database; > + unsigned int ids_cnt = ARRAY_SIZE(db); > int i; > > for (i = 0; i < ids_cnt; i++) { > - type = database[i].type; > - > - if (!strcmp(type, "mmc")) { > - ids = config->mmc_ids; > - } else if (!strcmp(type, "sd")) { > - ids = config->sd_ids; > - } else { > - fprintf(stderr, > - "MMC/SD id parse error, unknown type: '%s'.\n", > - type); > - return -1; > - } > - > - value = database[i].id; > - > - if (value >= IDS_MAX) { > - fprintf(stderr, > - "MMC/SD id parse error, id out of range.\n"); > - return -1; > - } > - > - if (ids[value]) { > - fprintf(stderr, > - "Duplicate entries: type='%s', id='0x%1x'.\n", > - type, value); > - return -1; > - } > - > - ids[value] = database[i].manufacturer; > + if (db[i].id == manid) > + return db[i].manufacturer; > } > > - return 0; > + return NULL; > } > > /* MMC/SD file parsing functions */ > @@ -538,6 +480,7 @@ void print_sd_cid(struct config *config, char *cid) > unsigned int mdt_month; > unsigned int mdt_year; > unsigned int crc; > + char *manufacturer = NULL; > > parse_bin(cid, "8u16a40a4u4u32u4r8u4u7u1r", > &mid, &oid[0], &pnm[0], &prv_major, &prv_minor, &psn, > @@ -546,12 +489,14 @@ void print_sd_cid(struct config *config, char *cid) > oid[2] = '\0'; > pnm[5] = '\0'; > > + manufacturer = get_manufacturer(config, mid); > + > if (config->verbose) { > printf("======SD/CID======\n"); > > printf("\tMID: 0x%02x (", mid); > - if (config->sd_ids[mid]) > - printf("%s)\n", config->sd_ids[mid]); > + if (manufacturer) > + printf("%s)\n", manufacturer); > else > printf("Unlisted)\n"); > > @@ -564,9 +509,9 @@ void print_sd_cid(struct config *config, char *cid) > 2000 + mdt_year, months[mdt_month]); > printf("\tCRC: 0x%02x\n", crc); > } else { > - if (config->sd_ids[mid]) > + if (manufacturer) > printf("manufacturer: '%s' '%s'\n", > - config->sd_ids[mid], oid); > + manufacturer, oid); > else > printf("manufacturer: 'Unlisted' '%s'\n", oid); > > @@ -594,6 +539,7 @@ void print_mmc_cid(struct config *config, char *cid) > unsigned int mdt_month; > unsigned int mdt_year; > unsigned int crc; > + char *manufacturer = NULL; > > parse_bin(cid, "8u6r2u8u48a4u4u32u4u4u7u1r", > &mid, &cbx, &oid, &pnm[0], &prv_major, &prv_minor, &psn, > @@ -601,12 +547,14 @@ void print_mmc_cid(struct config *config, char *cid) > > pnm[6] = '\0'; > > + manufacturer = get_manufacturer(config, mid); > + > if (config->verbose) { > printf("======MMC/CID======\n"); > > printf("\tMID: 0x%02x (", mid); > - if (config->mmc_ids[mid]) > - printf("%s)\n", config->mmc_ids[mid]); > + if (manufacturer) > + printf("%s)\n", manufacturer); > else > printf("Unlisted)\n"); > > @@ -635,9 +583,9 @@ void print_mmc_cid(struct config *config, char *cid) > 1997 + mdt_year, months[mdt_month]); > printf("\tCRC: 0x%02x\n", crc); > } else { > - if (config->mmc_ids[mid]) > + if (manufacturer) > printf("manufacturer: 0x%02x (%s) oid: 0x%01x\n", > - mid, config->mmc_ids[mid], oid); > + mid, manufacturer, oid); > else > printf("manufacturer: 0x%02x (Unlisted) oid: 0x%01x\n", mid, oid); > > @@ -2308,6 +2256,8 @@ int process_dir(struct config *config, enum REG_TYPE reg) > goto err; > } > > + config->bus = strcmp(type, "MMC") ? SD : MMC; > + > switch (reg) { > case CID: > cid = read_file("cid"); > @@ -2369,45 +2319,19 @@ err: > return ret; > } > > -int lsmmc_main(struct config *config, int argc, char **argv) > -{ > - int ret; > - > - config->mmc_ids = calloc(IDS_MAX, sizeof(char *)); > - config->sd_ids = calloc(IDS_MAX, sizeof(char *)); > - if (!config->mmc_ids || !config->sd_ids) { > - fprintf(stderr, "Could not allocate memory for lsmmc.\n"); > - return -1; > - } > - > - ret = parse_opts(argc, argv, config); > - if (ret) > - return ret; > - > - return parse_ids(config); > -} > - > -void lsmmc_free(struct config *config) > -{ > - free(config->mmc_ids); > - free(config->sd_ids); > - free(config->dir); > -} > - > static int do_read_reg(int argc, char **argv, enum REG_TYPE reg) > { > struct config cfg = {}; > int ret; > > - ret = lsmmc_main(&cfg, argc, argv); > + ret = parse_opts(argc, argv, &cfg); > if (ret) > - goto out; > + return ret; > > if (cfg.dir) > ret = process_dir(&cfg, reg); > > -out: > - lsmmc_free(&cfg); > + free(cfg.dir); > > return ret; > > -- > 2.42.0 >