net/cxgbe: fix init failure due to new flash parts
Add decode logic for new flash parts shipped with new Chelsio NICs to fix initialization failure on these NICs. Cc: stable@dpdk.org Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
This commit is contained in:
parent
174e54baf9
commit
9726c51df0
@ -4681,9 +4681,8 @@ struct flash_desc {
|
||||
int t4_get_flash_params(struct adapter *adapter)
|
||||
{
|
||||
/*
|
||||
* Table for non-Numonix supported flash parts. Numonix parts are left
|
||||
* to the preexisting well-tested code. All flash parts have 64KB
|
||||
* sectors.
|
||||
* Table for non-standard supported Flash parts. Note, all Flash
|
||||
* parts must have 64KB sectors.
|
||||
*/
|
||||
static struct flash_desc supported_flash[] = {
|
||||
{ 0x00150201, 4 << 20 }, /* Spansion 4MB S25FL032P */
|
||||
@ -4692,7 +4691,7 @@ int t4_get_flash_params(struct adapter *adapter)
|
||||
int ret;
|
||||
u32 flashid = 0;
|
||||
unsigned int part, manufacturer;
|
||||
unsigned int density, size;
|
||||
unsigned int density, size = 0;
|
||||
|
||||
/**
|
||||
* Issue a Read ID Command to the Flash part. We decode supported
|
||||
@ -4707,6 +4706,9 @@ int t4_get_flash_params(struct adapter *adapter)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/**
|
||||
* Check to see if it's one of our non-standard supported Flash parts.
|
||||
*/
|
||||
for (part = 0; part < ARRAY_SIZE(supported_flash); part++) {
|
||||
if (supported_flash[part].vendor_and_model_id == flashid) {
|
||||
adapter->params.sf_size =
|
||||
@ -4717,6 +4719,15 @@ int t4_get_flash_params(struct adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode Flash part size. The code below looks repetative with
|
||||
* common encodings, but that's not guaranteed in the JEDEC
|
||||
* specification for the Read JADEC ID command. The only thing that
|
||||
* we're guaranteed by the JADEC specification is where the
|
||||
* Manufacturer ID is in the returned result. After that each
|
||||
* Manufacturer ~could~ encode things completely differently.
|
||||
* Note, all Flash parts must have 64KB sectors.
|
||||
*/
|
||||
manufacturer = flashid & 0xff;
|
||||
switch (manufacturer) {
|
||||
case 0x20: { /* Micron/Numonix */
|
||||
@ -4753,21 +4764,81 @@ int t4_get_flash_params(struct adapter *adapter)
|
||||
case 0x22:
|
||||
size = 1 << 28; /* 256MB */
|
||||
break;
|
||||
default:
|
||||
dev_err(adapter, "Micron Flash Part has bad size, ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adapter->params.sf_size = size;
|
||||
adapter->params.sf_nsec = size / SF_SEC_SIZE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
dev_err(adapter, "Unsupported Flash Part, ID = %#x\n", flashid);
|
||||
return -EINVAL;
|
||||
|
||||
case 0x9d: { /* ISSI -- Integrated Silicon Solution, Inc. */
|
||||
/**
|
||||
* This Density -> Size decoding table is taken from ISSI
|
||||
* Data Sheets.
|
||||
*/
|
||||
density = (flashid >> 16) & 0xff;
|
||||
switch (density) {
|
||||
case 0x16:
|
||||
size = 1 << 25; /* 32MB */
|
||||
break;
|
||||
case 0x17:
|
||||
size = 1 << 26; /* 64MB */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xc2: { /* Macronix */
|
||||
/**
|
||||
* This Density -> Size decoding table is taken from Macronix
|
||||
* Data Sheets.
|
||||
*/
|
||||
density = (flashid >> 16) & 0xff;
|
||||
switch (density) {
|
||||
case 0x17:
|
||||
size = 1 << 23; /* 8MB */
|
||||
break;
|
||||
case 0x18:
|
||||
size = 1 << 24; /* 16MB */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xef: { /* Winbond */
|
||||
/**
|
||||
* This Density -> Size decoding table is taken from Winbond
|
||||
* Data Sheets.
|
||||
*/
|
||||
density = (flashid >> 16) & 0xff;
|
||||
switch (density) {
|
||||
case 0x17:
|
||||
size = 1 << 23; /* 8MB */
|
||||
break;
|
||||
case 0x18:
|
||||
size = 1 << 24; /* 16MB */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we didn't recognize the FLASH part, that's no real issue: the
|
||||
* Hardware/Software contract says that Hardware will _*ALWAYS*_
|
||||
* use a FLASH part which is at least 4MB in size and has 64KB
|
||||
* sectors. The unrecognized FLASH part is likely to be much larger
|
||||
* than 4MB, but that's all we really need.
|
||||
*/
|
||||
if (size == 0) {
|
||||
dev_warn(adapter,
|
||||
"Unknown Flash Part, ID = %#x, assuming 4MB\n",
|
||||
flashid);
|
||||
size = 1 << 22;
|
||||
}
|
||||
|
||||
/**
|
||||
* Store decoded Flash size and fall through into vetting code.
|
||||
*/
|
||||
adapter->params.sf_size = size;
|
||||
adapter->params.sf_nsec = size / SF_SEC_SIZE;
|
||||
|
||||
found:
|
||||
/*
|
||||
* We should reject adapters with FLASHes which are too small. So, emit
|
||||
|
Loading…
x
Reference in New Issue
Block a user