Re: Re: [PATCH] PCI: endpoint: use correct "end of test" interrupt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/19/2017 09:25 PM, Bjorn Helgaas wrote:
> On Wed, Sep 06, 2017 at 02:55:24PM +0100, John Keeping wrote:
>> pci_epf_test_raise_irq() reads the interrupt to use for the response
>> from reg->command, but this has been cleared at the beginning of the
>> command handler so the value is always zero at this point.
>>
>> Instead, extract the interrupt index before handling the command and
>> then pass the requested interrupt into pci_epf_test_raise_irq().  This
>> allows us to remove the specific code to extract the interrupt for
>> COMMAND_RAISE_MSI_IRQ since it is now handled in common code.
>>
>> Signed-off-by: John Keeping <john@xxxxxxxxxxxx>
> 
> Applied with Kishon's ack to pci/endpoint for v4.15, thanks!

Hello PCI hackers!

I actually think that this patch should be applied to v4.14,
since it actually fixes a regression introduced by commit
3ecf3232c54c ("PCI: endpoint: Do not reset *command* inadvertently")
which is included in v4.14-rc1.

It would have been nice if this patch actually had a fixes-tag.

(I cannot do any read/write/copy tests if I include 3ecf3232c54c,
but if I include 3ecf3232c54c + this patch, all tests work again.)

Regards,
Niklas

> 
>> ---
>>  drivers/pci/endpoint/functions/pci-epf-test.c | 13 ++++++-------
>>  1 file changed, 6 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
>> index 4ddc6e8f9fe7..f9308c2f22e6 100644
>> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
>> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
>> @@ -251,9 +251,8 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test)
>>  	return ret;
>>  }
>>  
>> -static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test)
>> +static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test, u8 irq)
>>  {
>> -	u8 irq;
>>  	u8 msi_count;
>>  	struct pci_epf *epf = epf_test->epf;
>>  	struct pci_epc *epc = epf->epc;
>> @@ -262,7 +261,6 @@ static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test)
>>  
>>  	reg->status |= STATUS_IRQ_RAISED;
>>  	msi_count = pci_epc_get_msi(epc);
>> -	irq = (reg->command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
>>  	if (irq > msi_count || msi_count <= 0)
>>  		pci_epc_raise_irq(epc, PCI_EPC_IRQ_LEGACY, 0);
>>  	else
>> @@ -289,6 +287,8 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
>>  	reg->command = 0;
>>  	reg->status = 0;
>>  
>> +	irq = (command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
>> +
>>  	if (command & COMMAND_RAISE_LEGACY_IRQ) {
>>  		reg->status = STATUS_IRQ_RAISED;
>>  		pci_epc_raise_irq(epc, PCI_EPC_IRQ_LEGACY, 0);
>> @@ -301,7 +301,7 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
>>  			reg->status |= STATUS_WRITE_FAIL;
>>  		else
>>  			reg->status |= STATUS_WRITE_SUCCESS;
>> -		pci_epf_test_raise_irq(epf_test);
>> +		pci_epf_test_raise_irq(epf_test, irq);
>>  		goto reset_handler;
>>  	}
>>  
>> @@ -311,7 +311,7 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
>>  			reg->status |= STATUS_READ_SUCCESS;
>>  		else
>>  			reg->status |= STATUS_READ_FAIL;
>> -		pci_epf_test_raise_irq(epf_test);
>> +		pci_epf_test_raise_irq(epf_test, irq);
>>  		goto reset_handler;
>>  	}
>>  
>> @@ -321,13 +321,12 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
>>  			reg->status |= STATUS_COPY_SUCCESS;
>>  		else
>>  			reg->status |= STATUS_COPY_FAIL;
>> -		pci_epf_test_raise_irq(epf_test);
>> +		pci_epf_test_raise_irq(epf_test, irq);
>>  		goto reset_handler;
>>  	}
>>  
>>  	if (command & COMMAND_RAISE_MSI_IRQ) {
>>  		msi_count = pci_epc_get_msi(epc);
>> -		irq = (command & MSI_NUMBER_MASK) >> MSI_NUMBER_SHIFT;
>>  		if (irq > msi_count || msi_count <= 0)
>>  			goto reset_handler;
>>  		reg->status = STATUS_IRQ_RAISED;
>> -- 
>> 2.14.1
>>



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux