RE: [PATCH 2/5] mmc-utils: lsmmc: Simplify prinitng manufacturer name

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

 



> 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?
Yes.  Thanks.

Avri

> 
> 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
> >




[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