opencores_eth cleanups:

- use mii.h
 - reduce stack usage in open_eth_start_xmit.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJXQ1aMAAoJEFH5zJH4P6BEPC4QAJyJ8JTvqa6vwpw32AdI/lrb
 a64GN9S87ZbViyZMmkKwcY/hRoOaJW5knJLnr068laaDLba110BfDBLw+FP/wi54
 4GIy+IkCLJ9361KzUNXjUs/+33GPx7Gs0KjmbzVpuQhmXzA6xSIsl3P+d63bCrd5
 rjYQ7+apO8Y0scUFO2026WMLODAZS9ulyQYrxtBvbOvANVZy6An2+vIghh4PP7Fd
 syPQkR7UT9csnadXiJCff3VpuNY8tJR3+inEkSXE8Wt5EjLvi4Md+xklJ0cGkJOt
 aMQxbEXrYSmvvPNwWEQo3f6o6colwncxssP/emYa5rRojCeaD+D4ZseEwHXmn3fx
 u9x9NIXi8Ypslsn8pJZuo3zcQfg8kTQ6UXNB/KXyLZbFP7rIwO/50eDG3FizLtVo
 48F08raOb3dCiz+YchZ3ayY8+3FqepyMaJB1merm7b8LTliw96utqSEAQCaRqKNp
 SgI6SgQGadxo3xfe3ju9MfMq07qTy14Ejv8u3aei2USMT5j+wq79cP27rpo4Ky9M
 rIuXRARkVO5wQ7Z8pnxNSSEHuroVOkg/x+l+ri5j1UD0rYZjXjnYyoups6OZP0TS
 4j7CZYCmKRrgImGouMumkCxa/6bNd+HtTMFuGg8nY1pddbaUzR0GeyOJ4SGjs8lu
 KDlUSkHlGVscewS6tmNs
 =1xq3
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/xtensa/tags/20160523-opencores_eth' into staging

opencores_eth cleanups:
- use mii.h
- reduce stack usage in open_eth_start_xmit.

# gpg: Signature made Mon 23 May 2016 20:14:20 BST using RSA key ID F83FA044
# gpg: Good signature from "Max Filippov <max.filippov@cogentembedded.com>"
# gpg:                 aka "Max Filippov <jcmvbkbc@gmail.com>"

* remotes/xtensa/tags/20160523-opencores_eth:
  hw/net/opencores_eth: Allocating Large sized arrays to heap
  hw/net/opencores_eth: use mii.h

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2016-05-24 10:19:45 +01:00
commit 4c63a818de
1 changed files with 26 additions and 18 deletions

View File

@ -33,6 +33,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "hw/hw.h" #include "hw/hw.h"
#include "hw/net/mii.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "net/net.h" #include "net/net.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
@ -55,12 +56,6 @@
/* PHY MII registers */ /* PHY MII registers */
enum { enum {
MII_BMCR,
MII_BMSR,
MII_PHYIDR1,
MII_PHYIDR2,
MII_ANAR,
MII_ANLPAR,
MII_REG_MAX = 16, MII_REG_MAX = 16,
}; };
@ -72,10 +67,11 @@ typedef struct Mii {
static void mii_set_link(Mii *s, bool link_ok) static void mii_set_link(Mii *s, bool link_ok)
{ {
if (link_ok) { if (link_ok) {
s->regs[MII_BMSR] |= 0x4; s->regs[MII_BMSR] |= MII_BMSR_LINK_ST;
s->regs[MII_ANLPAR] |= 0x01e1; s->regs[MII_ANLPAR] |= MII_ANLPAR_TXFD | MII_ANLPAR_TX |
MII_ANLPAR_10FD | MII_ANLPAR_10 | MII_ANLPAR_CSMACD;
} else { } else {
s->regs[MII_BMSR] &= ~0x4; s->regs[MII_BMSR] &= ~MII_BMSR_LINK_ST;
s->regs[MII_ANLPAR] &= 0x01ff; s->regs[MII_ANLPAR] &= 0x01ff;
} }
s->link_ok = link_ok; s->link_ok = link_ok;
@ -84,11 +80,14 @@ static void mii_set_link(Mii *s, bool link_ok)
static void mii_reset(Mii *s) static void mii_reset(Mii *s)
{ {
memset(s->regs, 0, sizeof(s->regs)); memset(s->regs, 0, sizeof(s->regs));
s->regs[MII_BMCR] = 0x1000; s->regs[MII_BMCR] = MII_BMCR_AUTOEN;
s->regs[MII_BMSR] = 0x7868; /* no ext regs */ s->regs[MII_BMSR] = MII_BMSR_100TX_FD | MII_BMSR_100TX_HD |
s->regs[MII_PHYIDR1] = 0x2000; MII_BMSR_10T_FD | MII_BMSR_10T_HD | MII_BMSR_MFPS |
s->regs[MII_PHYIDR2] = 0x5c90; MII_BMSR_AN_COMP | MII_BMSR_AUTONEG;
s->regs[MII_ANAR] = 0x01e1; s->regs[MII_PHYID1] = 0x2000;
s->regs[MII_PHYID2] = 0x5c90;
s->regs[MII_ANAR] = MII_ANAR_TXFD | MII_ANAR_TX |
MII_ANAR_10FD | MII_ANAR_10 | MII_ANAR_CSMACD;
mii_set_link(s, s->link_ok); mii_set_link(s, s->link_ok);
} }
@ -98,7 +97,7 @@ static void mii_ro(Mii *s, uint16_t v)
static void mii_write_bmcr(Mii *s, uint16_t v) static void mii_write_bmcr(Mii *s, uint16_t v)
{ {
if (v & 0x8000) { if (v & MII_BMCR_RESET) {
mii_reset(s); mii_reset(s);
} else { } else {
s->regs[MII_BMCR] = v; s->regs[MII_BMCR] = v;
@ -110,8 +109,8 @@ static void mii_write_host(Mii *s, unsigned idx, uint16_t v)
static void (*reg_write[MII_REG_MAX])(Mii *s, uint16_t v) = { static void (*reg_write[MII_REG_MAX])(Mii *s, uint16_t v) = {
[MII_BMCR] = mii_write_bmcr, [MII_BMCR] = mii_write_bmcr,
[MII_BMSR] = mii_ro, [MII_BMSR] = mii_ro,
[MII_PHYIDR1] = mii_ro, [MII_PHYID1] = mii_ro,
[MII_PHYIDR2] = mii_ro, [MII_PHYID2] = mii_ro,
}; };
if (idx < MII_REG_MAX) { if (idx < MII_REG_MAX) {
@ -483,7 +482,8 @@ static NetClientInfo net_open_eth_info = {
static void open_eth_start_xmit(OpenEthState *s, desc *tx) static void open_eth_start_xmit(OpenEthState *s, desc *tx)
{ {
uint8_t buf[65536]; uint8_t *buf = NULL;
uint8_t buffer[0x600];
unsigned len = GET_FIELD(tx->len_flags, TXD_LEN); unsigned len = GET_FIELD(tx->len_flags, TXD_LEN);
unsigned tx_len = len; unsigned tx_len = len;
@ -498,6 +498,11 @@ static void open_eth_start_xmit(OpenEthState *s, desc *tx)
trace_open_eth_start_xmit(tx->buf_ptr, len, tx_len); trace_open_eth_start_xmit(tx->buf_ptr, len, tx_len);
if (tx_len > sizeof(buffer)) {
buf = g_new(uint8_t, tx_len);
} else {
buf = buffer;
}
if (len > tx_len) { if (len > tx_len) {
len = tx_len; len = tx_len;
} }
@ -506,6 +511,9 @@ static void open_eth_start_xmit(OpenEthState *s, desc *tx)
memset(buf + len, 0, tx_len - len); memset(buf + len, 0, tx_len - len);
} }
qemu_send_packet(qemu_get_queue(s->nic), buf, tx_len); qemu_send_packet(qemu_get_queue(s->nic), buf, tx_len);
if (tx_len > sizeof(buffer)) {
g_free(buf);
}
if (tx->len_flags & TXD_WR) { if (tx->len_flags & TXD_WR) {
s->tx_desc = 0; s->tx_desc = 0;