enum cc_pause  requested_fc;     /* flow control user has requested */
        enum cc_pause  fc;               /* actual link flow control */
+       enum cc_pause  advertised_fc;    /* actual advertised flow control */
 
        enum cc_fec    requested_fec;    /* Forward Error Correction: */
        enum cc_fec    fec;              /* requested and actual in use */
 
        struct port_info *p = netdev_priv(dev);
 
        epause->autoneg = (p->link_cfg.requested_fc & PAUSE_AUTONEG) != 0;
-       epause->rx_pause = (p->link_cfg.fc & PAUSE_RX) != 0;
-       epause->tx_pause = (p->link_cfg.fc & PAUSE_TX) != 0;
+       epause->rx_pause = (p->link_cfg.advertised_fc & PAUSE_RX) != 0;
+       epause->tx_pause = (p->link_cfg.advertised_fc & PAUSE_TX) != 0;
 }
 
 static int set_pauseparam(struct net_device *dev,
 
                if (cc_pause & PAUSE_TX)
                        fw_pause |= FW_PORT_CAP32_802_3_PAUSE;
                else
-                       fw_pause |= FW_PORT_CAP32_802_3_ASM_DIR;
+                       fw_pause |= FW_PORT_CAP32_802_3_ASM_DIR |
+                                   FW_PORT_CAP32_802_3_PAUSE;
        } else if (cc_pause & PAUSE_TX) {
                fw_pause |= FW_PORT_CAP32_802_3_ASM_DIR;
        }
 void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl)
 {
        const struct fw_port_cmd *cmd = (const void *)rpl;
-       int action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
-       struct adapter *adapter = pi->adapter;
+       fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
        struct link_config *lc = &pi->link_cfg;
-       int link_ok, linkdnrc;
-       enum fw_port_type port_type;
+       struct adapter *adapter = pi->adapter;
+       unsigned int speed, fc, fec, adv_fc;
        enum fw_port_module_type mod_type;
-       unsigned int speed, fc, fec;
-       fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
+       int action, link_ok, linkdnrc;
+       enum fw_port_type port_type;
 
        /* Extract the various fields from the Port Information message.
         */
+       action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
        switch (action) {
        case FW_PORT_ACTION_GET_PORT_INFO: {
                u32 lstatus = be32_to_cpu(cmd->u.info.lstatus_to_modtype);
        }
 
        fec = fwcap_to_cc_fec(acaps);
+       adv_fc = fwcap_to_cc_pause(acaps);
        fc = fwcap_to_cc_pause(linkattr);
        speed = fwcap_to_speed(linkattr);
 
        }
 
        if (link_ok != lc->link_ok || speed != lc->speed ||
-           fc != lc->fc || fec != lc->fec) {   /* something changed */
+           fc != lc->fc || adv_fc != lc->advertised_fc ||
+           fec != lc->fec) {
+               /* something changed */
                if (!link_ok && lc->link_ok) {
                        lc->link_down_rc = linkdnrc;
                        dev_warn_ratelimited(adapter->pdev_dev,
                }
                lc->link_ok = link_ok;
                lc->speed = speed;
+               lc->advertised_fc = adv_fc;
                lc->fc = fc;
                lc->fec = fec;
 
 
        struct port_info *pi = netdev_priv(dev);
 
        pauseparam->autoneg = (pi->link_cfg.requested_fc & PAUSE_AUTONEG) != 0;
-       pauseparam->rx_pause = (pi->link_cfg.fc & PAUSE_RX) != 0;
-       pauseparam->tx_pause = (pi->link_cfg.fc & PAUSE_TX) != 0;
+       pauseparam->rx_pause = (pi->link_cfg.advertised_fc & PAUSE_RX) != 0;
+       pauseparam->tx_pause = (pi->link_cfg.advertised_fc & PAUSE_TX) != 0;
 }
 
 /*
 
 
        enum cc_pause   requested_fc;   /* flow control user has requested */
        enum cc_pause   fc;             /* actual link flow control */
+       enum cc_pause   advertised_fc;  /* actual advertised flow control */
 
        enum cc_fec     auto_fec;       /* Forward Error Correction: */
        enum cc_fec     requested_fec;  /*   "automatic" (IEEE 802.3), */
 
 static void t4vf_handle_get_port_info(struct port_info *pi,
                                      const struct fw_port_cmd *cmd)
 {
-       int action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
-       struct adapter *adapter = pi->adapter;
+       fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
        struct link_config *lc = &pi->link_cfg;
-       int link_ok, linkdnrc;
-       enum fw_port_type port_type;
+       struct adapter *adapter = pi->adapter;
+       unsigned int speed, fc, fec, adv_fc;
        enum fw_port_module_type mod_type;
-       unsigned int speed, fc, fec;
-       fw_port_cap32_t pcaps, acaps, lpacaps, linkattr;
+       int action, link_ok, linkdnrc;
+       enum fw_port_type port_type;
 
        /* Extract the various fields from the Port Information message. */
+       action = FW_PORT_CMD_ACTION_G(be32_to_cpu(cmd->action_to_len16));
        switch (action) {
        case FW_PORT_ACTION_GET_PORT_INFO: {
                u32 lstatus = be32_to_cpu(cmd->u.info.lstatus_to_modtype);
        }
 
        fec = fwcap_to_cc_fec(acaps);
+       adv_fc = fwcap_to_cc_pause(acaps);
        fc = fwcap_to_cc_pause(linkattr);
        speed = fwcap_to_speed(linkattr);
 
        }
 
        if (link_ok != lc->link_ok || speed != lc->speed ||
-           fc != lc->fc || fec != lc->fec) {   /* something changed */
+           fc != lc->fc || adv_fc != lc->advertised_fc ||
+           fec != lc->fec) {
+               /* something changed */
                if (!link_ok && lc->link_ok) {
                        lc->link_down_rc = linkdnrc;
                        dev_warn_ratelimited(adapter->pdev_dev,
                }
                lc->link_ok = link_ok;
                lc->speed = speed;
+               lc->advertised_fc = adv_fc;
                lc->fc = fc;
                lc->fec = fec;