MLXSW_REG_DEFINE(ptys, MLXSW_REG_PTYS_ID, MLXSW_REG_PTYS_LEN);
 
+/* an_disable_admin
+ * Auto negotiation disable administrative configuration
+ * 0 - Device doesn't support AN disable.
+ * 1 - Device supports AN disable.
+ * Access: RW
+ */
+MLXSW_ITEM32(reg, ptys, an_disable_admin, 0x00, 30, 1);
+
 /* reg_ptys_local_port
  * Local port number.
  * Access: Index
 MLXSW_ITEM32(reg, ptys, eth_proto_lp_advertise, 0x30, 0, 32);
 
 static inline void mlxsw_reg_ptys_eth_pack(char *payload, u8 local_port,
-                                          u32 proto_admin)
+                                          u32 proto_admin, bool autoneg)
 {
        MLXSW_REG_ZERO(ptys, payload);
        mlxsw_reg_ptys_local_port_set(payload, local_port);
        mlxsw_reg_ptys_proto_mask_set(payload, MLXSW_REG_PTYS_PROTO_MASK_ETH);
        mlxsw_reg_ptys_eth_proto_admin_set(payload, proto_admin);
+       mlxsw_reg_ptys_an_disable_admin_set(payload, !autoneg);
 }
 
 static inline void mlxsw_reg_ptys_eth_unpack(char *payload,
 
        int err;
 
        autoneg = mlxsw_sp_port->link.autoneg;
-       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0);
+       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0, false);
        err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
        if (err)
                return err;
        bool autoneg;
        int err;
 
-       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0);
+       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0, false);
        err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
        if (err)
                return err;
        }
 
        mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port,
-                               eth_proto_new);
+                               eth_proto_new, autoneg);
        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
        if (err)
                return err;
 
        eth_proto_admin = mlxsw_sp_to_ptys_upper_speed(upper_speed);
        mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port,
-                               eth_proto_admin);
+                               eth_proto_admin, mlxsw_sp_port->link.autoneg);
        return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
 }
 
 
        u32 supported, advertising, lp_advertising;
        int err;
 
-       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port, 0);
+       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port, 0, false);
        err = mlxsw_reg_query(mlxsw_sx->core, MLXSW_REG(ptys), ptys_pl);
        if (err) {
                netdev_err(dev, "Failed to get proto");
                mlxsw_sx_to_ptys_advert_link(advertising) :
                mlxsw_sx_to_ptys_speed(speed);
 
-       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port, 0);
+       mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port, 0, false);
        err = mlxsw_reg_query(mlxsw_sx->core, MLXSW_REG(ptys), ptys_pl);
        if (err) {
                netdev_err(dev, "Failed to get proto");
                return 0;
 
        mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port,
-                               eth_proto_new);
+                               eth_proto_new, true);
        err = mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(ptys), ptys_pl);
        if (err) {
                netdev_err(dev, "Failed to set proto admin");
 
        eth_proto_admin = mlxsw_sx_to_ptys_upper_speed(upper_speed);
        mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port,
-                               eth_proto_admin);
+                               eth_proto_admin, true);
        return mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(ptys), ptys_pl);
 }