Apply by doing:
       cd /usr/src
       patch -p0 < 007_vio.patch

Then build and install a new kernel.

Index: sys/dev/pci/if_vio.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_vio.c,v
retrieving revision 1.9
retrieving revision 1.9.2.2
diff -u -p -r1.9 -r1.9.2.2
--- sys/dev/pci/if_vio.c        5 Dec 2012 23:20:20 -0000       1.9
+++ sys/dev/pci/if_vio.c        30 May 2013 21:52:12 -0000      1.9.2.2
@@ -232,11 +232,13 @@ struct vio_softc {
       ((sc)->sc_hdr_size == sizeof(struct virtio_net_hdr))

#define VIRTIO_NET_TX_MAXNSEGS         16 /* for larger chains, defrag */
-#define VIRTIO_NET_CTRL_MAC_MAXENTRIES 64 /* for more entries, use ALLMULTI */
+#define VIRTIO_NET_CTRL_MAC_MC_ENTRIES 64 /* for more entries, use ALLMULTI */
+#define VIRTIO_NET_CTRL_MAC_UC_ENTRIES  1 /* one entry for own unicast addr */

#define VIO_CTRL_MAC_INFO_SIZE                                         \
       (2*sizeof(struct virtio_net_ctrl_mac_tbl) +             \
-        (VIRTIO_NET_CTRL_MAC_MAXENTRIES + 1) * ETHER_ADDR_LEN)
+        (VIRTIO_NET_CTRL_MAC_MC_ENTRIES +                      \
+         VIRTIO_NET_CTRL_MAC_UC_ENTRIES) * ETHER_ADDR_LEN)

/* cfattach interface functions */
int    vio_match(struct device *, void *, void *);
@@ -391,9 +393,7 @@ vio_alloc_mem(struct vio_softc *sc)
               allocsize += sizeof(struct virtio_net_ctrl_cmd) * 1;
               allocsize += sizeof(struct virtio_net_ctrl_status) * 1;
               allocsize += sizeof(struct virtio_net_ctrl_rx) * 1;
-               allocsize += sizeof(struct virtio_net_ctrl_mac_tbl)
-                       + sizeof(struct virtio_net_ctrl_mac_tbl)
-                       + ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES;
+               allocsize += VIO_CTRL_MAC_INFO_SIZE;
       }
       sc->sc_dma_size = allocsize;

@@ -413,7 +413,8 @@ vio_alloc_mem(struct vio_softc *sc)
               sc->sc_ctrl_rx = (void*)(kva + offset);
               offset += sizeof(*sc->sc_ctrl_rx);
               sc->sc_ctrl_mac_tbl_uc = (void*)(kva + offset);
-               offset += sizeof(*sc->sc_ctrl_mac_tbl_uc);
+               offset += sizeof(*sc->sc_ctrl_mac_tbl_uc) +
+                   ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_UC_ENTRIES;
               sc->sc_ctrl_mac_tbl_mc = (void*)(kva + offset);
       }

@@ -742,6 +743,10 @@ again:
                       break;
               }
               IFQ_DEQUEUE(&ifp->if_snd, m);
+               if (m != sc->sc_tx_mbufs[slot]) {
+                       m_freem(m);
+                       m = sc->sc_tx_mbufs[slot];
+               }

               hdr = &sc->sc_tx_hdrs[slot];
               memset(hdr, 0, sc->sc_hdr_size);
@@ -1113,7 +1118,6 @@ vio_encap(struct vio_softc *sc, int slot
                   r);
               return ENOBUFS;
       }
-       m_freem(m);
       *mnew = m0;
       return 0;
}
@@ -1342,7 +1346,7 @@ vio_iff(struct vio_softc *sc)
       }

       if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0 ||
-           ac->ac_multicnt >= VIRTIO_NET_CTRL_MAC_MAXENTRIES) {
+           ac->ac_multicnt >= VIRTIO_NET_CTRL_MAC_MC_ENTRIES) {
               ifp->if_flags |= IFF_ALLMULTI;
               if (ifp->if_flags & IFF_PROMISC)
                       promisc = 1;