Author: np
Date: Tue Apr 30 05:51:52 2013
New Revision: 250092
URL: http://svnweb.freebsd.org/changeset/base/250092

Log:
  - Provide accurate ifmedia information so that 40G ports/transceivers are
    displayed properly in ifconfig, etc.
  
  - Use the same number of tx and rx queues for a 40G port as for a 10G port.
  
  MFC after:    1 week

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Tue Apr 30 05:39:42 2013        
(r250091)
+++ head/sys/dev/cxgbe/adapter.h        Tue Apr 30 05:51:52 2013        
(r250092)
@@ -757,6 +757,13 @@ is_10G_port(const struct port_info *pi)
        return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G) != 0);
 }
 
+static inline bool
+is_40G_port(const struct port_info *pi)
+{
+
+       return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G) != 0);
+}
+
 static inline int
 tx_resume_threshold(struct sge_eq *eq)
 {

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Tue Apr 30 05:39:42 2013        
(r250091)
+++ head/sys/dev/cxgbe/t4_main.c        Tue Apr 30 05:51:52 2013        
(r250092)
@@ -666,7 +666,7 @@ t4_attach(device_t dev)
                    device_get_nameunit(dev), i);
                mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
 
-               if (is_10G_port(pi)) {
+               if (is_10G_port(pi) || is_40G_port(pi)) {
                        n10g++;
                        pi->tmr_idx = t4_tmr_idx_10g;
                        pi->pktc_idx = t4_pktc_idx_10g;
@@ -756,7 +756,7 @@ t4_attach(device_t dev)
 
                pi->first_rxq = rqidx;
                pi->first_txq = tqidx;
-               if (is_10G_port(pi)) {
+               if (is_10G_port(pi) || is_40G_port(pi)) {
                        pi->nrxq = iaq.nrxq10g;
                        pi->ntxq = iaq.ntxq10g;
                } else {
@@ -771,7 +771,7 @@ t4_attach(device_t dev)
                if (is_offload(sc)) {
                        pi->first_ofld_rxq = ofld_rqidx;
                        pi->first_ofld_txq = ofld_tqidx;
-                       if (is_10G_port(pi)) {
+                       if (is_10G_port(pi) || is_40G_port(pi)) {
                                pi->nofldrxq = iaq.nofldrxq10g;
                                pi->nofldtxq = iaq.nofldtxq10g;
                        } else {
@@ -2595,16 +2595,47 @@ build_medialist(struct port_info *pi)
                case FW_PORT_MOD_TYPE_NA:
                case FW_PORT_MOD_TYPE_ER:
                default:
+                       device_printf(pi->dev,
+                           "unknown port_type (%d), mod_type (%d)\n",
+                           pi->port_type, pi->mod_type);
+                       ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
+                       ifmedia_set(media, m | IFM_UNKNOWN);
+                       break;
+               }
+               break;
+
+       case FW_PORT_TYPE_QSFP:
+               switch (pi->mod_type) {
+
+               case FW_PORT_MOD_TYPE_LR:
+                       ifmedia_add(media, m | IFM_40G_LR4, data, NULL);
+                       ifmedia_set(media, m | IFM_40G_LR4);
+                       break;
+
+               case FW_PORT_MOD_TYPE_SR:
+                       ifmedia_add(media, m | IFM_40G_SR4, data, NULL);
+                       ifmedia_set(media, m | IFM_40G_SR4);
+                       break;
+               case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
+               case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
+                       ifmedia_add(media, m | IFM_40G_CR4, data, NULL);
+                       ifmedia_set(media, m | IFM_40G_CR4);
+                       break;
+
+               default:
+                       device_printf(pi->dev,
+                           "unknown port_type (%d), mod_type (%d)\n",
+                           pi->port_type, pi->mod_type);
                        ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
                        ifmedia_set(media, m | IFM_UNKNOWN);
                        break;
                }
                break;
 
-       case FW_PORT_TYPE_KX4:
-       case FW_PORT_TYPE_KX:
-       case FW_PORT_TYPE_KR:
        default:
+               device_printf(pi->dev,
+                   "unknown port_type (%d), mod_type (%d)\n", pi->port_type,
+                   pi->mod_type);
                ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
                ifmedia_set(media, m | IFM_UNKNOWN);
                break;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to