|
@@ -560,6 +560,7 @@ static int sfp_sm_mod_probe(struct sfp *sfp)
|
|
|
{
|
|
|
/* SFP module inserted - read I2C data */
|
|
|
struct sfp_eeprom_id id;
|
|
|
+ bool cotsworks;
|
|
|
u8 check;
|
|
|
int ret;
|
|
|
|
|
@@ -574,23 +575,43 @@ static int sfp_sm_mod_probe(struct sfp *sfp)
|
|
|
return -EAGAIN;
|
|
|
}
|
|
|
|
|
|
+ /* Cotsworks do not seem to update the checksums when they
|
|
|
+ * do the final programming with the final module part number,
|
|
|
+ * serial number and date code.
|
|
|
+ */
|
|
|
+ cotsworks = !memcmp(id.base.vendor_name, "COTSWORKS ", 16);
|
|
|
+
|
|
|
/* Validate the checksum over the base structure */
|
|
|
check = sfp_check(&id.base, sizeof(id.base) - 1);
|
|
|
if (check != id.base.cc_base) {
|
|
|
- dev_err(sfp->dev,
|
|
|
- "EEPROM base structure checksum failure: 0x%02x\n",
|
|
|
- check);
|
|
|
- print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET,
|
|
|
- 16, 1, &id, sizeof(id.base) - 1, true);
|
|
|
- return -EINVAL;
|
|
|
+ if (cotsworks) {
|
|
|
+ dev_warn(sfp->dev,
|
|
|
+ "EEPROM base structure checksum failure (0x%02x != 0x%02x)\n",
|
|
|
+ check, id.base.cc_base);
|
|
|
+ } else {
|
|
|
+ dev_err(sfp->dev,
|
|
|
+ "EEPROM base structure checksum failure: 0x%02x != 0x%02x\n",
|
|
|
+ check, id.base.cc_base);
|
|
|
+ print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET,
|
|
|
+ 16, 1, &id, sizeof(id), true);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
check = sfp_check(&id.ext, sizeof(id.ext) - 1);
|
|
|
if (check != id.ext.cc_ext) {
|
|
|
- dev_err(sfp->dev,
|
|
|
- "EEPROM extended structure checksum failure: 0x%02x\n",
|
|
|
- check);
|
|
|
- memset(&id.ext, 0, sizeof(id.ext));
|
|
|
+ if (cotsworks) {
|
|
|
+ dev_warn(sfp->dev,
|
|
|
+ "EEPROM extended structure checksum failure (0x%02x != 0x%02x)\n",
|
|
|
+ check, id.ext.cc_ext);
|
|
|
+ } else {
|
|
|
+ dev_err(sfp->dev,
|
|
|
+ "EEPROM extended structure checksum failure: 0x%02x != 0x%02x\n",
|
|
|
+ check, id.ext.cc_ext);
|
|
|
+ print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET,
|
|
|
+ 16, 1, &id, sizeof(id), true);
|
|
|
+ memset(&id.ext, 0, sizeof(id.ext));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
sfp->id = id;
|