DPDK patches and discussions
 help / color / mirror / Atom feed
From: Helin Zhang <helin.zhang@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v4 18/29] i40e/base: add functions to blink led
Date: Sun,  6 Mar 2016 23:41:48 +0800	[thread overview]
Message-ID: <1457278919-30800-19-git-send-email-helin.zhang@intel.com> (raw)
In-Reply-To: <1457278919-30800-1-git-send-email-helin.zhang@intel.com>

This patch adds functions to blink led on devices using a new
PHY since MAC registers used in other designs do not work in
this device configuration.

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
---
 drivers/net/i40e/base/i40e_common.c    | 329 +++++++++++++++++++++++++++++++++
 drivers/net/i40e/base/i40e_prototype.h |  13 ++
 drivers/net/i40e/base/i40e_type.h      |  16 ++
 3 files changed, 358 insertions(+)

v4:
 - Reworded the commit logs.

diff --git a/drivers/net/i40e/base/i40e_common.c b/drivers/net/i40e/base/i40e_common.c
index c800fd8..2383153 100644
--- a/drivers/net/i40e/base/i40e_common.c
+++ b/drivers/net/i40e/base/i40e_common.c
@@ -5969,6 +5969,335 @@ enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
 
 	return status;
 }
+
+/**
+ * i40e_read_phy_register
+ * @hw: pointer to the HW structure
+ * @page: registers page number
+ * @reg: register address in the page
+ * @phy_adr: PHY address on MDIO interface
+ * @value: PHY register value
+ *
+ * Reads specified PHY register value
+ **/
+enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
+					     u8 page, u16 reg, u8 phy_addr,
+					     u16 *value)
+{
+	enum i40e_status_code status = I40E_ERR_TIMEOUT;
+	u32 command  = 0;
+	u16 retry = 1000;
+	u8 port_num = (u8)hw->func_caps.mdio_port_num;
+
+	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
+		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
+		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
+		  (I40E_MDIO_OPCODE_ADDRESS) |
+		  (I40E_MDIO_STCODE) |
+		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
+		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
+	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
+	do {
+		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
+		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
+			status = I40E_SUCCESS;
+			break;
+		}
+		i40e_usec_delay(10);
+		retry--;
+	} while (retry);
+
+	if (status) {
+		i40e_debug(hw, I40E_DEBUG_PHY,
+			   "PHY: Can't write command to external PHY.\n");
+		goto phy_read_end;
+	}
+
+	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
+		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
+		  (I40E_MDIO_OPCODE_READ) |
+		  (I40E_MDIO_STCODE) |
+		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
+		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
+	status = I40E_ERR_TIMEOUT;
+	retry = 1000;
+	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
+	do {
+		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
+		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
+			status = I40E_SUCCESS;
+			break;
+		}
+		i40e_usec_delay(10);
+		retry--;
+	} while (retry);
+
+	if (!status) {
+		command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
+		*value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
+			 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
+	} else {
+		i40e_debug(hw, I40E_DEBUG_PHY,
+			   "PHY: Can't read register value from external PHY.\n");
+	}
+
+phy_read_end:
+	return status;
+}
+
+/**
+ * i40e_write_phy_register
+ * @hw: pointer to the HW structure
+ * @page: registers page number
+ * @reg: register address in the page
+ * @phy_adr: PHY address on MDIO interface
+ * @value: PHY register value
+ *
+ * Writes value to specified PHY register
+ **/
+enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
+					      u8 page, u16 reg, u8 phy_addr,
+					      u16 value)
+{
+	enum i40e_status_code status = I40E_ERR_TIMEOUT;
+	u32 command  = 0;
+	u16 retry = 1000;
+	u8 port_num = (u8)hw->func_caps.mdio_port_num;
+
+	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
+		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
+		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
+		  (I40E_MDIO_OPCODE_ADDRESS) |
+		  (I40E_MDIO_STCODE) |
+		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
+		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
+	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
+	do {
+		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
+		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
+			status = I40E_SUCCESS;
+			break;
+		}
+		i40e_usec_delay(10);
+		retry--;
+	} while (retry);
+	if (status) {
+		i40e_debug(hw, I40E_DEBUG_PHY,
+			   "PHY: Can't write command to external PHY.\n");
+		goto phy_write_end;
+	}
+
+	command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
+	wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
+
+	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
+		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
+		  (I40E_MDIO_OPCODE_WRITE) |
+		  (I40E_MDIO_STCODE) |
+		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
+		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
+	status = I40E_ERR_TIMEOUT;
+	retry = 1000;
+	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
+	do {
+		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
+		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
+			status = I40E_SUCCESS;
+			break;
+		}
+		i40e_usec_delay(10);
+		retry--;
+	} while (retry);
+
+phy_write_end:
+	return status;
+}
+
+/**
+ * i40e_get_phy_address
+ * @hw: pointer to the HW structure
+ * @dev_num: PHY port num that address we want
+ * @phy_addr: Returned PHY address
+ *
+ * Gets PHY address for current port
+ **/
+u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
+{
+	u8 port_num = (u8)hw->func_caps.mdio_port_num;
+	u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
+
+	return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
+}
+
+/**
+ * i40e_blink_phy_led
+ * @hw: pointer to the HW structure
+ * @time: time how long led will blinks in secs
+ * @interval: gap between LED on and off in msecs
+ *
+ * Blinks PHY link LED
+ **/
+enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
+					      u32 time, u32 interval)
+{
+	enum i40e_status_code status = I40E_SUCCESS;
+	u32 i;
+	u16 led_ctl = 0;
+	u16 gpio_led_port;
+	u16 led_reg;
+	u16 led_addr = I40E_PHY_LED_PROV_REG_1;
+	u8 phy_addr = 0;
+	u8 port_num;
+
+	i = rd32(hw, I40E_PFGEN_PORTNUM);
+	port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
+	phy_addr = i40e_get_phy_address(hw, port_num);
+
+	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
+	     led_addr++) {
+		status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
+						led_addr, phy_addr, &led_reg);
+		if (status)
+			goto phy_blinking_end;
+		led_ctl = led_reg;
+		if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
+			led_reg = 0;
+			status = i40e_write_phy_register(hw,
+							 I40E_PHY_COM_REG_PAGE,
+							 led_addr, phy_addr,
+							 led_reg);
+			if (status)
+				goto phy_blinking_end;
+			break;
+		}
+	}
+
+	if (time > 0 && interval > 0) {
+		for (i = 0; i < time * 1000; i += interval) {
+			status = i40e_read_phy_register(hw,
+							I40E_PHY_COM_REG_PAGE,
+							led_addr, phy_addr,
+							&led_reg);
+			if (status)
+				goto restore_config;
+			if (led_reg & I40E_PHY_LED_MANUAL_ON)
+				led_reg = 0;
+			else
+				led_reg = I40E_PHY_LED_MANUAL_ON;
+			status = i40e_write_phy_register(hw,
+							 I40E_PHY_COM_REG_PAGE,
+							 led_addr, phy_addr,
+							 led_reg);
+			if (status)
+				goto restore_config;
+			i40e_msec_delay(interval);
+		}
+	}
+
+restore_config:
+	status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
+					 phy_addr, led_ctl);
+
+phy_blinking_end:
+	return status;
+}
+
+/**
+ * i40e_led_get_phy - return current on/off mode
+ * @hw: pointer to the hw struct
+ * @led_addr: address of led register to use
+ * @val: original value of register to use
+ *
+ **/
+enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
+				       u16 *val)
+{
+	enum i40e_status_code status = I40E_SUCCESS;
+	u16 gpio_led_port;
+	u8 phy_addr = 0;
+	u16 reg_val;
+	u16 temp_addr;
+	u8 port_num;
+	u32 i;
+
+	temp_addr = I40E_PHY_LED_PROV_REG_1;
+	i = rd32(hw, I40E_PFGEN_PORTNUM);
+	port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
+	phy_addr = i40e_get_phy_address(hw, port_num);
+
+	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
+	     temp_addr++) {
+		status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
+						temp_addr, phy_addr, &reg_val);
+		if (status)
+			return status;
+		*val = reg_val;
+		if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
+			*led_addr = temp_addr;
+			break;
+		}
+	}
+	return status;
+}
+
+/**
+ * i40e_led_set_phy
+ * @hw: pointer to the HW structure
+ * @on: true or false
+ * @mode: original val plus bit for set or ignore
+ * Set led's on or off when controlled by the PHY
+ *
+ **/
+enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
+				       u16 led_addr, u32 mode)
+{
+	enum i40e_status_code status = I40E_SUCCESS;
+	u16 led_ctl = 0;
+	u16 led_reg = 0;
+	u8 phy_addr = 0;
+	u8 port_num;
+	u32 i;
+
+	i = rd32(hw, I40E_PFGEN_PORTNUM);
+	port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
+	phy_addr = i40e_get_phy_address(hw, port_num);
+
+	status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
+					phy_addr, &led_reg);
+	if (status)
+		return status;
+	led_ctl = led_reg;
+	if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
+		led_reg = 0;
+		status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
+						 led_addr, phy_addr, led_reg);
+		if (status)
+			return status;
+	}
+	status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
+					led_addr, phy_addr, &led_reg);
+	if (status)
+		goto restore_config;
+	if (on)
+		led_reg = I40E_PHY_LED_MANUAL_ON;
+	else
+		led_reg = 0;
+	status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
+					 led_addr, phy_addr, led_reg);
+	if (status)
+		goto restore_config;
+	if (mode & I40E_PHY_LED_MODE_ORIG) {
+		led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
+		status = i40e_write_phy_register(hw,
+						 I40E_PHY_COM_REG_PAGE,
+						 led_addr, phy_addr, led_ctl);
+	}
+	return status;
+restore_config:
+	status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
+					 phy_addr, led_ctl);
+	return status;
+}
 #endif /* PF_DRIVER */
 #ifdef VF_DRIVER
 
diff --git a/drivers/net/i40e/base/i40e_prototype.h b/drivers/net/i40e/base/i40e_prototype.h
index cbe9961..e0a409f 100644
--- a/drivers/net/i40e/base/i40e_prototype.h
+++ b/drivers/net/i40e/base/i40e_prototype.h
@@ -99,6 +99,12 @@ const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err);
 
 u32 i40e_led_get(struct i40e_hw *hw);
 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink);
+enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
+				       u16 led_addr, u32 mode);
+enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
+				       u16 *val);
+enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
+					      u32 time, u32 interval);
 
 /* admin send queue commands */
 
@@ -527,4 +533,11 @@ enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
 			u16 *wake_reason,
 			struct i40e_asq_cmd_details *cmd_details);
 #endif
+enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw, u8 page,
+					     u16 reg, u8 phy_addr, u16 *value);
+enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw, u8 page,
+					      u16 reg, u8 phy_addr, u16 value);
+u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num);
+enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
+					      u32 time, u32 interval);
 #endif /* _I40E_PROTOTYPE_H_ */
diff --git a/drivers/net/i40e/base/i40e_type.h b/drivers/net/i40e/base/i40e_type.h
index f566e30..61ee166 100644
--- a/drivers/net/i40e/base/i40e_type.h
+++ b/drivers/net/i40e/base/i40e_type.h
@@ -157,6 +157,22 @@ enum i40e_debug_mask {
 #define I40E_PCI_LINK_SPEED_5000	0x2
 #define I40E_PCI_LINK_SPEED_8000	0x3
 
+#define I40E_MDIO_STCODE		0
+#define I40E_MDIO_OPCODE_ADDRESS	0
+#define I40E_MDIO_OPCODE_WRITE		I40E_MASK(1, \
+						  I40E_GLGEN_MSCA_OPCODE_SHIFT)
+#define I40E_MDIO_OPCODE_READ_INC_ADDR	I40E_MASK(2, \
+						  I40E_GLGEN_MSCA_OPCODE_SHIFT)
+#define I40E_MDIO_OPCODE_READ		I40E_MASK(3, \
+						  I40E_GLGEN_MSCA_OPCODE_SHIFT)
+
+#define I40E_PHY_COM_REG_PAGE			0x1E
+#define I40E_PHY_LED_LINK_MODE_MASK		0xF0
+#define I40E_PHY_LED_MANUAL_ON			0x100
+#define I40E_PHY_LED_PROV_REG_1			0xC430
+#define I40E_PHY_LED_MODE_MASK			0xFFFF
+#define I40E_PHY_LED_MODE_ORIG			0x80000000
+
 /* Memory types */
 enum i40e_memset_type {
 	I40E_NONDMA_MEM = 0,
-- 
2.5.0

  parent reply	other threads:[~2016-03-06 15:43 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1455776683-11790-1-git-send-email-helin.zhang@intel.com>
2016-02-18 14:34 ` [dpdk-dev] [PATCH v3 00/30] i40e base driver update Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 01/30] i40e/base: use explicit cast from u16 to u8 Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 02/30] i40e/base: acquire NVM, before issuing an AQ read nvm command Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 03/30] i40e/base: add hw flag for SRCTL access using AQ for X722 Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 04/30] i40e/base: add changes in nvm read to support X722 Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 05/30] i40e/base: limit DCB FW version checks to XL710/X710 devices Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 06/30] i40e/base: check for stopped admin queue Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 07/30] i40e/base: set aq count after memory allocation Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 08/30] i40e/base: clean event descriptor before use Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 09/30] i40e/base: add new device IDs and delete deprecated one Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 10/30] i40e/base: fix up recent proxy and wol bits for X722_SUPPORT Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 11/30] i40e/base: define function capabilities in only one place Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 12/30] i40e/base: fix for PHY NVM interaction problem Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 13/30] i40e/base: set shared bit for multicast filters Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 14/30] i40e/base: add APIs to Add/remove port mirroring rules Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 15/30] i40e/base: add VEB stat control and remove L2 cloud filter Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 16/30] i40e/base: implement the API function for aq_set_switch_config Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 17/30] i40e/base: add functions to blink led on Coppervale PHY Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 18/30] i40e/base: apply promisc mode to Tx Traffic Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 19/30] i40e/base: increase timeout when checking GLGEN_RSTAT_DEVSTATE bit Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 20/30] i40e/base: save off VSI resource count when updating VSI Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 21/30] i40e/base: coding style fixes Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 22/30] i40e/base: use FW to read/write rx control registers Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 23/30] i40e/base: expose some registers to program parser, FD and RSS logic Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 24/30] i40e/base: add a Virtchnl offload for RSS PCTYPE V2 Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 25/30] i40e/base: add AQ thermal sensor control struct Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 26/30] i40e/base: add/update structure and macro definitions Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 27/30] i40e: add base driver release info Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 28/30] i40e: add/remove new device IDs Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 29/30] i40e: use rx control function for rx control registers Helin Zhang
2016-02-18 14:34   ` [dpdk-dev] [PATCH v3 30/30] i40evf: use base driver defined interface Helin Zhang
2016-02-19  5:14   ` [dpdk-dev] [PATCH v3 00/30] i40e base driver update Wu, Jingjing
2016-03-03 20:36   ` Bruce Richardson
2016-03-06 15:41   ` [dpdk-dev] [PATCH v4 00/29] " Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 01/29] i40e/base: fix compilation warnings Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 02/29] i40e/base: acquire NVM ownership before reading it Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 03/29] i40e/base: add hw flag for X722 register access Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 04/29] i40e/base: add X722 support on nvm read Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 05/29] i40e/base: limit version check of DCB Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 06/29] i40e/base: fix missing check for stopped admin queue Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 07/29] i40e/base: set aq count after memory allocation Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 08/29] i40e/base: fix uncertain event descriptor issue Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 09/29] i40e: update device id Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 10/29] i40e/base: fix up recent wol bits for X722_SUPPORT Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 11/29] i40e/base: fix up recent proxy " Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 12/29] i40e/base: unify the capability function Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 13/29] i40e/base: fix for PHY NVM interaction problem Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 14/29] i40e/base: set shared bit for multicast filters Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 15/29] i40e/base: support operating port mirroring rules Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 16/29] i40e: add VEB stat control Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 17/29] i40e/base: implement new API function Helin Zhang
2016-03-06 15:41     ` Helin Zhang [this message]
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 19/29] i40e/base: apply promisc mode to Tx Traffic Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 20/29] i40e/base: fix driver load failure Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 21/29] i40e/base: save off VSI resource count Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 22/29] i40e/base: coding style fixes Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 23/29] i40e: use AQ rx control register read/write Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 24/29] i40e: expose some registers Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 25/29] i40e/base: add a new Virtchnl offload Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 26/29] i40e/base: add AQ thermal sensor control struct Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 27/29] i40e: update structure and macro definitions Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 28/29] i40e: add base driver release info Helin Zhang
2016-03-06 15:41     ` [dpdk-dev] [PATCH v4 29/29] i40evf: use base driver defined interface Helin Zhang
2016-03-08  8:14     ` [dpdk-dev] [PATCH v5 00/29] i40e base driver update Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 01/29] i40e/base: fix compilation warnings Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 02/29] i40e/base: acquire NVM ownership before reading it Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 03/29] i40e/base: add hw flag for X722 register access Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 04/29] i40e/base: add X722 support on nvm read Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 05/29] i40e/base: limit version check of DCB Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 06/29] i40e/base: fix missing check for stopped admin queue Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 07/29] i40e/base: set aq count after memory allocation Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 08/29] i40e/base: fix uncertain event descriptor issue Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 09/29] i40e: update device id Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 10/29] i40e/base: fix up recent wol bits for X722_SUPPORT Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 11/29] i40e/base: fix up recent proxy " Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 12/29] i40e/base: unify the capability function Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 13/29] i40e/base: fix for PHY NVM interaction problem Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 14/29] i40e/base: set shared bit for multicast filters Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 15/29] i40e/base: support operating port mirroring rules Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 16/29] i40e: add VEB stat control Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 17/29] i40e/base: implement new API function Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 18/29] i40e/base: add functions to blink led Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 19/29] i40e/base: apply promisc mode to Tx Traffic Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 20/29] i40e/base: fix driver load failure Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 21/29] i40e/base: save off VSI resource count Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 22/29] i40e/base: coding style fixes Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 23/29] i40e: use AQ rx control register read/write Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 24/29] i40e: expose some registers Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 25/29] i40e/base: add a new Virtchnl offload Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 26/29] i40e/base: add AQ thermal sensor control struct Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 27/29] i40e: update structure and macro definitions Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 28/29] i40e: add base driver release info Helin Zhang
2016-03-08  8:14       ` [dpdk-dev] [PATCH v5 29/29] i40evf: use base driver defined interface Helin Zhang
2016-03-08  9:55       ` [dpdk-dev] [PATCH v5 00/29] i40e base driver update Remy Horton
2016-03-08 12:52         ` Bruce Richardson

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=1457278919-30800-19-git-send-email-helin.zhang@intel.com \
    --to=helin.zhang@intel.com \
    --cc=dev@dpdk.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).