On 3/20/26 12:16, Niklas Cassel wrote:
On Fri, Mar 20, 2026 at 10:35:20AM +0100, Christian Bruel wrote:
Hello,


diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
index 
55e128ed82f00ae13b6fe9768cdbe56adbe8f9da..34ba06fb53f04e48c1c05f4aae85e6ecd03ef447
 100644
--- a/drivers/misc/pci_endpoint_test.c
+++ b/drivers/misc/pci_endpoint_test.c
@@ -61,6 +61,7 @@
   #define STATUS_BAR_SUBRANGE_SETUP_FAIL               BIT(15)
   #define STATUS_BAR_SUBRANGE_CLEAR_SUCCESS    BIT(16)
   #define STATUS_BAR_SUBRANGE_CLEAR_FAIL               BIT(17)
+#define STATUS_BAR_SUBRANGE_SETUP_NOSPC                BIT(18)
   #define PCI_ENDPOINT_TEST_LOWER_SRC_ADDR     0x0c
   #define PCI_ENDPOINT_TEST_UPPER_SRC_ADDR     0x10
@@ -476,8 +477,11 @@ static int pci_endpoint_test_bar_subrange_cmd(struct 
pci_endpoint_test *test,
                return -ETIMEDOUT;
        status = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
-       if (status & fail_bit)
+       if (status & fail_bit) {
+               if (status & STATUS_BAR_SUBRANGE_SETUP_NOSPC)
+                       return -ENOSPC;

Perhaps this should be something like:

if (command == COMMAND_BAR_SUBRANGE_SETUP && status & 
STATUS_BAR_SUBRANGE_SETUP_SKIP)

I'm not sure about replacing STATUS_BAR_SUBRANGE_SETUP_NOSPC by
STATUS_BAR_SUBRANGE_SETUP_SKIP

The selftest will use if (ret == -ENOSPC), so we need to return this
information (bellow). and semantically SKIP does not imply ENOPSC (instead
of the contrary)

as you prefer,

FWIW, I think an even better solution is to introduce a new register,
named e.g. errno in struct pci_epf_test_reg;

That way, we don't need to take a new bit, e.g.:
+#define STATUS_BAR_SUBRANGE_SETUP_NOSPC          BIT(18)

For every unique error code a command can return.

We would simply return STATUS_BAR_SUBRANGE_CLEAR_FAIL, and then the host
side driver looks at the errno register to see the specific error code.

This way, all other _FAIL commands could also return a more specific error
in case of failure.



To minimize changes, what about something like:

  unsigned int fail_bit = status & fail_bits;

  if (fail_bit == STATUS_BAR_SUBRANGE_SETUP_NOSPC)
    return -ENOSPC;

  if (fail_bit == STATUS_BAR_SUBRANGE_SETUP_FAIL)
    return -EIO;

called with

        pci_endpoint_test_bar_subrange_cmd(...,
        STATUS_BAR_SUBRANGE_SETUP_FAIL | STATUS_BAR_SUBRANGE_SETUP_NOSPC);

replacing the fail_bit parameter with fail_bits.

Sounds okay to me, but I think the idea of adding an errno register is
more extensible.


But it is not consistent with other tests that use the status field to carry error information. For example, pci_epf_test_read/write/copy, set the STATUS_SRC/DTS_ADDR_INVALID bit to distinguish these errors from other -EINVAL.

Introducing a new errno field would result in having two different APIs for returning failure status.

In light of the STATUS_SRC/DST_ADDR_INVALID usage, I wonder if my initial proposal to set a status bit along with the FAIL bit might actually be simpler and more consistent what is already done here.

thank you,

Christian


Kind regards,
Niklas


Reply via email to