Commit 99ed7e30cbd6862ef3bb1ebe51c8a4923d0e282b
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 | ... | ... |