@@ -58,11 +58,11 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
5858 const struct mtd_partition * * pparts ,
5959 struct mtd_part_parser_data * data )
6060{
61+ size_t len = SMEM_FLASH_PTABLE_HDR_LEN ;
62+ int ret , i , j , tmpparts , numparts = 0 ;
6163 struct smem_flash_pentry * pentry ;
6264 struct smem_flash_ptable * ptable ;
63- size_t len = SMEM_FLASH_PTABLE_HDR_LEN ;
6465 struct mtd_partition * parts ;
65- int ret , i , numparts ;
6666 char * name , * c ;
6767
6868 if (IS_ENABLED (CONFIG_MTD_SPI_NOR_USE_4K_SECTORS )
@@ -75,7 +75,8 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
7575 pr_debug ("Parsing partition table info from SMEM\n" );
7676 ptable = qcom_smem_get (SMEM_APPS , SMEM_AARM_PARTITION_TABLE , & len );
7777 if (IS_ERR (ptable )) {
78- pr_err ("Error reading partition table header\n" );
78+ if (PTR_ERR (ptable ) != - EPROBE_DEFER )
79+ pr_err ("Error reading partition table header\n" );
7980 return PTR_ERR (ptable );
8081 }
8182
@@ -87,8 +88,8 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
8788 }
8889
8990 /* Ensure that # of partitions is less than the max we have allocated */
90- numparts = le32_to_cpu (ptable -> numparts );
91- if (numparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4 ) {
91+ tmpparts = le32_to_cpu (ptable -> numparts );
92+ if (tmpparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4 ) {
9293 pr_err ("Partition numbers exceed the max limit\n" );
9394 return - EINVAL ;
9495 }
@@ -116,11 +117,17 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
116117 return PTR_ERR (ptable );
117118 }
118119
120+ for (i = 0 ; i < tmpparts ; i ++ ) {
121+ pentry = & ptable -> pentry [i ];
122+ if (pentry -> name [0 ] != '\0' )
123+ numparts ++ ;
124+ }
125+
119126 parts = kcalloc (numparts , sizeof (* parts ), GFP_KERNEL );
120127 if (!parts )
121128 return - ENOMEM ;
122129
123- for (i = 0 ; i < numparts ; i ++ ) {
130+ for (i = 0 , j = 0 ; i < tmpparts ; i ++ ) {
124131 pentry = & ptable -> pentry [i ];
125132 if (pentry -> name [0 ] == '\0' )
126133 continue ;
@@ -135,24 +142,25 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
135142 for (c = name ; * c != '\0' ; c ++ )
136143 * c = tolower (* c );
137144
138- parts [i ].name = name ;
139- parts [i ].offset = le32_to_cpu (pentry -> offset ) * mtd -> erasesize ;
140- parts [i ].mask_flags = pentry -> attr ;
141- parts [i ].size = le32_to_cpu (pentry -> length ) * mtd -> erasesize ;
145+ parts [j ].name = name ;
146+ parts [j ].offset = le32_to_cpu (pentry -> offset ) * mtd -> erasesize ;
147+ parts [j ].mask_flags = pentry -> attr ;
148+ parts [j ].size = le32_to_cpu (pentry -> length ) * mtd -> erasesize ;
142149 pr_debug ("%d: %s offs=0x%08x size=0x%08x attr:0x%08x\n" ,
143150 i , pentry -> name , le32_to_cpu (pentry -> offset ),
144151 le32_to_cpu (pentry -> length ), pentry -> attr );
152+ j ++ ;
145153 }
146154
147155 pr_debug ("SMEM partition table found: ver: %d len: %d\n" ,
148- le32_to_cpu (ptable -> version ), numparts );
156+ le32_to_cpu (ptable -> version ), tmpparts );
149157 * pparts = parts ;
150158
151159 return numparts ;
152160
153161out_free_parts :
154- while (-- i >= 0 )
155- kfree (parts [i ].name );
162+ while (-- j >= 0 )
163+ kfree (parts [j ].name );
156164 kfree (parts );
157165 * pparts = NULL ;
158166
@@ -166,6 +174,8 @@ static void parse_qcomsmem_cleanup(const struct mtd_partition *pparts,
166174
167175 for (i = 0 ; i < nr_parts ; i ++ )
168176 kfree (pparts [i ].name );
177+
178+ kfree (pparts );
169179}
170180
171181static const struct of_device_id qcomsmem_of_match_table [] = {
0 commit comments