@@ -4559,7 +4559,7 @@ bnxt_mod_eeprom_by_page_precheck(struct bnxt *bp,
45594559
45604560 if (BNXT_VF (bp ) && !BNXT_VF_IS_TRUSTED (bp )) {
45614561 NL_SET_ERR_MSG_MOD (extack ,
4562- "Module read not permitted on untrusted VF" );
4562+ "Module read/write not permitted on untrusted VF" );
45634563 return - EPERM ;
45644564 }
45654565
@@ -4602,6 +4602,62 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev,
46024602 return page_data -> length ;
46034603}
46044604
4605+ static int bnxt_write_sfp_module_eeprom_info (struct bnxt * bp ,
4606+ const struct ethtool_module_eeprom * page )
4607+ {
4608+ struct hwrm_port_phy_i2c_write_input * req ;
4609+ int bytes_written = 0 ;
4610+ int rc ;
4611+
4612+ rc = hwrm_req_init (bp , req , HWRM_PORT_PHY_I2C_WRITE );
4613+ if (rc )
4614+ return rc ;
4615+
4616+ hwrm_req_hold (bp , req );
4617+ req -> i2c_slave_addr = page -> i2c_address << 1 ;
4618+ req -> page_number = cpu_to_le16 (page -> page );
4619+ req -> bank_number = page -> bank ;
4620+ req -> port_id = cpu_to_le16 (bp -> pf .port_id );
4621+ req -> enables = cpu_to_le32 (PORT_PHY_I2C_WRITE_REQ_ENABLES_PAGE_OFFSET |
4622+ PORT_PHY_I2C_WRITE_REQ_ENABLES_BANK_NUMBER );
4623+
4624+ while (bytes_written < page -> length ) {
4625+ u16 xfer_size ;
4626+
4627+ xfer_size = min_t (u16 , page -> length - bytes_written ,
4628+ BNXT_MAX_PHY_I2C_RESP_SIZE );
4629+ req -> page_offset = cpu_to_le16 (page -> offset + bytes_written );
4630+ req -> data_length = xfer_size ;
4631+ memcpy (req -> data , page -> data + bytes_written , xfer_size );
4632+ rc = hwrm_req_send (bp , req );
4633+ if (rc )
4634+ break ;
4635+ bytes_written += xfer_size ;
4636+ }
4637+
4638+ hwrm_req_drop (bp , req );
4639+ return rc ;
4640+ }
4641+
4642+ static int bnxt_set_module_eeprom_by_page (struct net_device * dev ,
4643+ const struct ethtool_module_eeprom * page_data ,
4644+ struct netlink_ext_ack * extack )
4645+ {
4646+ struct bnxt * bp = netdev_priv (dev );
4647+ int rc ;
4648+
4649+ rc = bnxt_mod_eeprom_by_page_precheck (bp , page_data , extack );
4650+ if (rc )
4651+ return rc ;
4652+
4653+ rc = bnxt_write_sfp_module_eeprom_info (bp , page_data );
4654+ if (rc ) {
4655+ NL_SET_ERR_MSG_MOD (extack , "Module`s eeprom write failed" );
4656+ return rc ;
4657+ }
4658+ return page_data -> length ;
4659+ }
4660+
46054661static int bnxt_nway_reset (struct net_device * dev )
46064662{
46074663 int rc = 0 ;
@@ -5464,6 +5520,7 @@ const struct ethtool_ops bnxt_ethtool_ops = {
54645520 .get_module_info = bnxt_get_module_info ,
54655521 .get_module_eeprom = bnxt_get_module_eeprom ,
54665522 .get_module_eeprom_by_page = bnxt_get_module_eeprom_by_page ,
5523+ .set_module_eeprom_by_page = bnxt_set_module_eeprom_by_page ,
54675524 .nway_reset = bnxt_nway_reset ,
54685525 .set_phys_id = bnxt_set_phys_id ,
54695526 .self_test = bnxt_self_test ,
0 commit comments