socsvn commit: r287504 - soc2015/stefano/ptnetmap/head/sys/dev/netmap

stefano at FreeBSD.org stefano at FreeBSD.org
Tue Jun 23 19:11:10 UTC 2015


Author: stefano
Date: Tue Jun 23 19:11:09 2015
New Revision: 287504
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287504

Log:
  [ptnetmap/virtio] fix iowrite/ioread and mbuf allocation
  
  change vtnet_ptnetmap_[iowrite4 | ioread4]:
  	like in linux version, we write/read 1 byte each time
  
  use m_gethdr() instead of m_getjcl() to alloc the fake packet

Modified:
  soc2015/stefano/ptnetmap/head/sys/dev/netmap/if_vtnet_netmap.h

Modified: soc2015/stefano/ptnetmap/head/sys/dev/netmap/if_vtnet_netmap.h
==============================================================================
--- soc2015/stefano/ptnetmap/head/sys/dev/netmap/if_vtnet_netmap.h	Tue Jun 23 19:04:46 2015	(r287503)
+++ soc2015/stefano/ptnetmap/head/sys/dev/netmap/if_vtnet_netmap.h	Tue Jun 23 19:11:09 2015	(r287504)
@@ -427,13 +427,23 @@
 static void inline
 vtnet_ptnetmap_iowrite4(device_t dev, uint32_t addr, uint32_t val)
 {
-	virtio_write_dev_config_4(dev, PTNETMAP_VIRTIO_IO_BASE + addr, val);
+	int i;
+	/* virtio_pci config_set use multiple iowrite8, we need to split the call and reverse the order */
+	for (i = 3; i >= 0; i--) {
+		virtio_write_dev_config_1(dev, PTNETMAP_VIRTIO_IO_BASE + addr + i, *(((uint8_t *)&val) + i));
+	}
 }
 
 static uint32_t inline
 vtnet_ptnetmap_ioread4(device_t dev, uint32_t addr)
 {
-	return virtio_read_dev_config_4(dev, PTNETMAP_VIRTIO_IO_BASE + addr);
+	uint32_t val;
+	int i;
+
+	for (i = 0; i <= 3; i++) {
+		*(((uint8_t *)&val) + i) = virtio_read_dev_config_1(dev, PTNETMAP_VIRTIO_IO_BASE + addr + i);
+	}
+	return val;
 }
 
 static int
@@ -460,8 +470,8 @@
 	ptna->csb->guest_csb_on = 1;
 
 	/* Tell the device the CSB physical address. */
-	vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAH, (csb_phyaddr >> 32));
-	vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAL, (csb_phyaddr & 0x00000000ffffffffULL));
+	vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAH, (uint32_t)(csb_phyaddr >> 32));
+	vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAL, (uint32_t)(csb_phyaddr));
 
 	return 0;
 }
@@ -664,7 +674,7 @@
                 for (i = 0; i < sc->vtnet_max_vq_pairs; i++) {
 			struct vtnet_txq *txq = &sc->vtnet_txqs[i];
 			struct mbuf *m0;
-			m0 = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, 64);
+			m0 = m_gethdr(M_NOWAIT, MT_DATA);
 			m0->m_len = 64;
 
 			if (m0) {


More information about the svn-soc-all mailing list