Commit 99ed7e30cbd6862ef3bb1ebe51c8a4923d0e282b

Authored by aliguori
1 parent 34b25ca7

Implement e1000 link status (Mark McLoughlin)

On link up or down we set the E1000_STATUS_LU ("link up") bit
in the status register and set the E1000_ICR_LSC ("link
status changed") bit in the interrupt cause register before
interrupting the guest.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6249 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 16 additions and 0 deletions
hw/e1000.c
... ... @@ -570,6 +570,21 @@ receive_filter(E1000State *s, const uint8_t *buf, int size)
570 570 return 0;
571 571 }
572 572  
  573 +static void
  574 +e1000_set_link_status(VLANClientState *vc)
  575 +{
  576 + E1000State *s = vc->opaque;
  577 + uint32_t old_status = s->mac_reg[STATUS];
  578 +
  579 + if (vc->link_down)
  580 + s->mac_reg[STATUS] &= ~E1000_STATUS_LU;
  581 + else
  582 + s->mac_reg[STATUS] |= E1000_STATUS_LU;
  583 +
  584 + if (s->mac_reg[STATUS] != old_status)
  585 + set_ics(s, 0, E1000_ICR_LSC);
  586 +}
  587 +
573 588 static int
574 589 e1000_can_receive(void *opaque)
575 590 {
... ... @@ -1073,6 +1088,7 @@ pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
1073 1088  
1074 1089 d->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
1075 1090 e1000_receive, e1000_can_receive, d);
  1091 + d->vc->link_status_changed = e1000_set_link_status;
1076 1092  
1077 1093 qemu_format_nic_info_str(d->vc, d->nd->macaddr);
1078 1094  
... ...