return 0;
 }
 
+static int sfp_cotsworks_fixup_check(struct sfp *sfp, struct sfp_eeprom_id *id)
+{
+       u8 check;
+       int err;
+
+       if (id->base.phys_id != SFF8024_ID_SFF_8472 ||
+           id->base.phys_ext_id != SFP_PHYS_EXT_ID_SFP ||
+           id->base.connector != SFF8024_CONNECTOR_LC) {
+               dev_warn(sfp->dev, "Rewriting fiber module EEPROM with corrected values\n");
+               id->base.phys_id = SFF8024_ID_SFF_8472;
+               id->base.phys_ext_id = SFP_PHYS_EXT_ID_SFP;
+               id->base.connector = SFF8024_CONNECTOR_LC;
+               err = sfp_write(sfp, false, SFP_PHYS_ID, &id->base, 3);
+               if (err != 3) {
+                       dev_err(sfp->dev, "Failed to rewrite module EEPROM: %d\n", err);
+                       return err;
+               }
+
+               /* Cotsworks modules have been found to require a delay between write operations. */
+               mdelay(50);
+
+               /* Update base structure checksum */
+               check = sfp_check(&id->base, sizeof(id->base) - 1);
+               err = sfp_write(sfp, false, SFP_CC_BASE, &check, 1);
+               if (err != 1) {
+                       dev_err(sfp->dev, "Failed to update base structure checksum in fiber module EEPROM: %d\n", err);
+                       return err;
+               }
+       }
+       return 0;
+}
+
 static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
 {
        /* SFP module inserted - read I2C data */
        struct sfp_eeprom_id id;
+       bool cotsworks_sfbg;
        bool cotsworks;
        u8 check;
        int ret;
         * serial number and date code.
         */
        cotsworks = !memcmp(id.base.vendor_name, "COTSWORKS       ", 16);
+       cotsworks_sfbg = !memcmp(id.base.vendor_pn, "SFBG", 4);
+
+       /* Cotsworks SFF module EEPROM do not always have valid phys_id,
+        * phys_ext_id, and connector bytes.  Rewrite SFF EEPROM bytes if
+        * Cotsworks PN matches and bytes are not correct.
+        */
+       if (cotsworks && cotsworks_sfbg) {
+               ret = sfp_cotsworks_fixup_check(sfp, &id);
+               if (ret < 0)
+                       return ret;
+       }
 
        /* Validate the checksum over the base structure */
        check = sfp_check(&id.base, sizeof(id.base) - 1);