mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 02:54:58 -06:00
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJazDEhAAoJEO8Ells5jWIRwNcH/jfvFCOg5SVefHiuk4+6b3mM 3YP9vBFGx0gJREelYBriCWuMUELem79rGWskQvhNe43/qkFktlR/bRbB+QOIcPmo ZoDHNj8AQXTkCbXnctsG4ygPmAuK67zft9yNMRQlOH3OUnfFfEq+aNL9tXenzgrS oLfVApdtBk67ZdwWOrEz+43YKB/0FyvFoHFdABvPLRFtWlKLtGMgoYLjGdjxywMK LpHkKm+Uw0xW+Y4PII1yEN7ke3Nx9Gw8SWWegTPZlJ+hPMvtF8nt3uibD38YqsKg XfuCWDSeJ8LIQNUdG4K5g5dIES2NaEIDeENatWlvELgP7HdlQSQ0HbJFoCUHmOk= =fuVG -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Tue 10 Apr 2018 04:36:01 BST # gpg: using RSA key EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: e1000: Old machine types, turn new subsection off e1000: Choose which set of props to migrate e1000: Migrate props via a temporary structure e1000: wire new subsection to property e1000: Dupe offload data on reading old stream e1000: Convert v3 fields to subsection Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
daf6b59be8
2 changed files with 84 additions and 23 deletions
103
hw/net/e1000.c
103
hw/net/e1000.c
|
@ -123,10 +123,15 @@ typedef struct E1000State_st {
|
||||||
#define E1000_FLAG_AUTONEG_BIT 0
|
#define E1000_FLAG_AUTONEG_BIT 0
|
||||||
#define E1000_FLAG_MIT_BIT 1
|
#define E1000_FLAG_MIT_BIT 1
|
||||||
#define E1000_FLAG_MAC_BIT 2
|
#define E1000_FLAG_MAC_BIT 2
|
||||||
|
#define E1000_FLAG_TSO_BIT 3
|
||||||
#define E1000_FLAG_AUTONEG (1 << E1000_FLAG_AUTONEG_BIT)
|
#define E1000_FLAG_AUTONEG (1 << E1000_FLAG_AUTONEG_BIT)
|
||||||
#define E1000_FLAG_MIT (1 << E1000_FLAG_MIT_BIT)
|
#define E1000_FLAG_MIT (1 << E1000_FLAG_MIT_BIT)
|
||||||
#define E1000_FLAG_MAC (1 << E1000_FLAG_MAC_BIT)
|
#define E1000_FLAG_MAC (1 << E1000_FLAG_MAC_BIT)
|
||||||
|
#define E1000_FLAG_TSO (1 << E1000_FLAG_TSO_BIT)
|
||||||
uint32_t compat_flags;
|
uint32_t compat_flags;
|
||||||
|
bool received_tx_tso;
|
||||||
|
bool use_tso_for_migration;
|
||||||
|
e1000x_txd_props mig_props;
|
||||||
} E1000State;
|
} E1000State;
|
||||||
|
|
||||||
#define chkflag(x) (s->compat_flags & E1000_FLAG_##x)
|
#define chkflag(x) (s->compat_flags & E1000_FLAG_##x)
|
||||||
|
@ -618,9 +623,11 @@ process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
|
||||||
if (dtype == E1000_TXD_CMD_DEXT) { /* context descriptor */
|
if (dtype == E1000_TXD_CMD_DEXT) { /* context descriptor */
|
||||||
if (le32_to_cpu(xp->cmd_and_length) & E1000_TXD_CMD_TSE) {
|
if (le32_to_cpu(xp->cmd_and_length) & E1000_TXD_CMD_TSE) {
|
||||||
e1000x_read_tx_ctx_descr(xp, &tp->tso_props);
|
e1000x_read_tx_ctx_descr(xp, &tp->tso_props);
|
||||||
|
s->use_tso_for_migration = 1;
|
||||||
tp->tso_frames = 0;
|
tp->tso_frames = 0;
|
||||||
} else {
|
} else {
|
||||||
e1000x_read_tx_ctx_descr(xp, &tp->props);
|
e1000x_read_tx_ctx_descr(xp, &tp->props);
|
||||||
|
s->use_tso_for_migration = 0;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
|
} else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D)) {
|
||||||
|
@ -1362,6 +1369,20 @@ static int e1000_pre_save(void *opaque)
|
||||||
s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
|
s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Decide which set of props to migrate in the main structure */
|
||||||
|
if (chkflag(TSO) || !s->use_tso_for_migration) {
|
||||||
|
/* Either we're migrating with the extra subsection, in which
|
||||||
|
* case the mig_props is always 'props' OR
|
||||||
|
* we've not got the subsection, but 'props' was the last
|
||||||
|
* updated.
|
||||||
|
*/
|
||||||
|
s->mig_props = s->tx.props;
|
||||||
|
} else {
|
||||||
|
/* We're not using the subsection, and 'tso_props' was
|
||||||
|
* the last updated.
|
||||||
|
*/
|
||||||
|
s->mig_props = s->tx.tso_props;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1390,6 +1411,21 @@ static int e1000_post_load(void *opaque, int version_id)
|
||||||
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500);
|
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->tx.props = s->mig_props;
|
||||||
|
if (!s->received_tx_tso) {
|
||||||
|
/* We received only one set of offload data (tx.props)
|
||||||
|
* and haven't got tx.tso_props. The best we can do
|
||||||
|
* is dupe the data.
|
||||||
|
*/
|
||||||
|
s->tx.tso_props = s->mig_props;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int e1000_tx_tso_post_load(void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
E1000State *s = opaque;
|
||||||
|
s->received_tx_tso = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1407,6 +1443,13 @@ static bool e1000_full_mac_needed(void *opaque)
|
||||||
return chkflag(MAC);
|
return chkflag(MAC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool e1000_tso_state_needed(void *opaque)
|
||||||
|
{
|
||||||
|
E1000State *s = opaque;
|
||||||
|
|
||||||
|
return chkflag(TSO);
|
||||||
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_e1000_mit_state = {
|
static const VMStateDescription vmstate_e1000_mit_state = {
|
||||||
.name = "e1000/mit_state",
|
.name = "e1000/mit_state",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
|
@ -1433,9 +1476,31 @@ static const VMStateDescription vmstate_e1000_full_mac_state = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_e1000_tx_tso_state = {
|
||||||
|
.name = "e1000/tx_tso_state",
|
||||||
|
.version_id = 1,
|
||||||
|
.minimum_version_id = 1,
|
||||||
|
.needed = e1000_tso_state_needed,
|
||||||
|
.post_load = e1000_tx_tso_post_load,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_UINT8(tx.tso_props.ipcss, E1000State),
|
||||||
|
VMSTATE_UINT8(tx.tso_props.ipcso, E1000State),
|
||||||
|
VMSTATE_UINT16(tx.tso_props.ipcse, E1000State),
|
||||||
|
VMSTATE_UINT8(tx.tso_props.tucss, E1000State),
|
||||||
|
VMSTATE_UINT8(tx.tso_props.tucso, E1000State),
|
||||||
|
VMSTATE_UINT16(tx.tso_props.tucse, E1000State),
|
||||||
|
VMSTATE_UINT32(tx.tso_props.paylen, E1000State),
|
||||||
|
VMSTATE_UINT8(tx.tso_props.hdr_len, E1000State),
|
||||||
|
VMSTATE_UINT16(tx.tso_props.mss, E1000State),
|
||||||
|
VMSTATE_INT8(tx.tso_props.ip, E1000State),
|
||||||
|
VMSTATE_INT8(tx.tso_props.tcp, E1000State),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_e1000 = {
|
static const VMStateDescription vmstate_e1000 = {
|
||||||
.name = "e1000",
|
.name = "e1000",
|
||||||
.version_id = 3,
|
.version_id = 2,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
.pre_save = e1000_pre_save,
|
.pre_save = e1000_pre_save,
|
||||||
.post_load = e1000_post_load,
|
.post_load = e1000_post_load,
|
||||||
|
@ -1450,20 +1515,20 @@ static const VMStateDescription vmstate_e1000 = {
|
||||||
VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
|
VMSTATE_UINT16(eecd_state.bitnum_out, E1000State),
|
||||||
VMSTATE_UINT16(eecd_state.reading, E1000State),
|
VMSTATE_UINT16(eecd_state.reading, E1000State),
|
||||||
VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
|
VMSTATE_UINT32(eecd_state.old_eecd, E1000State),
|
||||||
VMSTATE_UINT8(tx.props.ipcss, E1000State),
|
VMSTATE_UINT8(mig_props.ipcss, E1000State),
|
||||||
VMSTATE_UINT8(tx.props.ipcso, E1000State),
|
VMSTATE_UINT8(mig_props.ipcso, E1000State),
|
||||||
VMSTATE_UINT16(tx.props.ipcse, E1000State),
|
VMSTATE_UINT16(mig_props.ipcse, E1000State),
|
||||||
VMSTATE_UINT8(tx.props.tucss, E1000State),
|
VMSTATE_UINT8(mig_props.tucss, E1000State),
|
||||||
VMSTATE_UINT8(tx.props.tucso, E1000State),
|
VMSTATE_UINT8(mig_props.tucso, E1000State),
|
||||||
VMSTATE_UINT16(tx.props.tucse, E1000State),
|
VMSTATE_UINT16(mig_props.tucse, E1000State),
|
||||||
VMSTATE_UINT32(tx.props.paylen, E1000State),
|
VMSTATE_UINT32(mig_props.paylen, E1000State),
|
||||||
VMSTATE_UINT8(tx.props.hdr_len, E1000State),
|
VMSTATE_UINT8(mig_props.hdr_len, E1000State),
|
||||||
VMSTATE_UINT16(tx.props.mss, E1000State),
|
VMSTATE_UINT16(mig_props.mss, E1000State),
|
||||||
VMSTATE_UINT16(tx.size, E1000State),
|
VMSTATE_UINT16(tx.size, E1000State),
|
||||||
VMSTATE_UINT16(tx.tso_frames, E1000State),
|
VMSTATE_UINT16(tx.tso_frames, E1000State),
|
||||||
VMSTATE_UINT8(tx.sum_needed, E1000State),
|
VMSTATE_UINT8(tx.sum_needed, E1000State),
|
||||||
VMSTATE_INT8(tx.props.ip, E1000State),
|
VMSTATE_INT8(mig_props.ip, E1000State),
|
||||||
VMSTATE_INT8(tx.props.tcp, E1000State),
|
VMSTATE_INT8(mig_props.tcp, E1000State),
|
||||||
VMSTATE_BUFFER(tx.header, E1000State),
|
VMSTATE_BUFFER(tx.header, E1000State),
|
||||||
VMSTATE_BUFFER(tx.data, E1000State),
|
VMSTATE_BUFFER(tx.data, E1000State),
|
||||||
VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
|
VMSTATE_UINT16_ARRAY(eeprom_data, E1000State, 64),
|
||||||
|
@ -1508,22 +1573,12 @@ static const VMStateDescription vmstate_e1000 = {
|
||||||
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
|
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, RA, 32),
|
||||||
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
|
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, 128),
|
||||||
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
|
VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA, 128),
|
||||||
VMSTATE_UINT8_V(tx.tso_props.ipcss, E1000State, 3),
|
|
||||||
VMSTATE_UINT8_V(tx.tso_props.ipcso, E1000State, 3),
|
|
||||||
VMSTATE_UINT16_V(tx.tso_props.ipcse, E1000State, 3),
|
|
||||||
VMSTATE_UINT8_V(tx.tso_props.tucss, E1000State, 3),
|
|
||||||
VMSTATE_UINT8_V(tx.tso_props.tucso, E1000State, 3),
|
|
||||||
VMSTATE_UINT16_V(tx.tso_props.tucse, E1000State, 3),
|
|
||||||
VMSTATE_UINT32_V(tx.tso_props.paylen, E1000State, 3),
|
|
||||||
VMSTATE_UINT8_V(tx.tso_props.hdr_len, E1000State, 3),
|
|
||||||
VMSTATE_UINT16_V(tx.tso_props.mss, E1000State, 3),
|
|
||||||
VMSTATE_INT8_V(tx.tso_props.ip, E1000State, 3),
|
|
||||||
VMSTATE_INT8_V(tx.tso_props.tcp, E1000State, 3),
|
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
},
|
},
|
||||||
.subsections = (const VMStateDescription*[]) {
|
.subsections = (const VMStateDescription*[]) {
|
||||||
&vmstate_e1000_mit_state,
|
&vmstate_e1000_mit_state,
|
||||||
&vmstate_e1000_full_mac_state,
|
&vmstate_e1000_full_mac_state,
|
||||||
|
&vmstate_e1000_tx_tso_state,
|
||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1651,6 +1706,8 @@ static Property e1000_properties[] = {
|
||||||
compat_flags, E1000_FLAG_MIT_BIT, true),
|
compat_flags, E1000_FLAG_MIT_BIT, true),
|
||||||
DEFINE_PROP_BIT("extra_mac_registers", E1000State,
|
DEFINE_PROP_BIT("extra_mac_registers", E1000State,
|
||||||
compat_flags, E1000_FLAG_MAC_BIT, true),
|
compat_flags, E1000_FLAG_MAC_BIT, true),
|
||||||
|
DEFINE_PROP_BIT("migrate_tso_props", E1000State,
|
||||||
|
compat_flags, E1000_FLAG_TSO_BIT, true),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
.driver = "vhost-user-blk-pci",\
|
.driver = "vhost-user-blk-pci",\
|
||||||
.property = "vectors",\
|
.property = "vectors",\
|
||||||
.value = "2",\
|
.value = "2",\
|
||||||
|
},{\
|
||||||
|
.driver = "e1000",\
|
||||||
|
.property = "migrate_tso_props",\
|
||||||
|
.value = "off",\
|
||||||
},
|
},
|
||||||
|
|
||||||
#define HW_COMPAT_2_10 \
|
#define HW_COMPAT_2_10 \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue