From patchwork Mon Dec 2 07:12:18 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Crosthwaite X-Patchwork-Id: 295805 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 5AA132C007C for ; Mon, 2 Dec 2013 18:13:51 +1100 (EST) Received: from localhost ([::1]:34080 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VnNhU-0004lb-QD for incoming@patchwork.ozlabs.org; Mon, 02 Dec 2013 02:13:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54478) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VnNgg-00040x-Co for qemu-devel@nongnu.org; Mon, 02 Dec 2013 02:13:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VnNga-0006rK-6s for qemu-devel@nongnu.org; Mon, 02 Dec 2013 02:12:58 -0500 Received: from mail-pd0-f177.google.com ([209.85.192.177]:45367) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VnNgZ-0006rE-U9 for qemu-devel@nongnu.org; Mon, 02 Dec 2013 02:12:52 -0500 Received: by mail-pd0-f177.google.com with SMTP id q10so17244969pdj.8 for ; Sun, 01 Dec 2013 23:12:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=i9hWcCu9WCK0WJODZX1xjI9KOotb5dWa9aVT5uLRkJY=; b=MbTLYaqtlcomfQeErCao+5Z00r+PVx+uDRnCoSi0Foscf1HSufuTZ/6PteD85E+UsK NQT6Z7+BqQF0Tu+FlzPqGXRLm/1kz0hV74y9wAlX15hpWNRhlI7BKdIcR1dfDvRwgzaU VjUvs4IffNQXCczutB5ASFhzjwVeQ6Hn7l5ha7VSmI2uB8iNLE0SxCv/S4m+cHt4C2tI YFov4EflSKmKmaNvwkPVypJ/SOUk6bdtijx1YbrU6JSbhDfFiz33q40y17459Kvk/25w ciE2COPQGioYx5I2mCppnVXonvJzJb9lNEQ7NVpr7CVcXbxgjPPvGg6kBNkAaavB0cDR s6bg== X-Gm-Message-State: ALoCoQmoelK13dfw+UL9PVTZdy67LUzCdwvID/nk31JwpAy3WUOQtgcpqKiZbSKPBr+dFh2ihJhb X-Received: by 10.66.141.144 with SMTP id ro16mr27651930pab.131.1385968371041; Sun, 01 Dec 2013 23:12:51 -0800 (PST) Received: from localhost ([149.199.62.254]) by mx.google.com with ESMTPSA id bh6sm25657849pad.20.2013.12.01.23.12.49 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 01 Dec 2013 23:12:50 -0800 (PST) From: Peter Crosthwaite To: qemu-devel@nongnu.org Date: Sun, 1 Dec 2013 23:12:18 -0800 Message-Id: X-Mailer: git-send-email 1.8.4.4 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.192.177 Cc: deepika@xilinx.com, peter.maydell@linaro.org, edgar.iglesias@gmail.com Subject: [Qemu-devel] [PATCH arm-devs v1 06/13] net/cadence_gem: Implement RX descriptor match mode flags X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The various Rx packet address matching mode flags were not being set in the rx descriptor. Implement. Reported-by: Deepika Dhamija Signed-off-by: Peter Crosthwaite --- hw/net/cadence_gem.c | 80 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c index e5a6d87..4fbfb8d 100644 --- a/hw/net/cadence_gem.c +++ b/hw/net/cadence_gem.c @@ -222,8 +222,13 @@ #define PHY_REG_INT_ST_ENERGY 0x0010 /***********************************************************************/ -#define GEM_RX_REJECT 1 -#define GEM_RX_ACCEPT 0 +#define GEM_RX_REJECT (-1) +#define GEM_RX_PROM_ACCEPT (-2) +#define GEM_RX_BROADCAST_ACCEPT (-3) +#define GEM_RX_MULTICAST_HASH_ACCEPT (-4) +#define GEM_RX_UNICAST_HASH_ACCEPT (-5) + +#define GEM_RX_SAR_ACCEPT 0 /***********************************************************************/ @@ -236,6 +241,12 @@ #define DESC_0_RX_WRAP 0x00000002 #define DESC_0_RX_OWNERSHIP 0x00000001 +#define R_DESC_1_RX_SAR_SHIFT 25 +#define R_DESC_1_RX_SAR_LENGTH 2 +#define R_DESC_1_RX_UNICAST_HASH (1 << 29) +#define R_DESC_1_RX_MULTICAST_HASH (1 << 30) +#define R_DESC_1_RX_BROADCAST (1 << 31) + #define DESC_1_RX_SOF 0x00004000 #define DESC_1_RX_EOF 0x00008000 @@ -315,6 +326,27 @@ static inline void rx_desc_set_length(unsigned *desc, unsigned len) desc[1] |= len; } +static inline void rx_desc_set_broadcast(unsigned *desc) +{ + desc[1] |= R_DESC_1_RX_BROADCAST; +} + +static inline void rx_desc_set_unicast_hash(unsigned *desc) +{ + desc[1] |= R_DESC_1_RX_UNICAST_HASH; +} + +static inline void rx_desc_set_multicast_hash(unsigned *desc) +{ + desc[1] |= R_DESC_1_RX_MULTICAST_HASH; +} + +static inline void rx_desc_set_sar(unsigned *desc, int sar_idx) +{ + desc[1] = deposit32(desc[1], R_DESC_1_RX_SAR_SHIFT, R_DESC_1_RX_SAR_LENGTH, + sar_idx); +} + #define TYPE_CADENCE_GEM "cadence_gem" #define GEM(obj) OBJECT_CHECK(GemState, (obj), TYPE_CADENCE_GEM) @@ -527,9 +559,6 @@ static unsigned calc_mac_hash(const uint8_t *mac) /* * gem_mac_address_filter: * Accept or reject this destination address? - * Returns: - * GEM_RX_REJECT: reject - * GEM_RX_ACCEPT: accept */ static int gem_mac_address_filter(GemState *s, const uint8_t *packet) { @@ -538,7 +567,7 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet) /* Promiscuous mode? */ if (s->regs[GEM_NWCFG] & GEM_NWCFG_PROMISC) { - return GEM_RX_ACCEPT; + return GEM_RX_PROM_ACCEPT; } if (!memcmp(packet, broadcast_addr, 6)) { @@ -546,7 +575,7 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet) if (s->regs[GEM_NWCFG] & GEM_NWCFG_BCAST_REJ) { return GEM_RX_REJECT; } - return GEM_RX_ACCEPT; + return GEM_RX_BROADCAST_ACCEPT; } /* Accept packets -w- hash match? */ @@ -557,24 +586,24 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet) hash_index = calc_mac_hash(packet); if (hash_index < 32) { if (s->regs[GEM_HASHLO] & (1<regs[GEM_HASHHI] & (1<regs[GEM_SPADDR1LO]); - for (i = 0; i < 4; i++) { - if (!memcmp(packet, gem_spaddr, 6)) { - return GEM_RX_ACCEPT; + for (i = 3; i >= 0; i--) { + if (!memcmp(packet, gem_spaddr + 8 * i, 6)) { + return GEM_RX_SAR_ACCEPT + i; } - - gem_spaddr += 8; } /* No address match; reject the packet */ @@ -611,11 +640,13 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size) uint8_t rxbuf[2048]; uint8_t *rxbuf_ptr; bool first_desc = true; + int maf; s = qemu_get_nic_opaque(nc); /* Is this destination MAC address "for us" ? */ - if (gem_mac_address_filter(s, buf) == GEM_RX_REJECT) { + maf = gem_mac_address_filter(s, buf); + if (maf == GEM_RX_REJECT) { return -1; } @@ -714,6 +745,25 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size) rx_desc_set_length(s->rx_desc, size); } rx_desc_set_ownership(s->rx_desc); + + switch (maf) { + case GEM_RX_PROM_ACCEPT: + break; + case GEM_RX_BROADCAST_ACCEPT: + rx_desc_set_broadcast(s->rx_desc); + break; + case GEM_RX_UNICAST_HASH_ACCEPT: + rx_desc_set_unicast_hash(s->rx_desc); + break; + case GEM_RX_MULTICAST_HASH_ACCEPT: + rx_desc_set_multicast_hash(s->rx_desc); + break; + case GEM_RX_REJECT: + abort(); + default: /* SAR */ + rx_desc_set_sar(s->rx_desc, maf); + } + /* Descriptor write-back. */ cpu_physical_memory_write(s->rx_desc_addr, (uint8_t *)s->rx_desc, sizeof(s->rx_desc));