[PATCH v4 17/20] net/txgbe: fix get module info operation

Stephen Hemminger stephen at networkplumber.org
Mon May 18 01:53:07 CEST 2026


On Mon, 11 May 2026 18:35:59 +0800
Zaiyu Wang <zaiyuwang at trustnetic.com> wrote:

> The original I2C access flow in the module information retrieval
> process was flawed. Correct the implementation to properly fetch
> module info.
> 
> Fixes: abf042d32b39 ("net/txgbe: add Amber-Lite 25G/40G NICs")
> Cc: stable at dpdk.org
> 
> Signed-off-by: Zaiyu Wang <zaiyuwang at trustnetic.com>
> ---

More errors spotted in AI review


=== Patch 17/20 ===

# DPDK Patch Review: net/txgbe: fix get module info operation

## Summary
This patch refactors the module information retrieval code for the txgbe driver. The changes add proper identifier detection for different SFP/QSFP module types and improve the I2C access flow.

---

## ERRORS

### 1. Resource leak on error path after lock acquisition
**File:** `drivers/net/txgbe/txgbe_ethdev.c`  
**Location:** Lines 5368-5382

The code acquires a software semaphore (`TXGBE_MNGSEM_SWPHY`) at line 5368 but returns directly with `-EIO` at line 5382 without releasing the lock.

```c
status = hw->mac.acquire_swfw_sync(hw, TXGBE_MNGSEM_SWPHY);
if (status)
	return -EBUSY;

if (hw->mac.type == txgbe_mac_aml40) {
	status = hw->phy.read_i2c_sff8636(hw, 0,
					  TXGBE_SFF_IDENTIFIER,
					  &identifier);
} else {
	status = hw->phy.read_i2c_eeprom(hw,
					 TXGBE_SFF_IDENTIFIER,
					 &identifier);
}

if (status != 0)
	goto ERROR_IO;  /* GOOD - releases lock */
```

However, the early returns at lines 5358-5365 before the lock is acquired would bypass the lock entirely if the pre-checks fail. While these don't leak the lock, they create an inconsistent state-checking flow.

**Suggested fix:** Move the presence checks after the lock acquisition to ensure consistent locking semantics:

```c
status = hw->mac.acquire_swfw_sync(hw, TXGBE_MNGSEM_SWPHY);
if (status)
	return -EBUSY;

/* Check module presence after acquiring lock */
if (hw->mac.type == txgbe_mac_aml40) {
	value = rd32(hw, TXGBE_GPIOEXT);
	if (value & TXGBE_SFP1_MOD_PRST_LS) {
		status = -EIO;
		goto ERROR_IO;
	}
}

if (hw->mac.type == txgbe_mac_aml) {
	value = rd32(hw, TXGBE_GPIOEXT);
	if (value & TXGBE_SFP1_MOD_ABS_LS) {
		status = -EIO;
		goto ERROR_IO;
	}
}
```

---

## WARNINGS

### 1. Implicit comparison with zero
**File:** `drivers/net/txgbe/txgbe_ethdev.c`  
**Location:** Multiple occurrences (lines 5383, 5389, 5399, 5424)

The code uses `if (status != 0)` consistently, which is correct. However, there is one instance that needs verification:

```c
if (status)
	return -EBUSY;
```

**Suggested fix:** For consistency with the rest of the function:
```c
if (status != 0)
	return -EBUSY;
```

### 2. Mixed type usage: `u8` vs `uint8_t`
**File:** `drivers/net/txgbe/txgbe_ethdev.c`  
**Location:** Lines 5350-5351, others use `uint8_t`

```c
u8 identifier = 0;
u8 sff8636_rev = 0;
```

While `u32 value;` appears at line 5353, the rest of the function uses `uint8_t` and `uint32_t`. DPDK coding standards prefer explicit-width types with the `_t` suffix.

**Suggested fix:**
```c
uint8_t identifier = 0;
uint8_t sff8636_rev = 0;
uint32_t value;
```

### 3. Unnecessary variable initialization
**File:** `drivers/net/txgbe/txgbe_ethdev.c`  
**Location:** Lines 5350-5351

```c
u8 identifier = 0;
u8 sff8636_rev = 0;
```

Both variables are assigned before use via the `read_i2c_*` functions. Initializing to 0 defeats uninitialized-variable warnings.

**Suggested fix:**
```c
uint8_t identifier;
uint8_t sff8636_rev;
```

### 4. Release notes required
This patch fixes a bug (I2C access flow) and should be documented in the current release notes under "Fixed Issues" for the txgbe driver, per the contribution guidelines for bug fixes.

---

## INFO

### 1. Code organization improvement
The new code structure with a switch statement based on `identifier` is clearer than the original logic. This is a good refactoring that makes the code easier to maintain.

### 2. Error message clarity
The error messages "I2C IO ERROR" and "SFF Module Type not recognized" are informative. Consider whether these should include additional context (e.g., the identifier value for unrecognized types) to aid debugging.

---

## POSITIVE OBSERVATIONS

1. **Proper lock cleanup:** The `ERROR_IO` label correctly releases the semaphore before returning, which is the right pattern for error handling with acquired resources.

2. **Consistent error propagation:** The function properly returns `-EIO`, `-EINVAL`, and `-EBUSY` based on the failure type.

3. **Cc: stable at dpdk.org included:** Appropriate for a bug fix that should be backported.

---

## SUMMARY OF REQUIRED CHANGES

**Must fix (Errors):**
1. Move module presence checks after lock acquisition to ensure lock is held during all hardware access and properly released on all error paths

**Should fix (Warnings):**
1. Use explicit comparison `status != 0` instead of implicit `if (status)`
2. Use `uint8_t` and `uint32_t` instead of `u8` and `u32`
3. Remove unnecessary initialization of `identifier` and `sff8636_rev`
4. Add release notes entry for this bug fix

============================================================



More information about the stable mailing list