Print this page

        

@@ -8,11 +8,11 @@
  * source.  A copy of the CDDL is also available via the Internet at
  * http://www.illumos.org/license/CDDL.
  */
 
 /*
- * Copyright 2013 Nexenta Inc.  All rights reserved.
+ * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2014, 2015 by Delphix. All rights reserved.
  */
 
 /* Based on the NetBSD virtio driver by Minoura Makoto. */
 /*

@@ -382,10 +382,11 @@
 vioif_link_state(struct vioif_softc *sc)
 {
         if (sc->sc_virtio.sc_features & VIRTIO_NET_F_STATUS) {
                 if (virtio_read_device_config_2(&sc->sc_virtio,
                     VIRTIO_NET_CONFIG_STATUS) & VIRTIO_NET_S_LINK_UP) {
+
                         return (LINK_STATE_UP);
                 } else {
                         return (LINK_STATE_DOWN);
                 }
         }

@@ -693,15 +694,14 @@
         struct vq_entry *ve;
         struct vioif_rx_buf *buf;
 
         ve = vq_alloc_entry(sc->sc_rx_vq);
         if (!ve) {
-                /*
-                 * Out of free descriptors - ring already full.
-                 * It would be better to update sc_norxdescavail
-                 * but MAC does not ask for this info, hence we
-                 * update sc_norecvbuf.
+                /* Out of free descriptors - ring already full.
+                 * would be better to update sc_norxdescavail
+                 * but MAC does not ask for this info
+                 * hence update sc_norecvbuf
                  */
                 sc->sc_norecvbuf++;
                 goto exit_vq;
         }
         buf = sc->sc_rxbufs[ve->qe_index];

@@ -842,19 +842,17 @@
                         }
                         mp->b_wptr = mp->b_rptr + len;
 
                         atomic_inc_ulong(&sc->sc_rxloan);
                         /*
-                         * Buffer loaned, we will have to allocte a new one
+                         * Buffer loanded, we will have to allocate a new one
                          * for this slot.
                          */
                         sc->sc_rxbufs[ve->qe_index] = NULL;
                 }
-
-                /*
-                 * virtio-net does not tell us if this packet is multicast
-                 * or broadcast, so we have to check it.
+                /* virtio-net does not provide the info if this packet
+                 * is multicast or broadcast. So we have to check it
                  */
                 if (mp->b_rptr[0] & 0x1) {
                         if (bcmp(mp->b_rptr, vioif_broadcast, ETHERADDRL) != 0)
                                 sc->sc_multircv++;
                         else

@@ -1314,11 +1312,10 @@
         case MAC_PROP_PRIVATE:
                 err = vioif_set_prop_private(sc, pr_name,
                     pr_valsize, pr_val);
                 if (err)
                         return (err);
-                break;
         default:
                 return (ENOTSUP);
         }
 
         return (0);

@@ -1371,19 +1368,20 @@
 static void
 vioif_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
     mac_prop_info_handle_t prh)
 {
         struct vioif_softc *sc = arg;
-        char valstr[64];
-        int value;
 
         switch (pr_num) {
         case MAC_PROP_MTU:
                 mac_prop_info_set_range_uint32(prh, ETHERMIN, MAX_MTU);
                 break;
 
-        case MAC_PROP_PRIVATE:
+        case MAC_PROP_PRIVATE: {
+                char valstr[64];
+                int value;
+
                 bzero(valstr, sizeof (valstr));
                 if (strcmp(pr_name, vioif_txcopy_thresh) == 0) {
 
                         value = sc->sc_txcopy_thresh;
                 } else  if (strcmp(pr_name,

@@ -1391,12 +1389,11 @@
                         value = sc->sc_rxcopy_thresh;
                 } else {
                         return;
                 }
                 (void) snprintf(valstr, sizeof (valstr), "%d", value);
-                break;
-
+        }
         default:
                 break;
         }
 }
 

@@ -1452,82 +1449,12 @@
 static void
 vioif_show_features(struct vioif_softc *sc, const char *prefix,
     uint32_t features)
 {
         char buf[512];
-        char *bufp = buf;
-        char *bufend = buf + sizeof (buf);
 
-        /* LINTED E_PTRDIFF_OVERFLOW */
-        bufp += snprintf(bufp, bufend - bufp, prefix);
-
-        /* LINTED E_PTRDIFF_OVERFLOW */
-        bufp += virtio_show_features(features, bufp, bufend - bufp);
-
-        /* LINTED E_PTRDIFF_OVERFLOW */
-        bufp += snprintf(bufp, bufend - bufp, "Vioif ( ");
-
-        if (features & VIRTIO_NET_F_CSUM)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "CSUM ");
-        if (features & VIRTIO_NET_F_GUEST_CSUM)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GUEST_CSUM ");
-        if (features & VIRTIO_NET_F_MAC)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "MAC ");
-        if (features & VIRTIO_NET_F_GSO)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GSO ");
-        if (features & VIRTIO_NET_F_GUEST_TSO4)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO4 ");
-        if (features & VIRTIO_NET_F_GUEST_TSO6)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO6 ");
-        if (features & VIRTIO_NET_F_GUEST_ECN)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GUEST_ECN ");
-        if (features & VIRTIO_NET_F_GUEST_UFO)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "GUEST_UFO ");
-        if (features & VIRTIO_NET_F_HOST_TSO4)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "HOST_TSO4 ");
-        if (features & VIRTIO_NET_F_HOST_TSO6)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "HOST_TSO6 ");
-        if (features & VIRTIO_NET_F_HOST_ECN)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "HOST_ECN ");
-        if (features & VIRTIO_NET_F_HOST_UFO)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "HOST_UFO ");
-        if (features & VIRTIO_NET_F_MRG_RXBUF)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "MRG_RXBUF ");
-        if (features & VIRTIO_NET_F_STATUS)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "STATUS ");
-        if (features & VIRTIO_NET_F_CTRL_VQ)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "CTRL_VQ ");
-        if (features & VIRTIO_NET_F_CTRL_RX)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "CTRL_RX ");
-        if (features & VIRTIO_NET_F_CTRL_VLAN)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "CTRL_VLAN ");
-        if (features & VIRTIO_NET_F_CTRL_RX_EXTRA)
-                /* LINTED E_PTRDIFF_OVERFLOW */
-                bufp += snprintf(bufp, bufend - bufp, "CTRL_RX_EXTRA ");
-
-        /* LINTED E_PTRDIFF_OVERFLOW */
-        bufp += snprintf(bufp, bufend - bufp, ")");
-        *bufp = '\0';
-
-        dev_err(sc->sc_dev, CE_NOTE, "%s", buf);
+        dev_err(sc->sc_dev, CE_NOTE, "%s %s Vioif (%b)", prefix, virtio_show_features(...), features, "\020\1CSUM\2GUEST_CSUM\3MAC\4GSO\5GUEST_TSO4\5GUEST_TSO6\6GUEST_ECN\7GUEST_UFO\8HOST_TSO4\9HOST_TSO6\10HOST_ECN\11HOST_UFO\12MRG_RXBUF\13STATUS\14CTRL_VQ\15CTRL_RX\16CTRL_VLAN\17CTRL_RX_EXTRA", buf);
 }
 
 /*
  * Find out which features are supported by the device and
  * choose which ones we wish to use.

@@ -1545,11 +1472,11 @@
             VIRTIO_NET_F_STATUS |
             VIRTIO_F_RING_INDIRECT_DESC |
             VIRTIO_F_NOTIFY_ON_EMPTY);
 
         vioif_show_features(sc, "Host features: ", host_features);
-        vioif_show_features(sc, "Negotiated features: ",
+        vioif_show_features(sc,  ",
             sc->sc_virtio.sc_features);
 
         if (!(sc->sc_virtio.sc_features & VIRTIO_F_RING_INDIRECT_DESC)) {
                 dev_err(sc->sc_dev, CE_NOTE,
                     "Host does not support RING_INDIRECT_DESC, bye.");

@@ -1702,15 +1629,15 @@
         case DDI_ATTACH:
                 break;
 
         case DDI_RESUME:
         case DDI_PM_RESUME:
-                /* not supported yet */
+                dev_err(devinfo, CE_WARN, "resume not supported yet");
                 goto exit;
 
         default:
-                /* unrecognized command */
+                dev_err(devinfo, CE_WARN, "cmd 0x%x unrecognized", cmd);
                 goto exit;
         }
 
         sc = kmem_zalloc(sizeof (struct vioif_softc), KM_SLEEP);
         ddi_set_driver_private(devinfo, sc);

@@ -1885,20 +1812,20 @@
         switch (cmd) {
         case DDI_DETACH:
                 break;
 
         case DDI_PM_SUSPEND:
-                /* not supported yet */
+                cmn_err(CE_WARN, "suspend not supported yet");
                 return (DDI_FAILURE);
 
         default:
-                /* unrecognized command */
+                cmn_err(CE_WARN, "cmd 0x%x unrecognized", cmd);
                 return (DDI_FAILURE);
         }
 
         if (sc->sc_rxloan) {
-                cmn_err(CE_NOTE, "Some rx buffers are still upstream, "
+                cmn_err(CE_WARN, "Some rx buffers are still upstream, "
                     "Not detaching");
                 return (DDI_FAILURE);
         }
 
         virtio_stop_vq_intr(sc->sc_rx_vq);

@@ -1950,10 +1877,11 @@
         mac_init_ops(&vioif_ops, "vioif");
 
         ret = mod_install(&modlinkage);
         if (ret != DDI_SUCCESS) {
                 mac_fini_ops(&vioif_ops);
+                cmn_err(CE_WARN, "Unable to install the driver");
                 return (ret);
         }
 
         return (0);
 }