Apply vendor fixes for big endian support and 20GBps/25GBps link speeds.

Many thanks to Emulex for their continued support of FreeBSD!

Submitted by:	Venkata Duvvuru <VenkatKumar.Duvvuru Emulex.Com>
MFC after:	3 days
This commit is contained in:
Xin LI 2014-06-24 20:11:22 +00:00
parent 02190a5647
commit a4f734b4fc
5 changed files with 55 additions and 26 deletions

View File

@ -487,11 +487,7 @@ oce_hw_start(POCE_SOFTC sc)
if_link_state_change(sc->ifp, LINK_STATE_DOWN);
}
if (link.mac_speed > 0 && link.mac_speed < 5)
sc->link_speed = link.mac_speed;
else
sc->link_speed = 0;
sc->link_speed = link.phys_port_speed;
sc->qos_link_speed = (uint32_t )link.qos_link_speed * 10;
rc = oce_start_mq(sc->mq);

View File

@ -1023,7 +1023,7 @@ struct mbx_hdr {
#define OCE_MBX_ADDL_STATUS(_MHDR) ((_MHDR)->u0.rsp.additional_status)
#define OCE_MBX_STATUS(_MHDR) ((_MHDR)->u0.rsp.status)
/* [05] OPCODE_COMMON_QUERY_LINK_CONFIG */
/* [05] OPCODE_COMMON_QUERY_LINK_CONFIG_V1 */
struct mbx_query_common_link_config {
struct mbx_hdr hdr;
union {
@ -1032,16 +1032,37 @@ struct mbx_query_common_link_config {
} req;
struct {
/* dw 0 */
uint8_t physical_port;
uint8_t mac_duplex;
uint8_t mac_speed;
uint8_t mac_fault;
/* dw 1 */
uint8_t mgmt_mac_duplex;
uint8_t mgmt_mac_speed;
#ifdef _BIG_ENDIAN
uint32_t physical_port_fault:8;
uint32_t physical_port_speed:8;
uint32_t link_duplex:8;
uint32_t pt:2;
uint32_t port_number:6;
uint16_t qos_link_speed;
uint32_t logical_link_status;
uint16_t rsvd0;
uint32_t rsvd1:21;
uint32_t phys_fcv:1;
uint32_t phys_rxf:1;
uint32_t phys_txf:1;
uint32_t logical_link_status:8;
#else
uint32_t port_number:6;
uint32_t pt:2;
uint32_t link_duplex:8;
uint32_t physical_port_speed:8;
uint32_t physical_port_fault:8;
uint16_t rsvd0;
uint16_t qos_link_speed;
uint32_t logical_link_status:8;
uint32_t phys_txf:1;
uint32_t phys_rxf:1;
uint32_t phys_fcv:1;
uint32_t rsvd1:21;
#endif
} rsp;
} params;
};

View File

@ -829,10 +829,21 @@ oce_media_status(struct ifnet *ifp, struct ifmediareq *req)
req->ifm_active |= IFM_10G_SR | IFM_FDX;
sc->speed = 10000;
break;
case 5: /* 20 Gbps */
req->ifm_active |= IFM_10G_SR | IFM_FDX;
sc->speed = 20000;
break;
case 6: /* 25 Gbps */
req->ifm_active |= IFM_10G_SR | IFM_FDX;
sc->speed = 25000;
break;
case 7: /* 40 Gbps */
req->ifm_active |= IFM_40G_SR4 | IFM_FDX;
sc->speed = 40000;
break;
default:
sc->speed = 0;
break;
}
return;
@ -2217,13 +2228,16 @@ setup_max_queues_want(POCE_SOFTC sc)
(sc->function_mode & FNM_UMC_MODE) ||
(sc->function_mode & FNM_VNIC_MODE) ||
(!is_rss_enabled(sc)) ||
(sc->flags & OCE_FLAGS_BE2)) {
IS_BE2(sc)) {
sc->nrqs = 1;
sc->nwqs = 1;
} else {
sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs);
}
if (IS_BE2(sc) && is_rss_enabled(sc))
sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
}
@ -2237,6 +2251,9 @@ update_queues_got(POCE_SOFTC sc)
sc->nrqs = 1;
sc->nwqs = 1;
}
if (IS_BE2(sc))
sc->nwqs = 1;
}
static int

View File

@ -761,14 +761,9 @@ struct oce_rq {
};
struct link_status {
uint8_t physical_port;
uint8_t mac_duplex;
uint8_t mac_speed;
uint8_t mac_fault;
uint8_t mgmt_mac_duplex;
uint8_t mgmt_mac_speed;
uint8_t phys_port_speed;
uint8_t logical_link_status;
uint16_t qos_link_speed;
uint32_t logical_link_status;
};

View File

@ -961,9 +961,9 @@ oce_get_link_status(POCE_SOFTC sc, struct link_status *link)
goto error;
}
/* interpret response */
bcopy(&fwcmd->params.rsp, link, sizeof(struct link_status));
link->logical_link_status = HOST_32(link->logical_link_status);
link->qos_link_speed = HOST_16(link->qos_link_speed);
link->qos_link_speed = HOST_16(fwcmd->params.rsp.qos_link_speed);
link->phys_port_speed = fwcmd->params.rsp.physical_port_speed;
link->logical_link_status = fwcmd->params.rsp.logical_link_status;
error:
return rc;
}