usr/src/uts/intel/io/vmxnet3s/vmxnet3_main.c
changeset 14277 711401aaa206
parent 13976 814bae19b8a2
equal deleted inserted replaced
14276:7b173d1a28b7 14277:711401aaa206
    12  * See the License for the specific language governing permissions
    12  * See the License for the specific language governing permissions
    13  * and limitations under the License.
    13  * and limitations under the License.
    14  *
    14  *
    15  *********************************************************/
    15  *********************************************************/
    16 /*
    16 /*
    17  * Copyright (c) 2012 by Delphix. All rights reserved.
    17  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
    18  */
    18  */
    19 
    19 
    20 #include <vmxnet3_solaris.h>
    20 #include <vmxnet3_solaris.h>
    21 
    21 
    22 /*
    22 /*
   177          break;
   177          break;
   178       case MAC_STAT_COLLISIONS:
   178       case MAC_STAT_COLLISIONS:
   179          *val = 0;
   179          *val = 0;
   180          break;
   180          break;
   181       case MAC_STAT_RBYTES:
   181       case MAC_STAT_RBYTES:
   182          *val = rxStats->LROBytesRxOK +
   182          *val = rxStats->ucastBytesRxOK +
   183                 rxStats->ucastBytesRxOK +
       
   184                 rxStats->mcastBytesRxOK +
   183                 rxStats->mcastBytesRxOK +
   185                 rxStats->bcastBytesRxOK;
   184                 rxStats->bcastBytesRxOK;
   186          break;
   185          break;
   187       case MAC_STAT_IPACKETS:
   186       case MAC_STAT_IPACKETS:
   188          *val = rxStats->LROPktsRxOK +
   187          *val = rxStats->ucastPktsRxOK +
   189                 rxStats->ucastPktsRxOK +
       
   190                 rxStats->mcastPktsRxOK +
   188                 rxStats->mcastPktsRxOK +
   191                 rxStats->bcastPktsRxOK;
   189                 rxStats->bcastPktsRxOK;
   192          break;
   190          break;
   193       case MAC_STAT_OBYTES:
   191       case MAC_STAT_OBYTES:
   194          *val = txStats->TSOBytesTxOK +
   192          *val = txStats->ucastBytesTxOK +
   195                 txStats->ucastBytesTxOK +
       
   196                 txStats->mcastBytesTxOK +
   193                 txStats->mcastBytesTxOK +
   197                 txStats->bcastBytesTxOK;
   194                 txStats->bcastBytesTxOK;
   198          break;
   195          break;
   199       case MAC_STAT_OPACKETS:
   196       case MAC_STAT_OPACKETS:
   200          *val = txStats->TSOPktsTxOK +
   197          *val = txStats->ucastPktsTxOK +
   201                 txStats->ucastPktsTxOK +
       
   202                 txStats->mcastPktsTxOK +
   198                 txStats->mcastPktsTxOK +
   203                 txStats->bcastPktsTxOK;
   199                 txStats->bcastPktsTxOK;
   204          break;
   200          break;
   205       case ETHER_STAT_LINK_DUPLEX:
   201       case ETHER_STAT_LINK_DUPLEX:
   206          *val = LINK_DUPLEX_FULL;
   202          *val = LINK_DUPLEX_FULL;
   957 /*
   953 /*
   958  *---------------------------------------------------------------------------
   954  *---------------------------------------------------------------------------
   959  *
   955  *
   960  * vmxnet3_change_mtu --
   956  * vmxnet3_change_mtu --
   961  *
   957  *
   962  *    Change the MTU as seen by the driver. Reset the device and tx/rx queues
   958  *    Change the MTU as seen by the driver. This is only supported when
   963  *    so that buffers of right size are posted in rx queues.
   959  *    the mac is stopped.
   964  *
   960  *
   965  * Results:
   961  * Results:
   966  *    EINVAL for invalid MTUs or other failures. 0 for success.
   962  *    EBUSY if the device is enabled.
       
   963  *    EINVAL for invalid MTU values.
       
   964  *    0 on success.
   967  *
   965  *
   968  * Side effects:
   966  * Side effects:
   969  *    None.
   967  *    None.
   970  *
   968  *
   971  *---------------------------------------------------------------------------
   969  *---------------------------------------------------------------------------
   972  */
   970  */
   973 
   971 
   974 static int
   972 static int
   975 vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu)
   973 vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu)
   976 {
   974 {
   977    int ret = 0, do_reset = 0, macret;
   975    int ret;
   978    ASSERT(dp);
   976 
       
   977    if (dp->devEnabled)
       
   978       return EBUSY;
       
   979 
   979    if (new_mtu == dp->cur_mtu) {
   980    if (new_mtu == dp->cur_mtu) {
   980       VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu);
   981       VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu);
   981       return 0;
   982       return 0;
   982    }
   983    }
   983 
   984 
   985       VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n",
   986       VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n",
   986                    VMXNET3_MIN_MTU, VMXNET3_MAX_MTU);
   987                    VMXNET3_MIN_MTU, VMXNET3_MAX_MTU);
   987       return EINVAL;
   988       return EINVAL;
   988    }
   989    }
   989 
   990 
   990    if (dp->devEnabled) {
       
   991       do_reset = 1;
       
   992       vmxnet3_stop(dp);
       
   993       VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
       
   994    }
       
   995 
       
   996    dp->cur_mtu = new_mtu;
   991    dp->cur_mtu = new_mtu;
   997 
   992 
   998    if (do_reset) {
   993    if ((ret = mac_maxsdu_update(dp->mac, new_mtu)) != 0)
   999       if ((ret = vmxnet3_start(dp)) != 0)
   994       VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", new_mtu, ret);
  1000 	 VMXNET3_WARN(dp, "Unable to restart the device: %d", ret);
       
  1001    }
       
  1002 
       
  1003    if ((macret = mac_maxsdu_update(dp->mac, new_mtu)) != 0) {
       
  1004       VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", new_mtu, macret);
       
  1005       if (ret == 0)
       
  1006          ret = macret;
       
  1007    }
       
  1008 
   995 
  1009    return ret;
   996    return ret;
  1010 }
   997 }
  1011 
   998 
  1012 
   999 
  1254 
  1241 
  1255    atomic_inc_32(&dp->reset_count);
  1242    atomic_inc_32(&dp->reset_count);
  1256    vmxnet3_stop(dp);
  1243    vmxnet3_stop(dp);
  1257    VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
  1244    VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
  1258    if ((ret = vmxnet3_start(dp)) != DDI_SUCCESS)
  1245    if ((ret = vmxnet3_start(dp)) != DDI_SUCCESS)
  1259       VMXNET3_WARN(dp, "failed to restart the device: %d", ret);
  1246       VMXNET3_WARN(dp, "failed to reset the device: %d", ret);
  1260 }
  1247 }
  1261 
  1248 
  1262 /*
  1249 /*
  1263  *---------------------------------------------------------------------------
  1250  *---------------------------------------------------------------------------
  1264  *
  1251  *
  1303          }
  1290          }
  1304       }
  1291       }
  1305       if (events & VMXNET3_ECR_LINK) {
  1292       if (events & VMXNET3_ECR_LINK) {
  1306          vmxnet3_refresh_linkstate(dp);
  1293          vmxnet3_refresh_linkstate(dp);
  1307          linkStateChanged = B_TRUE;
  1294          linkStateChanged = B_TRUE;
       
  1295       }
       
  1296       if (events & VMXNET3_ECR_DIC) {
       
  1297          VMXNET3_DEBUG(dp, 1, "device implementation change\n");
  1308       }
  1298       }
  1309       VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events);
  1299       VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events);
  1310    }
  1300    }
  1311 
  1301 
  1312    return linkStateChanged;
  1302    return linkStateChanged;
  1824 }
  1814 }
  1825 
  1815 
  1826 void
  1816 void
  1827 vmxnet3_log(int level, vmxnet3_softc_t *dp, char *fmt, ...)
  1817 vmxnet3_log(int level, vmxnet3_softc_t *dp, char *fmt, ...)
  1828 {
  1818 {
  1829    va_list ap;
  1819    dev_err(dp->dip, level, fmt);
  1830    char buf[256];
  1820 }
  1831 
       
  1832    va_start(ap, fmt);
       
  1833    (void) vsnprintf(buf, sizeof (buf), fmt, ap);
       
  1834    va_end(ap);
       
  1835 
       
  1836    cmn_err(level, VMXNET3_MODNAME ":%d: %s", dp->instance, buf);
       
  1837 }