Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Revised check for already-launched VM
[palacios.git] / palacios / src / devices / rtl8139.c
index 199d0d7..18e966a 100644 (file)
@@ -28,7 +28,7 @@
 
 
 
-#ifndef CONFIG_DEBUG_RTL8139
+#ifndef V3_CONFIG_DEBUG_RTL8139
 #undef PrintDebug
 #define PrintDebug(fmts, args...)
 #endif
@@ -171,16 +171,16 @@ struct rx_status_reg {
     union {
        uint16_t val;
        struct {
-           uint8_t rx_ok     : 1;
-           uint8_t rx_bad_align     : 1;
-           uint8_t rx_crc_err     : 1;
-           uint8_t rx_too_long     : 1;        
-           uint8_t rx_runt     : 1;
-           uint8_t rx_bad_sym  : 1;
-           uint8_t reserved    : 7;
-           uint8_t rx_brdcast  : 1;
-           uint8_t rx_phys     : 1;
-           uint8_t rx_multi    : 1;
+           uint16_t rx_ok     : 1;
+           uint16_t rx_bad_align     : 1;
+           uint16_t rx_crc_err     : 1;
+           uint16_t rx_too_long     : 1;       
+           uint16_t rx_runt    : 1;
+           uint16_t rx_bad_sym : 1;
+           uint16_t reserved   : 7;
+           uint16_t rx_brdcast : 1;
+           uint16_t rx_phys    : 1;
+           uint16_t rx_multi   : 1;
        } __attribute__((packed));
     } __attribute__((packed));
 } __attribute__((packed));
@@ -270,17 +270,17 @@ struct isr_imr_reg {
     union {
        uint16_t val;
        struct {
-           uint8_t rx_ok       :1;
-           uint8_t rx_err     : 1;
-           uint8_t tx_ok        : 1;
-           uint8_t tx_err          : 1;
-           uint8_t rx_ovw          : 1;
-           uint8_t pun_linkchg          : 1;
-           uint8_t rx_fifo_ovw  : 1;
-           uint8_t reservd:     6;
-           uint8_t lenchg  :1;
-           uint8_t timeout   :1;
-           uint8_t syserr  :1;
+           uint16_t rx_ok      :1;
+           uint16_t rx_err     : 1;
+           uint16_t tx_ok        : 1;
+           uint16_t tx_err          : 1;
+           uint16_t rx_ovw          : 1;
+           uint16_t pun_linkchg          : 1;
+           uint16_t rx_fifo_ovw  : 1;
+           uint16_t reservd:     6;
+           uint16_t lenchg  :1;
+           uint16_t timeout   :1;
+           uint16_t syserr  :1;
        } __attribute__((packed));
     } __attribute__((packed));
 } __attribute__((packed));
@@ -582,8 +582,8 @@ static inline void rtl8139_update_irq(struct rtl8139_state * nic_state) {
     int isr = ((nic_state->regs.isr & nic_state->regs.imr) & 0xffff);
 
     if(isr & 0xffff){
-       v3_pci_raise_irq(nic_state->pci_bus, 0, nic_state->pci_dev);
-       nic_state->statistic.interrupts ++;
+       v3_pci_raise_irq(nic_state->pci_bus, nic_state->pci_dev, 0);
+       nic_state->statistic.tx_interrupts ++;
     }
 }
 
@@ -1174,7 +1174,7 @@ static int tx_one_packet(struct rtl8139_state * nic_state, int descriptor){
     v3_gpa_to_hva(&(nic_state->vm->cores[0]), (addr_t)pkt_gpa, &hostva);
     pkt = (uchar_t *)hostva;
 
-#ifdef CONFIG_DEBUG_RTL8139
+#ifdef V3_CONFIG_DEBUG_RTL8139
     v3_hexdump(pkt, txsize, NULL, 0);
 #endif
 
@@ -1713,7 +1713,7 @@ static int register_dev(struct rtl8139_state * nic_state)  {
     }
 
     bars[0].type = PCI_BAR_IO;
-    bars[0].default_base_port = 0xc100;
+    bars[0].default_base_port = -1;
     bars[0].num_ports = 0x100;
 
     bars[0].io_read = rtl8139_ioport_read;
@@ -1732,7 +1732,7 @@ static int register_dev(struct rtl8139_state * nic_state)  {
 
     pci_dev = v3_pci_register_device(nic_state->pci_bus, PCI_STD_DEVICE, 0, -1, 0, 
                                         "RTL8139", bars,
-                                        NULL, NULL, NULL, nic_state);
+                                    NULL, NULL, NULL, NULL, nic_state);
 
 
     if (pci_dev == NULL) {
@@ -1774,10 +1774,8 @@ static int connect_fn(struct v3_vm_info * info,
 
     ops->recv = rtl8139_rx;
     ops->poll = NULL;
-    ops->start_tx = NULL;
-    ops->stop_tx = NULL;
-    ops->frontend_data = nic_state;
-    memcpy(ops->fnt_mac, nic_state->mac, ETH_ALEN);
+    ops->config.frontend_data = nic_state;
+    ops->config.fnt_mac = nic_state->mac;
 
     return 0;
 }
@@ -1808,6 +1806,12 @@ static int rtl8139_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
     char * macstr = v3_cfg_val(cfg, "mac");
 
     nic_state  = (struct rtl8139_state *)V3_Malloc(sizeof(struct rtl8139_state));
+
+    if (!nic_state) {
+       PrintError("Cannot allocate in init\n");
+       return -1;
+    }
+
     memset(nic_state, 0, sizeof(struct rtl8139_state));
 
     nic_state->pci_bus = pci_bus;