socsvn commit: r289965 - soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve

iateaca at FreeBSD.org iateaca at FreeBSD.org
Thu Aug 20 13:54:33 UTC 2015


Author: iateaca
Date: Thu Aug 20 13:54:32 2015
New Revision: 289965
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289965

Log:
  redesign: implement ne2000 init function

Modified:
  soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c

Modified: soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c
==============================================================================
--- soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c	Thu Aug 20 12:49:56 2015	(r289964)
+++ soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c	Thu Aug 20 13:54:32 2015	(r289965)
@@ -62,7 +62,7 @@
  * NE2000 data structures
  */
 struct ne2000_softc {
-	struct pci_devinst *asc_pi;
+	struct pci_devinst *pci_inst;
 
 	/*
 	 * one single mutex used to lock the reception flow with
@@ -101,6 +101,9 @@
 ne2000_set_field_by_offset(struct ne2000_softc *sc, uint8_t page,
 		uint8_t offset, uint8_t mask, uint8_t value);
 
+static int
+ne2000_init(struct ne2000_softc *sc, char *opts);
+
 static uint8_t
 ne2000_read_nic(struct ne2000_softc *sc, uint8_t offset);
 static uint16_t
@@ -147,6 +150,18 @@
 ne2000_parse_input(char *opts, char *tap_name, uint8_t *mac);
 
 /*
+ * PCI NE2000 function declarations
+ */
+static int
+pci_ne2000_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts);
+static void
+pci_ne2000_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+		int baridx, uint64_t offset, int size, uint64_t value);
+static uint64_t
+pci_ne2000_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+		int baridx, uint64_t offset, int size);
+
+/*
  * NE2000 module function definitions
  */
 static void
@@ -194,12 +209,12 @@
 
 	if (imr & isr) {
 		if (!sc->lintr) {
-			pci_lintr_assert(sc->asc_pi);
+			pci_lintr_assert(sc->pci_inst);
 			sc->lintr = 1;
 		}
 	} else {
 		if (sc->lintr) {
-			pci_lintr_deassert(sc->asc_pi);
+			pci_lintr_deassert(sc->pci_inst);
 			sc->lintr = 0;
 		}
 	}
@@ -555,103 +570,6 @@
 }
 
 static int
-pci_ne2000_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
-{
-	struct ne2000_softc *sc = NULL;
-	int err;
-
-	/* the default mac address is 00:a0:98:4a:0e:ee */
-	uint8_t mac[ETHER_ADDR_LEN] = {0x00, 0xa0, 0x98, 0x4a, 0x0e, 0xee};
-	char tap_name[MAX_INPUT_LEN];
-
-#if DEBUG_NE2000 == 1
-	dbg = fopen("/tmp/bhyve_ne2000.log", "w+");
-#endif
-
-	assert(ctx != NULL);
-	assert(pi != NULL);
-
-	sc = calloc(1, sizeof(struct ne2000_softc));
-	pi->pi_arg = sc;
-	sc->asc_pi = pi;
-
-	err = ne2000_parse_input(opts, tap_name, mac);
-	if (err != 0) {
-		printf("Use input param like: -s x:y,ne2000-net,tap_name[,mac address]");
-		free(sc);
-		return 1;
-	}
-
-	err = pthread_mutex_init(&sc->mtx, NULL);
-	assert(err == 0);
-
-	err = ne2000_tap_init(sc, tap_name);
-	assert(err == 0);
-
-	/* probe a RTL8029 PCI card as a generic NE2000 device */
-	pci_set_cfgdata16(pi, PCIR_DEVICE, 0x8029);
-	pci_set_cfgdata16(pi, PCIR_VENDOR, 0x10ec);
-
-	/* allocate two BAR registers for both NIC and ASIC I/O bus address offsets */
-	pci_emul_alloc_bar(pi, 0, PCIBAR_IO, 16);
-	pci_emul_alloc_bar(pi, 1, PCIBAR_IO, 16);
-
-	/* allocate an IRQ pin for our slot */
-	pci_lintr_request(pi);
-
-	/* set network medium type as 10BaseT and full-duplex */
-	ne2000_set_reg_by_offset(sc, NE2000_P3,
-			ED_RTL80X9_CONFIG2, ED_RTL80X9_CF2_10_T);
-	ne2000_set_reg_by_offset(sc, NE2000_P3,
-			ED_RTL80X9_CONFIG3, ED_RTL80X9_CF3_FUDUP);
-
-	/* the NE2000 card has his MAC address located in the first 6 words of the RAM memory */
-	sc->ram[0] = mac[0];
-	sc->ram[2] = mac[1];
-	sc->ram[4] = mac[2];
-	sc->ram[6] = mac[3];
-	sc->ram[8] = mac[4];
-	sc->ram[10] = mac[5];
-
-	return 0;
-}
-
-static void
-pci_ne2000_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
-		int baridx, uint64_t offset, int size, uint64_t value)
-{
-	struct ne2000_softc *sc = pi->pi_arg;
-	int err;
-
-	assert(sc != NULL);
-	assert(offset <= 0x0f);
-
-	err = pthread_mutex_lock(&sc->mtx);
-	assert(err == 0);
-
-	switch (baridx) {
-	case NE2000_BAR_NIC:
-		assert(size == 1);
-		assert(value <= 0xff);
-		err = ne2000_write_nic(sc, offset, value);
-		break;
-	case NE2000_BAR_ASIC:
-		assert(size <= 2);
-		err = ne2000_write_asic(sc, offset, value);
-		break;
-	default:
-		assert(0);
-	}
-
-	assert(err == 0);
-
-	err = pthread_mutex_unlock(&sc->mtx);
-	assert(err == 0);
-
-	return;
-}
-
-static int
 ne2000_write_nic(struct ne2000_softc *sc, uint8_t offset, uint8_t value)
 {
 	int err;
@@ -935,37 +853,46 @@
 	return 0;
 }
 
-static uint64_t
-pci_ne2000_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
-		int baridx, uint64_t offset, int size)
+static int
+ne2000_init(struct ne2000_softc *sc, char *opts)
 {
-	struct ne2000_softc *sc = pi->pi_arg;
-	uint64_t value = 0;
+	/* the default mac address is 00:a0:98:4a:0e:ee */
+	uint8_t mac[ETHER_ADDR_LEN] = {0x00, 0xa0, 0x98, 0x4a, 0x0e, 0xee};
+	char tap_name[MAX_INPUT_LEN];
 	int err;
 
-	assert(sc != NULL);
-	assert(offset <= 0x0f);
-
-	err = pthread_mutex_lock(&sc->mtx);
-	assert(err == 0);
+#if DEBUG_NE2000 == 1
+	dbg = fopen("/tmp/bhyve_ne2000.log", "w+");
+#endif
 
-	switch (baridx) {
-	case NE2000_BAR_NIC:
-		assert(size == 1);
-		value = ne2000_read_nic(sc, offset);
-		break;
-	case NE2000_BAR_ASIC:
-		assert(size <= 2);
-		value = ne2000_read_asic(sc, offset);
-		break;
-	default:
-		assert(0);
+	err = ne2000_parse_input(opts, tap_name, mac);
+	if (err != 0) {
+		printf("Use input param like: -s x:y,ne2000-net,tap_name[,mac address]");
+		free(sc);
+		return -1;
 	}
 
-	err = pthread_mutex_unlock(&sc->mtx);
+	err = pthread_mutex_init(&sc->mtx, NULL);
 	assert(err == 0);
 
-	return value;
+	err = ne2000_tap_init(sc, tap_name);
+	assert(err == 0);
+
+	/* set network medium type as 10BaseT and full-duplex */
+	ne2000_set_reg_by_offset(sc, NE2000_P3,
+			ED_RTL80X9_CONFIG2, ED_RTL80X9_CF2_10_T);
+	ne2000_set_reg_by_offset(sc, NE2000_P3,
+			ED_RTL80X9_CONFIG3, ED_RTL80X9_CF3_FUDUP);
+
+	/* the NE2000 card has his MAC address located in the first 6 words of the RAM memory */
+	sc->ram[0] = mac[0];
+	sc->ram[2] = mac[1];
+	sc->ram[4] = mac[2];
+	sc->ram[6] = mac[3];
+	sc->ram[8] = mac[4];
+	sc->ram[10] = mac[5];
+
+	return 0;
 }
 
 static uint8_t
@@ -1101,6 +1028,109 @@
 	return 0;
 }
 
+/*
+ * PCI NE2000 function definitions
+ */
+static int
+pci_ne2000_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
+{
+	struct ne2000_softc *sc = NULL;
+
+	assert(ctx != NULL);
+	assert(pi != NULL);
+
+	sc = calloc(1, sizeof(struct ne2000_softc));
+
+	/* initialize the ne2000 data structure */
+	if (ne2000_init(sc, opts) != 0)
+		return 1;
+
+	/* save the pci instance into the ne2000 structure */
+	sc->pci_inst = pi;
+	pi->pi_arg = sc;
+
+	/* probe a RTL8029 PCI card as a generic NE2000 device */
+	pci_set_cfgdata16(pi, PCIR_DEVICE, 0x8029);
+	pci_set_cfgdata16(pi, PCIR_VENDOR, 0x10ec);
+
+	/* allocate two BAR registers for both NIC and ASIC I/O bus address offsets */
+	pci_emul_alloc_bar(pi, 0, PCIBAR_IO, 16);
+	pci_emul_alloc_bar(pi, 1, PCIBAR_IO, 16);
+
+	/* allocate an IRQ pin for our slot */
+	pci_lintr_request(pi);
+
+	return 0;
+}
+
+static void
+pci_ne2000_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+		int baridx, uint64_t offset, int size, uint64_t value)
+{
+	struct ne2000_softc *sc = pi->pi_arg;
+	int err;
+
+	assert(sc != NULL);
+	assert(offset <= 0x0f);
+
+	err = pthread_mutex_lock(&sc->mtx);
+	assert(err == 0);
+
+	switch (baridx) {
+	case NE2000_BAR_NIC:
+		assert(size == 1);
+		assert(value <= 0xff);
+		err = ne2000_write_nic(sc, offset, value);
+		break;
+	case NE2000_BAR_ASIC:
+		assert(size <= 2);
+		err = ne2000_write_asic(sc, offset, value);
+		break;
+	default:
+		assert(0);
+	}
+
+	assert(err == 0);
+
+	err = pthread_mutex_unlock(&sc->mtx);
+	assert(err == 0);
+
+	return;
+}
+
+static uint64_t
+pci_ne2000_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
+		int baridx, uint64_t offset, int size)
+{
+	struct ne2000_softc *sc = pi->pi_arg;
+	uint64_t value = 0;
+	int err;
+
+	assert(sc != NULL);
+	assert(offset <= 0x0f);
+
+	err = pthread_mutex_lock(&sc->mtx);
+	assert(err == 0);
+
+	switch (baridx) {
+	case NE2000_BAR_NIC:
+		assert(size == 1);
+		value = ne2000_read_nic(sc, offset);
+		break;
+	case NE2000_BAR_ASIC:
+		assert(size <= 2);
+		value = ne2000_read_asic(sc, offset);
+		break;
+	default:
+		assert(0);
+	}
+
+	err = pthread_mutex_unlock(&sc->mtx);
+	assert(err == 0);
+
+	return value;
+}
+
 struct pci_devemu pci_de_ne2000_net = {
 	.pe_emu         = "ne2000-net",
 	.pe_init        = pci_ne2000_init,


More information about the svn-soc-all mailing list