From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:38423) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlCED-0003PE-3M for qemu-devel@nongnu.org; Wed, 11 Jan 2012 23:25:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RlCEA-0007i7-VA for qemu-devel@nongnu.org; Wed, 11 Jan 2012 23:25:29 -0500 Received: from cantor2.suse.de ([195.135.220.15]:38305 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlCEA-0007ht-Hk for qemu-devel@nongnu.org; Wed, 11 Jan 2012 23:25:26 -0500 Message-ID: <4F0E604D.5030403@suse.de> Date: Thu, 12 Jan 2012 05:23:41 +0100 From: =?ISO-8859-15?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1324332111-29059-1-git-send-email-peter.maydell@linaro.org> In-Reply-To: <1324332111-29059-1-git-send-email-peter.maydell@linaro.org> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH] hw/lan9118: Add save/load support List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: qemu-devel@nongnu.org, patches@linaro.org Am 19.12.2011 23:01, schrieb Peter Maydell: > Implement save/load for the LAN9118. >=20 > Signed-off-by: Peter Maydell Reviewed-by: Andreas F=E4rber The type conversions are okay. The VMState fields look sane on a short look, didn't check for completeness though. Andreas > --- > Does anybody have a nicer solution to the "can't put an enum in a > VMStateDescription" problem? >=20 > hw/lan9118.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++---= -------- > 1 files changed, 103 insertions(+), 23 deletions(-) >=20 > diff --git a/hw/lan9118.c b/hw/lan9118.c > index 7e64c5d..6542a26 100644 > --- a/hw/lan9118.c > +++ b/hw/lan9118.c > @@ -136,17 +136,36 @@ enum tx_state { > }; > =20 > typedef struct { > - enum tx_state state; > + /* state is a tx_state but we can't put enums in VMStateDescriptio= ns. */ > + uint32_t state; > uint32_t cmd_a; > uint32_t cmd_b; > - int buffer_size; > - int offset; > - int pad; > - int fifo_used; > - int len; > + int32_t buffer_size; > + int32_t offset; > + int32_t pad; > + int32_t fifo_used; > + int32_t len; > uint8_t data[2048]; > } LAN9118Packet; > =20 > +static const VMStateDescription vmstate_lan9118_packet =3D { > + .name =3D "lan9118_packet", > + .version_id =3D 1, > + .minimum_version_id =3D 1, > + .fields =3D (VMStateField[]) { > + VMSTATE_UINT32(state, LAN9118Packet), > + VMSTATE_UINT32(cmd_a, LAN9118Packet), > + VMSTATE_UINT32(cmd_b, LAN9118Packet), > + VMSTATE_INT32(buffer_size, LAN9118Packet), > + VMSTATE_INT32(offset, LAN9118Packet), > + VMSTATE_INT32(pad, LAN9118Packet), > + VMSTATE_INT32(fifo_used, LAN9118Packet), > + VMSTATE_INT32(len, LAN9118Packet), > + VMSTATE_UINT8_ARRAY(data, LAN9118Packet, 2048), > + VMSTATE_END_OF_LIST() > + } > +}; > + > typedef struct { > SysBusDevice busdev; > NICState *nic; > @@ -186,34 +205,95 @@ typedef struct { > uint32_t phy_int; > uint32_t phy_int_mask; > =20 > - int eeprom_writable; > + int32_t eeprom_writable; > uint8_t eeprom[128]; > =20 > - int tx_fifo_size; > + int32_t tx_fifo_size; > LAN9118Packet *txp; > LAN9118Packet tx_packet; > =20 > - int tx_status_fifo_used; > - int tx_status_fifo_head; > + int32_t tx_status_fifo_used; > + int32_t tx_status_fifo_head; > uint32_t tx_status_fifo[512]; > =20 > - int rx_status_fifo_size; > - int rx_status_fifo_used; > - int rx_status_fifo_head; > + int32_t rx_status_fifo_size; > + int32_t rx_status_fifo_used; > + int32_t rx_status_fifo_head; > uint32_t rx_status_fifo[896]; > - int rx_fifo_size; > - int rx_fifo_used; > - int rx_fifo_head; > + int32_t rx_fifo_size; > + int32_t rx_fifo_used; > + int32_t rx_fifo_head; > uint32_t rx_fifo[3360]; > - int rx_packet_size_head; > - int rx_packet_size_tail; > - int rx_packet_size[1024]; > + int32_t rx_packet_size_head; > + int32_t rx_packet_size_tail; > + int32_t rx_packet_size[1024]; > =20 > - int rxp_offset; > - int rxp_size; > - int rxp_pad; > + int32_t rxp_offset; > + int32_t rxp_size; > + int32_t rxp_pad; > } lan9118_state; > =20 > +static const VMStateDescription vmstate_lan9118 =3D { > + .name =3D "lan9118", > + .version_id =3D 1, > + .minimum_version_id =3D 1, > + .fields =3D (VMStateField[]) { > + VMSTATE_PTIMER(timer, lan9118_state), > + VMSTATE_UINT32(irq_cfg, lan9118_state), > + VMSTATE_UINT32(int_sts, lan9118_state), > + VMSTATE_UINT32(int_en, lan9118_state), > + VMSTATE_UINT32(fifo_int, lan9118_state), > + VMSTATE_UINT32(rx_cfg, lan9118_state), > + VMSTATE_UINT32(tx_cfg, lan9118_state), > + VMSTATE_UINT32(hw_cfg, lan9118_state), > + VMSTATE_UINT32(pmt_ctrl, lan9118_state), > + VMSTATE_UINT32(gpio_cfg, lan9118_state), > + VMSTATE_UINT32(gpt_cfg, lan9118_state), > + VMSTATE_UINT32(word_swap, lan9118_state), > + VMSTATE_UINT32(free_timer_start, lan9118_state), > + VMSTATE_UINT32(mac_cmd, lan9118_state), > + VMSTATE_UINT32(mac_data, lan9118_state), > + VMSTATE_UINT32(afc_cfg, lan9118_state), > + VMSTATE_UINT32(e2p_cmd, lan9118_state), > + VMSTATE_UINT32(e2p_data, lan9118_state), > + VMSTATE_UINT32(mac_cr, lan9118_state), > + VMSTATE_UINT32(mac_hashh, lan9118_state), > + VMSTATE_UINT32(mac_hashl, lan9118_state), > + VMSTATE_UINT32(mac_mii_acc, lan9118_state), > + VMSTATE_UINT32(mac_mii_data, lan9118_state), > + VMSTATE_UINT32(mac_flow, lan9118_state), > + VMSTATE_UINT32(phy_status, lan9118_state), > + VMSTATE_UINT32(phy_control, lan9118_state), > + VMSTATE_UINT32(phy_advertise, lan9118_state), > + VMSTATE_UINT32(phy_int, lan9118_state), > + VMSTATE_UINT32(phy_int_mask, lan9118_state), > + VMSTATE_INT32(eeprom_writable, lan9118_state), > + VMSTATE_UINT8_ARRAY(eeprom, lan9118_state, 128), > + VMSTATE_INT32(tx_fifo_size, lan9118_state), > + /* txp always points at tx_packet so need not be saved */ > + VMSTATE_STRUCT(tx_packet, lan9118_state, 0, > + vmstate_lan9118_packet, LAN9118Packet), > + VMSTATE_INT32(tx_status_fifo_used, lan9118_state), > + VMSTATE_INT32(tx_status_fifo_head, lan9118_state), > + VMSTATE_UINT32_ARRAY(tx_status_fifo, lan9118_state, 512), > + VMSTATE_INT32(rx_status_fifo_size, lan9118_state), > + VMSTATE_INT32(rx_status_fifo_used, lan9118_state), > + VMSTATE_INT32(rx_status_fifo_head, lan9118_state), > + VMSTATE_UINT32_ARRAY(rx_status_fifo, lan9118_state, 896), > + VMSTATE_INT32(rx_fifo_size, lan9118_state), > + VMSTATE_INT32(rx_fifo_used, lan9118_state), > + VMSTATE_INT32(rx_fifo_head, lan9118_state), > + VMSTATE_UINT32_ARRAY(rx_fifo, lan9118_state, 3360), > + VMSTATE_INT32(rx_packet_size_head, lan9118_state), > + VMSTATE_INT32(rx_packet_size_tail, lan9118_state), > + VMSTATE_INT32_ARRAY(rx_packet_size, lan9118_state, 1024), > + VMSTATE_INT32(rxp_offset, lan9118_state), > + VMSTATE_INT32(rxp_size, lan9118_state), > + VMSTATE_INT32(rxp_pad, lan9118_state), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static void lan9118_update(lan9118_state *s) > { > int level; > @@ -1151,7 +1231,6 @@ static int lan9118_init1(SysBusDevice *dev) > ptimer_set_freq(s->timer, 10000); > ptimer_set_limit(s->timer, 0xffff, 1); > =20 > - /* ??? Save/restore. */ > return 0; > } > =20 > @@ -1160,6 +1239,7 @@ static SysBusDeviceInfo lan9118_info =3D { > .qdev.name =3D "lan9118", > .qdev.size =3D sizeof(lan9118_state), > .qdev.reset =3D lan9118_reset, > + .qdev.vmsd =3D &vmstate_lan9118, > .qdev.props =3D (Property[]) { > DEFINE_NIC_PROPERTIES(lan9118_state, conf), > DEFINE_PROP_END_OF_LIST(), --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=F6rffer; HRB 16746 AG N=FCrnbe= rg