mtd: spi-nor: Fix address width on flash chips > 16MB
Subsystems (2)
PATCH v2 1/1 mtd: spi-nor: Fix address width on flash chips > 16MB
If a flash chip has more than 16MB capacity but its BFPT reports BFPT_DWORD1_ADDRESS_BYTES_3_OR_4, the spi-nor framework defaults to 3.
The check in spi_nor_set_addr_width() doesn't catch it because addr_width did get set. This fixes that check.
--- drivers/mtd/spi-nor/core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/spi-nor/core.c +5 -3
@@ -3009,13 +3009,15 @@ static int spi_nor_set_addr_width(struct spi_nor *nor)/* already configured from SFDP */ }else if (nor->info->addr_width) { nor->addr_width = nor->info->addr_width; - }else if (nor->mtd.size >0x1000000 ) { -/* enable 4-byte addressing if the device exceeds 16MiB */ - nor->addr_width =4 ; }else { nor->addr_width =3 ; } +if (nor->addr_width ==3 && nor->mtd.size >0x1000000 ) { +/* enable 4-byte addressing if the device exceeds 16MiB */ + nor->addr_width =4 ; + } +if (nor->addr_width >SPI_NOR_MAX_ADDR_WIDTH ) {dev_dbg (nor->dev,"address width is too large: %u\n" , nor->addr_width);
Signature · 1 line
2.17.1
Quoted 8 lines · Bert Vermeulen
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
If a flash chip has more than 16MB capacity but its BFPT reports
BFPT_DWORD1_ADDRESS_BYTES_3_OR_4, the spi-nor framework defaults to 3.The check in
spi_nor_set_addr_width()doesn't catch it becauseaddr_widthdid get set. This fixes that check.
the problem was uncovered with commit f9acd7fa80be, so maybe a Fixes tag will help.
Quoted 1 line
Signed-off-by Bert Vermeulen <[email protected]>
We can have this automatically in the stable tree by adding the tag:
Quoted 30 lines
--- drivers/mtd/spi-nor/core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)drivers/mtd/spi-nor/core.c +5
-4@@ -3009,13 +3009,15 @@ static int spi_nor_set_addr_width(struct spi_nor *nor)/* already configured from SFDP */ }else if (nor->info->addr_width) { nor->addr_width = nor->info->addr_width; - }else if (nor->mtd.size >0x1000000 ) { -/* enable 4-byte addressing if the device exceeds 16MiB */ - nor->addr_width =4 ; }else { nor->addr_width =3 ; } +if (nor->addr_width ==3 && nor->mtd.size >0x1000000 ) { +/* enable 4-byte addressing if the device exceeds 16MiB */ + nor->addr_width =4 ; + } +if (nor->addr_width >SPI_NOR_MAX_ADDR_WIDTH ) {dev_dbg (nor->dev,"address width is too large: %u\n" , nor->addr_width); --2.17.1
Quoted 8 lines · Bert Vermeulen
If a flash chip has more than 16MB capacity but its BFPT reports
BFPT_DWORD1_ADDRESS_BYTES_3_OR_4, the spi-nor framework defaults to 3.The check in
spi_nor_set_addr_width()doesn't catch it becauseaddr_widthdid get set. This fixes that check.Signed-off-by Bert Vermeulen <[email protected]>
After replying to the other thread, I just saw this one.
Thanks Bert!
Cheers,
Joel
Quoted 30 lines
--- drivers/mtd/spi-nor/core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)drivers/mtd/spi-nor/core.c +5
-4@@ -3009,13 +3009,15 @@ static int spi_nor_set_addr_width(struct spi_nor *nor)/* already configured from SFDP */ }else if (nor->info->addr_width) { nor->addr_width = nor->info->addr_width; - }else if (nor->mtd.size >0x1000000 ) { -/* enable 4-byte addressing if the device exceeds 16MiB */ - nor->addr_width =4 ; }else { nor->addr_width =3 ; } +if (nor->addr_width ==3 && nor->mtd.size >0x1000000 ) { +/* enable 4-byte addressing if the device exceeds 16MiB */ + nor->addr_width =4 ; + } +if (nor->addr_width >SPI_NOR_MAX_ADDR_WIDTH ) {dev_dbg (nor->dev,"address width is too large: %u\n" , nor->addr_width); --2.17.1
Quoted 8 lines · Joel Stanley
Quoted 7 lines · Bert Vermeulen
If a flash chip has more than 16MB capacity but its BFPT reports
BFPT_DWORD1_ADDRESS_BYTES_3_OR_4, the spi-nor framework defaults to 3.The check in
spi_nor_set_addr_width()doesn't catch it becauseaddr_widthdid get set. This fixes that check.
Quoted 8 lines
Quoted 1 line
Signed-off-by Bert Vermeulen <[email protected]>After replying to the other thread, I just saw this one.
Reviewed-by Joel Stanley <[email protected]>Tested-by Joel Stanley <[email protected]>Thanks Bert!
Yes. I was starting to add bfpt-fixups for all chips we use on Aspeed based system.
Thanks,
C.
Quoted 34 lines
Cheers,
Joel
Quoted 30 lines
--- drivers/mtd/spi-nor/core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)drivers/mtd/spi-nor/core.c +5
-4@@ -3009,13 +3009,15 @@ static int spi_nor_set_addr_width(struct spi_nor *nor)/* already configured from SFDP */ }else if (nor->info->addr_width) { nor->addr_width = nor->info->addr_width; - }else if (nor->mtd.size >0x1000000 ) { -/* enable 4-byte addressing if the device exceeds 16MiB */ - nor->addr_width =4 ; }else { nor->addr_width =3 ; } +if (nor->addr_width ==3 && nor->mtd.size >0x1000000 ) { +/* enable 4-byte addressing if the device exceeds 16MiB */ + nor->addr_width =4 ; + } +if (nor->addr_width >SPI_NOR_MAX_ADDR_WIDTH ) {dev_dbg (nor->dev,"address width is too large: %u\n" , nor->addr_width); --2.17.1