From: Jason Wang <jasowang@redhat.com>
To: qemu-devel@nongnu.org, peter.maydell@linaro.org
Cc: "Akihiko Odaki" <akihiko.odaki@daynix.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Jason Wang" <jasowang@redhat.com>
Subject: [PULL 08/51] e1000: Use more constant definitions
Date: Tue, 7 Mar 2023 15:07:33 +0800 [thread overview]
Message-ID: <20230307070816.34833-9-jasowang@redhat.com> (raw)
In-Reply-To: <20230307070816.34833-1-jasowang@redhat.com>
From: Akihiko Odaki <akihiko.odaki@daynix.com>
The definitions for E1000_VFTA_ENTRY_SHIFT, E1000_VFTA_ENTRY_MASK, and
E1000_VFTA_ENTRY_BIT_SHIFT_MASK were copied from:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/net/ethernet/intel/e1000/e1000_hw.h?h=v6.0.9#n306
The definitions for E1000_NUM_UNICAST, E1000_MC_TBL_SIZE, and
E1000_VLAN_FILTER_TBL_SIZE were copied from:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/net/ethernet/intel/e1000/e1000_hw.h?h=v6.0.9#n707
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
hw/net/e1000.c | 50 ++++++++++++++++++++++++++++----------------------
hw/net/e1000_regs.h | 9 +++++++++
hw/net/e1000x_common.c | 5 +++--
hw/net/e1000x_common.h | 2 +-
4 files changed, 41 insertions(+), 25 deletions(-)
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 0925a99..d9d048f 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -43,8 +43,6 @@
#include "trace.h"
#include "qom/object.h"
-static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-
/* #define E1000_DEBUG */
#ifdef E1000_DEBUG
@@ -67,9 +65,8 @@ static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
#define IOPORT_SIZE 0x40
#define PNPMMIO_SIZE 0x20000
-#define MIN_BUF_SIZE 60 /* Min. octets in an ethernet frame sans FCS */
-#define MAXIMUM_ETHERNET_HDR_LEN (14+4)
+#define MAXIMUM_ETHERNET_HDR_LEN (ETH_HLEN + 4)
/*
* HW models:
@@ -239,10 +236,16 @@ static const uint16_t phy_reg_init[] = {
[MII_PHYID1] = 0x141,
/* [MII_PHYID2] configured per DevId, from e1000_reset() */
- [MII_ANAR] = 0xde1,
- [MII_ANLPAR] = 0x1e0,
- [MII_CTRL1000] = 0x0e00,
- [MII_STAT1000] = 0x3c00,
+ [MII_ANAR] = MII_ANAR_CSMACD | MII_ANAR_10 |
+ MII_ANAR_10FD | MII_ANAR_TX |
+ MII_ANAR_TXFD | MII_ANAR_PAUSE |
+ MII_ANAR_PAUSE_ASYM,
+ [MII_ANLPAR] = MII_ANLPAR_10 | MII_ANLPAR_10FD |
+ MII_ANLPAR_TX | MII_ANLPAR_TXFD,
+ [MII_CTRL1000] = MII_CTRL1000_FULL | MII_CTRL1000_PORT |
+ MII_CTRL1000_MASTER,
+ [MII_STAT1000] = MII_STAT1000_HALF | MII_STAT1000_FULL |
+ MII_STAT1000_ROK | MII_STAT1000_LOK,
[M88E1000_PHY_SPEC_CTRL] = 0x360,
[M88E1000_PHY_SPEC_STATUS] = 0xac00,
[M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60,
@@ -548,9 +551,9 @@ putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
static inline void
inc_tx_bcast_or_mcast_count(E1000State *s, const unsigned char *arr)
{
- if (!memcmp(arr, bcast, sizeof bcast)) {
+ if (is_broadcast_ether_addr(arr)) {
e1000x_inc_reg_if_not_full(s->mac_reg, BPTC);
- } else if (arr[0] & 1) {
+ } else if (is_multicast_ether_addr(arr)) {
e1000x_inc_reg_if_not_full(s->mac_reg, MPTC);
}
}
@@ -804,14 +807,16 @@ static int
receive_filter(E1000State *s, const uint8_t *buf, int size)
{
uint32_t rctl = s->mac_reg[RCTL];
- int isbcast = !memcmp(buf, bcast, sizeof bcast), ismcast = (buf[0] & 1);
+ int isbcast = is_broadcast_ether_addr(buf);
+ int ismcast = is_multicast_ether_addr(buf);
if (e1000x_is_vlan_packet(buf, le16_to_cpu(s->mac_reg[VET])) &&
e1000x_vlan_rx_filter_enabled(s->mac_reg)) {
- uint16_t vid = lduw_be_p(buf + 14);
- uint32_t vfta = ldl_le_p((uint32_t *)(s->mac_reg + VFTA) +
- ((vid >> 5) & 0x7f));
- if ((vfta & (1 << (vid & 0x1f))) == 0) {
+ uint16_t vid = lduw_be_p(&PKT_GET_VLAN_HDR(buf)->h_tci);
+ uint32_t vfta =
+ ldl_le_p((uint32_t *)(s->mac_reg + VFTA) +
+ ((vid >> E1000_VFTA_ENTRY_SHIFT) & E1000_VFTA_ENTRY_MASK));
+ if ((vfta & (1 << (vid & E1000_VFTA_ENTRY_BIT_SHIFT_MASK))) == 0) {
return 0;
}
}
@@ -909,7 +914,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
uint32_t rdh_start;
uint16_t vlan_special = 0;
uint8_t vlan_status = 0;
- uint8_t min_buf[MIN_BUF_SIZE];
+ uint8_t min_buf[ETH_ZLEN];
struct iovec min_iov;
uint8_t *filter_buf = iov->iov_base;
size_t size = iov_size(iov, iovcnt);
@@ -1204,8 +1209,8 @@ static const readops macreg_readops[] = {
[FFLT ... FFLT + 6] = &mac_readreg,
[RA ... RA + 31] = &mac_readreg,
[WUPM ... WUPM + 31] = &mac_readreg,
- [MTA ... MTA + 127] = &mac_readreg,
- [VFTA ... VFTA + 127] = &mac_readreg,
+ [MTA ... MTA + E1000_MC_TBL_SIZE - 1] = &mac_readreg,
+ [VFTA ... VFTA + E1000_VLAN_FILTER_TBL_SIZE - 1] = &mac_readreg,
[FFMT ... FFMT + 254] = &mac_readreg,
[FFVT ... FFVT + 254] = &mac_readreg,
[PBM ... PBM + 16383] = &mac_readreg,
@@ -1236,8 +1241,8 @@ static const writeops macreg_writeops[] = {
[FFLT ... FFLT + 6] = &set_11bit,
[RA ... RA + 31] = &mac_writereg,
[WUPM ... WUPM + 31] = &mac_writereg,
- [MTA ... MTA + 127] = &mac_writereg,
- [VFTA ... VFTA + 127] = &mac_writereg,
+ [MTA ... MTA + E1000_MC_TBL_SIZE - 1] = &mac_writereg,
+ [VFTA ... VFTA + E1000_VLAN_FILTER_TBL_SIZE - 1] = &mac_writereg,
[FFMT ... FFMT + 254] = &set_4bit, [FFVT ... FFVT + 254] = &mac_writereg,
[PBM ... PBM + 16383] = &mac_writereg,
};
@@ -1603,8 +1608,9 @@ static const VMStateDescription vmstate_e1000 = {
VMSTATE_UINT32(mac_reg[WUFC], E1000State),
VMSTATE_UINT32(mac_reg[VET], E1000State),
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, VFTA, 128),
+ VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, MTA, E1000_MC_TBL_SIZE),
+ VMSTATE_UINT32_SUB_ARRAY(mac_reg, E1000State, VFTA,
+ E1000_VLAN_FILTER_TBL_SIZE),
VMSTATE_END_OF_LIST()
},
.subsections = (const VMStateDescription*[]) {
diff --git a/hw/net/e1000_regs.h b/hw/net/e1000_regs.h
index 59d6eb3..3f6b5d0 100644
--- a/hw/net/e1000_regs.h
+++ b/hw/net/e1000_regs.h
@@ -1154,6 +1154,11 @@ struct e1000_data_desc {
} upper;
};
+/* Filters */
+#define E1000_NUM_UNICAST 16 /* Unicast filter entries */
+#define E1000_MC_TBL_SIZE 128 /* Multicast Filter Table (4096 bits) */
+#define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */
+
/* Management Control */
#define E1000_MANC_SMBUS_EN 0x00000001 /* SMBus Enabled - RO */
#define E1000_MANC_ASF_EN 0x00000002 /* ASF Enabled - RO */
@@ -1202,4 +1207,8 @@ struct e1000_data_desc {
#define E1000_IOADDR 0x00
#define E1000_IODATA 0x04
+#define E1000_VFTA_ENTRY_SHIFT 5
+#define E1000_VFTA_ENTRY_MASK 0x7F
+#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F
+
#endif /* HW_E1000_REGS_H */
diff --git a/hw/net/e1000x_common.c b/hw/net/e1000x_common.c
index e79d4c7..b3bbf31 100644
--- a/hw/net/e1000x_common.c
+++ b/hw/net/e1000x_common.c
@@ -26,6 +26,7 @@
#include "qemu/units.h"
#include "hw/net/mii.h"
#include "hw/pci/pci_device.h"
+#include "net/eth.h"
#include "net/net.h"
#include "e1000x_common.h"
@@ -48,7 +49,7 @@ bool e1000x_rx_ready(PCIDevice *d, uint32_t *mac)
bool e1000x_is_vlan_packet(const uint8_t *buf, uint16_t vet)
{
- uint16_t eth_proto = lduw_be_p(buf + 12);
+ uint16_t eth_proto = lduw_be_p(&PKT_GET_ETH_HDR(buf)->h_proto);
bool res = (eth_proto == vet);
trace_e1000x_vlan_is_vlan_pkt(res, eth_proto, vet);
@@ -67,7 +68,7 @@ bool e1000x_rx_group_filter(uint32_t *mac, const uint8_t *buf)
}
ra[0] = cpu_to_le32(rp[0]);
ra[1] = cpu_to_le32(rp[1]);
- if (!memcmp(buf, (uint8_t *)ra, 6)) {
+ if (!memcmp(buf, (uint8_t *)ra, ETH_ALEN)) {
trace_e1000x_rx_flt_ucast_match((int)(rp - mac - RA) / 2,
MAC_ARG(buf));
return true;
diff --git a/hw/net/e1000x_common.h b/hw/net/e1000x_common.h
index 3501e48..b991d81 100644
--- a/hw/net/e1000x_common.h
+++ b/hw/net/e1000x_common.h
@@ -102,7 +102,7 @@ enum {
static inline void
e1000x_inc_reg_if_not_full(uint32_t *mac, int index)
{
- if (mac[index] != 0xffffffff) {
+ if (mac[index] != UINT32_MAX) {
mac[index]++;
}
}
--
2.7.4
next prev parent reply other threads:[~2023-03-07 7:10 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-07 7:07 [PULL 00/51] Net patches Jason Wang
2023-03-07 7:07 ` [PULL 01/51] e1000e: Fix the code style Jason Wang
2023-03-07 7:07 ` [PULL 02/51] hw/net: Add more MII definitions Jason Wang
2023-03-07 7:07 ` [PULL 03/51] fsl_etsec: Use hw/net/mii.h Jason Wang
2023-03-07 7:07 ` [PULL 04/51] e1000: " Jason Wang
2023-03-07 7:07 ` [PULL 05/51] e1000: Mask registers when writing Jason Wang
2023-03-07 7:07 ` [PULL 06/51] e1000e: Introduce E1000E_LOW_BITS_SET_FUNC Jason Wang
2023-03-07 7:07 ` [PULL 07/51] e1000e: Mask registers when writing Jason Wang
2023-03-07 7:07 ` Jason Wang [this message]
2023-03-07 7:07 ` [PULL 09/51] e1000e: Use more constant definitions Jason Wang
2023-03-07 7:07 ` [PULL 10/51] e1000: Use memcpy to intialize registers Jason Wang
2023-03-07 7:07 ` [PULL 11/51] e1000e: " Jason Wang
2023-03-07 7:07 ` [PULL 12/51] e1000e: Remove pending interrupt flags Jason Wang
2023-03-07 7:07 ` [PULL 13/51] e1000e: Improve software reset Jason Wang
2023-03-07 7:07 ` [PULL 14/51] e1000: Configure ResettableClass Jason Wang
2023-03-07 7:07 ` [PULL 15/51] e1000e: " Jason Wang
2023-03-07 7:07 ` [PULL 16/51] e1000e: Introduce e1000_rx_desc_union Jason Wang
2023-03-07 7:07 ` [PULL 17/51] e1000e: Set MII_ANER_NWAY Jason Wang
2023-03-07 7:07 ` [PULL 18/51] e1000e: Remove extra pointer indirection Jason Wang
2023-03-07 7:07 ` [PULL 19/51] net: Check L4 header size Jason Wang
2023-03-07 7:07 ` [PULL 20/51] e1000x: Alter the signature of e1000x_is_vlan_packet Jason Wang
2023-03-07 7:07 ` [PULL 21/51] net: Strip virtio-net header when dumping Jason Wang
2023-03-07 7:07 ` [PULL 22/51] hw/net/net_tx_pkt: Automatically determine if virtio-net header is used Jason Wang
2023-03-07 7:07 ` [PULL 23/51] hw/net/net_rx_pkt: Remove net_rx_pkt_has_virt_hdr Jason Wang
2023-03-07 7:07 ` [PULL 24/51] e1000e: Perform software segmentation for loopback Jason Wang
2023-03-07 7:07 ` [PULL 25/51] hw/net/net_tx_pkt: Implement TCP segmentation Jason Wang
2023-03-07 7:07 ` [PULL 26/51] hw/net/net_tx_pkt: Check the payload length Jason Wang
2023-03-07 7:07 ` [PULL 27/51] e1000e: Do not assert when MSI-X is disabled later Jason Wang
2023-03-07 7:07 ` [PULL 28/51] MAINTAINERS: Add Akihiko Odaki as a e1000e reviewer Jason Wang
2023-03-07 7:07 ` [PULL 29/51] MAINTAINERS: Add e1000e test files Jason Wang
2023-03-07 7:07 ` [PULL 30/51] e1000e: Combine rx traces Jason Wang
2023-03-07 7:07 ` [PULL 31/51] e1000: Count CRC in Tx statistics Jason Wang
2023-03-07 7:07 ` [PULL 32/51] e1000e: " Jason Wang
2023-03-07 7:07 ` [PULL 33/51] net/eth: Report if headers are actually present Jason Wang
2023-03-07 7:07 ` [PULL 34/51] e1000e: Implement system clock Jason Wang
2023-03-07 7:08 ` [PULL 35/51] net/eth: Introduce EthL4HdrProto Jason Wang
2023-03-07 7:08 ` [PULL 36/51] pcie: Introduce pcie_sriov_num_vfs Jason Wang
2023-03-07 7:08 ` [PULL 37/51] e1000: Split header files Jason Wang
2023-03-07 7:08 ` [PULL 38/51] Intrdocue igb device emulation Jason Wang
2023-03-07 7:08 ` [PULL 39/51] tests/qtest/e1000e-test: Fabricate ethernet header Jason Wang
2023-03-07 7:08 ` [PULL 40/51] tests/qtest/libqos/e1000e: Export macreg functions Jason Wang
2023-03-07 7:08 ` [PULL 41/51] igb: Introduce qtest for igb device Jason Wang
2023-03-07 7:08 ` [PULL 42/51] tests/avocado: Add igb test Jason Wang
2023-03-07 7:08 ` [PULL 43/51] docs/system/devices/igb: Add igb documentation Jason Wang
2023-03-07 7:08 ` [PULL 44/51] ebpf: fix compatibility with libbpf 1.0+ Jason Wang
2023-03-07 7:08 ` [PULL 45/51] hw/net/eepro100: Abort if pci_add_capability() ever fail Jason Wang
2023-03-07 7:08 ` [PULL 46/51] hw/net/eepro100: Introduce TYPE_EEPRO100 QOM abstract parent Jason Wang
2023-03-07 7:08 ` [PULL 47/51] hw/net/eepro100: Convert reset handler to DeviceReset Jason Wang
2023-03-07 7:08 ` [PULL 48/51] hw/net/eepro100: Pass E100PCIDeviceInfo as class init data Jason Wang
2023-03-07 7:08 ` [PULL 49/51] hw/net/eepro100: Remove instance EEPRO100State::has_extended_tcb_support Jason Wang
2023-03-07 7:08 ` [PULL 50/51] hw/net/eepro100: Remove instance's EEPRO100State::device Jason Wang
2023-03-07 7:08 ` [PULL 51/51] hw/net/eepro100: Replace DO_UPCAST(EEPRO100State) by EEPRO100() Jason Wang
2023-03-07 17:01 ` [PULL 00/51] Net patches Peter Maydell
2023-03-07 20:43 ` Philippe Mathieu-Daudé
2023-03-08 6:56 ` Jason Wang
2023-03-08 7:40 ` Philippe Mathieu-Daudé
2023-03-08 12:17 ` Michael S. Tsirkin
2023-03-08 12:21 ` Philippe Mathieu-Daudé
2023-03-08 12:25 ` Michael S. Tsirkin
2023-03-09 1:13 ` Jason Wang
2023-03-08 6:57 ` Jason Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230307070816.34833-9-jasowang@redhat.com \
--to=jasowang@redhat.com \
--cc=akihiko.odaki@daynix.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.