AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl);
        rxcp->pkt_type =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
 -      rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm, compl);
 -      rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
 -                                      compl);
 +      rxcp->rss_hash =
 +              AMAP_GET_BITS(struct amap_eth_rx_compl_v1, rsshash, rxcp);
 +      if (rxcp->vlanf) {
 +              rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm,
-                               compl);
-               rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
-                               compl);
++                                        compl);
++              rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
++                                             compl);
 +      }
  }
  
  static void be_parse_rx_compl_v0(struct be_adapter *adapter,
                AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl);
        rxcp->pkt_type =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
 -      rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm, compl);
 -      rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
 -                                      compl);
 +      rxcp->rss_hash =
 +              AMAP_GET_BITS(struct amap_eth_rx_compl_v0, rsshash, rxcp);
 +      if (rxcp->vlanf) {
 +              rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm,
-                               compl);
-               rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
-                               compl);
++                                        compl);
++              rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
++                                             compl);
 +      }
  }
  
  static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
        else
                be_parse_rx_compl_v0(adapter, compl, rxcp);
  
 -      /* vlanf could be wrongly set in some cards. ignore if vtm is not set */
 -      if ((adapter->function_mode & 0x400) && !rxcp->vtm)
 -              rxcp->vlanf = 0;
 +      if (rxcp->vlanf) {
 +              /* vlanf could be wrongly set in some cards.
 +               * ignore if vtm is not set */
 +              if ((adapter->function_mode & 0x400) && !rxcp->vtm)
 +                      rxcp->vlanf = 0;
  
 -      if (!lancer_chip(adapter))
 -              rxcp->vlan_tag = swab16(rxcp->vlan_tag);
 +              if (!lancer_chip(adapter))
-                       rxcp->vid = swab16(rxcp->vid);
++                      rxcp->vlan_tag = swab16(rxcp->vlan_tag);
  
-               if ((adapter->pvid == rxcp->vid) &&
-                       !adapter->vlan_tag[rxcp->vid])
 -      if (((adapter->pvid & VLAN_VID_MASK) ==
 -              (rxcp->vlan_tag & VLAN_VID_MASK)) &&
 -              !adapter->vlan_tag[rxcp->vlan_tag])
 -              rxcp->vlanf = 0;
++              if (((adapter->pvid & VLAN_VID_MASK) ==
++                   (rxcp->vlan_tag & VLAN_VID_MASK)) &&
++                  !adapter->vlan_tag[rxcp->vlan_tag])
 +                      rxcp->vlanf = 0;
 +      }
  
        /* As the compl has been parsed, reset it; we wont touch it again */
        compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] = 0;
 
                cmd->duplex = port->full_duplex == 1 ?
                                                     DUPLEX_FULL : DUPLEX_HALF;
        } else {
 -              cmd->speed = -1;
 +              speed = ~0;
                cmd->duplex = -1;
        }
 +      ethtool_cmd_speed_set(cmd, speed);
  
-       cmd->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_1000baseT_Full
-                      | SUPPORTED_100baseT_Full |  SUPPORTED_100baseT_Half
-                      | SUPPORTED_10baseT_Full | SUPPORTED_10baseT_Half
-                      | SUPPORTED_Autoneg | SUPPORTED_FIBRE);
- 
-       cmd->advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_Autoneg
-                        | ADVERTISED_FIBRE);
+       if (cmd->speed == SPEED_10000) {
+               cmd->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
+               cmd->advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_FIBRE);
+               cmd->port = PORT_FIBRE;
+       } else {
+               cmd->supported = (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full
+                              | SUPPORTED_100baseT_Half | SUPPORTED_10baseT_Full
+                              | SUPPORTED_10baseT_Half | SUPPORTED_Autoneg
+                              | SUPPORTED_TP);
+               cmd->advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg
+                                | ADVERTISED_TP);
+               cmd->port = PORT_TP;
+       }
  
-       cmd->port = PORT_FIBRE;
        cmd->autoneg = port->autoneg == 1 ? AUTONEG_ENABLE : AUTONEG_DISABLE;
  
        return 0;