* stadard address handle by decoding the tunnelled mlx4_ah fields */
        memcpy(&ah.av, &tunnel->hdr.av, sizeof (struct mlx4_av));
        ah.ibah.device = ctx->ib_dev;
+
+       port = be32_to_cpu(ah.av.ib.port_pd) >> 24;
+       port = mlx4_slave_convert_port(dev->dev, slave, port);
+       if (port < 0)
+               return;
+       ah.av.ib.port_pd = cpu_to_be32(port << 24 | (be32_to_cpu(ah.av.ib.port_pd) & 0xffffff));
+
        mlx4_ib_query_ah(&ah.ibah, &ah_attr);
        if (ah_attr.ah_flags & IB_AH_GRH)
                fill_in_real_sgid_index(dev, slave, ctx->port, &ah_attr);
 
-       port = mlx4_slave_convert_port(dev->dev, slave, ah_attr.port_num);
-       if (port < 0)
-               return;
-       ah_attr.port_num = port;
        memcpy(ah_attr.dmac, tunnel->hdr.mac, 6);
        ah_attr.vlan_id = be16_to_cpu(tunnel->hdr.vlan);
        /* if slave have default vlan use it */