lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Thu, 19 Oct 2017 06:25:39 +0000
From:   Andy Duan <fugang.duan@....com>
To:     Troy Kisky <troy.kisky@...ndarydevices.com>,
        "shawn.guo@...aro.org" <shawn.guo@...aro.org>,
        "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
        "davem@...emloft.net" <davem@...emloft.net>
CC:     Fabio Estevam <fabio.estevam@....com>,
        "lznuaa@...il.com" <lznuaa@...il.com>,
        "andrew@...n.ch" <andrew@...n.ch>
Subject: RE: [PATCH net v2 2/2] net: fec: Let fec_ptp have its own interrupt
 routine

From: Troy Kisky <troy.kisky@...ndarydevices.com> Sent: Thursday, October 19, 2017 2:30 AM
>On 10/18/2017 11:10 AM, Troy Kisky wrote:
>> On 10/17/2017 7:30 PM, Andy Duan wrote:
>>> From: Troy Kisky <troy.kisky@...ndarydevices.com> Sent: Wednesday,
>>> October 18, 2017 5:34 AM
>>>>>> This is better for code locality and should slightly speed up
>>>>>> normal
>>>> interrupts.
>>>>>>
>>>>>> This also allows PPS clock output to start working for i.mx7. This
>>>>>> is because
>>>>>> i.mx7 was already using the limit of 3 interrupts, and needed another.
>>>>>>
>>>>>> Signed-off-by: Troy Kisky <troy.kisky@...ndarydevices.com>
>>>>>>
>>>>>> ---
>>>>>>
>>>>>> v2: made this change independent of any devicetree change so that
>>>>>> old dtbs continue to work.
>>>>>>
>>>>>> Continue to register ptp clock if interrupt is not found.
>>>>>> ---
>>>>>> drivers/net/ethernet/freescale/fec.h      |  3 +-
>>>>>> drivers/net/ethernet/freescale/fec_main.c | 25 ++++++----
>>>>>> drivers/net/ethernet/freescale/fec_ptp.c  | 82
>>>>>> ++++++++++++++++++--------
>>>>>> -----
>>>>>> 3 files changed, 65 insertions(+), 45 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/net/ethernet/freescale/fec.h
>>>>>> b/drivers/net/ethernet/freescale/fec.h
>>>>>> index ede1876a9a19..be56ac1f1ac4 100644
>>>>>> --- a/drivers/net/ethernet/freescale/fec.h
>>>>>> +++ b/drivers/net/ethernet/freescale/fec.h
>>>>>> @@ -582,12 +582,11 @@ struct fec_enet_private {
>>>>>> 	u64 ethtool_stats[0];
>>>>>> };
>>>>>>
>>>>>> -void fec_ptp_init(struct platform_device *pdev);
>>>>>> +void fec_ptp_init(struct platform_device *pdev, int irq_index);
>>>>>> void fec_ptp_stop(struct platform_device *pdev);  void
>>>>>> fec_ptp_start_cyclecounter(struct net_device *ndev);  int
>>>>>> fec_ptp_set(struct net_device *ndev, struct ifreq *ifr);  int
>>>>>> fec_ptp_get(struct net_device *ndev, struct ifreq *ifr); -uint
>>>>>> fec_ptp_check_pps_event(struct fec_enet_private *fep);
>>>>>>
>>>>>>
>>>>>>
>>>>
>/**********************************************************
>>>>>> ******************/
>>>>>> #endif /* FEC_H */
>>>>>> diff --git a/drivers/net/ethernet/freescale/fec_main.c
>>>>>> b/drivers/net/ethernet/freescale/fec_main.c
>>>>>> index 3dc2d771a222..21afabbc560f 100644
>>>>>> --- a/drivers/net/ethernet/freescale/fec_main.c
>>>>>> +++ b/drivers/net/ethernet/freescale/fec_main.c
>>>>>> @@ -1602,10 +1602,6 @@ fec_enet_interrupt(int irq, void *dev_id)
>>>>>> 		ret = IRQ_HANDLED;
>>>>>> 		complete(&fep->mdio_done);
>>>>>> 	}
>>>>>> -
>>>>>> -	if (fep->ptp_clock)
>>>>>> -		if (fec_ptp_check_pps_event(fep))
>>>>>> -			ret = IRQ_HANDLED;
>>>>>> 	return ret;
>>>>>> }
>>>>>>
>>>>>> @@ -3325,6 +3321,8 @@ fec_probe(struct platform_device *pdev)
>>>>>> 	struct device_node *np = pdev->dev.of_node, *phy_node;
>>>>>> 	int num_tx_qs;
>>>>>> 	int num_rx_qs;
>>>>>> +	char irq_name[8];
>>>>>> +	int irq_cnt;
>>>>>>
>>>>>> 	fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
>>>>>>
>>>>>> @@ -3465,18 +3463,27 @@ fec_probe(struct platform_device *pdev)
>>>>>> 	if (ret)
>>>>>> 		goto failed_reset;
>>>>>>
>>>>>> +	irq_cnt = platform_irq_count(pdev);
>>>>>> +	if (irq_cnt > FEC_IRQ_NUM)
>>>>>> +		irq_cnt = FEC_IRQ_NUM;	/* last for ptp */
>>>>>> +	else if (irq_cnt == 2)
>>>>>> +		irq_cnt = 1;	/* last for ptp */
>>>>>> +	else if (irq_cnt <= 0)
>>>>>> +		irq_cnt = 1;	/* Let the for loop fail */
>>>>>
>>>>> Don't do like this. Don't suppose pps interrupt is the last one.
>>>>
>>>>
>>>> I don't. If the pps interrupt is named, the named interrupt will be
>>>> used. If it is NOT named, the last interrupt is used, if 2
>>>> interrupts, or >3 interrupt are provided.
>>>> Otherwise, no pps interrupt is assumed.
>>>> Fortunately this seems to be true currently.
>>>>
>>> If pps interrupt is not named, then it limit the last one is pps.
>>> We cannot get the pps interrupt based on current chip interrupt define,
>we never know the future chip how to define interrupt.
>>> Although your current implementation can work with current chips, but it is
>not really good solution.
>>>
>>>>
>>>>> And if irq_cnt is 1 like imx28/imx5x,  the patch will break fec
>>>>> interrupt
>>>> function.
>>>>
>>>> How ?  fec_ptp_init will not be called as bufdesc_ex is 0.
>>>>
>>> Imx28 also support enhanced buffer descriptor,  if define the ptp clock in
>dts then bufdesc_ex also can be 1.
>>
>>
>> Only if FEC_QUIRK_HAS_BUFDESC_EX is set, which it is not. Here's the
>> relevant code snippets
>>
>> 	}, {
>> 		.name = "imx25-fec",
>> 		.driver_data = FEC_QUIRK_USE_GASKET |
>FEC_QUIRK_MIB_CLEAR,
>> 	}, {
>> 		.name = "imx27-fec",
>> 		.driver_data = FEC_QUIRK_MIB_CLEAR,
>> 	}, {
>> 		.name = "imx28-fec",
>> 		.driver_data = FEC_QUIRK_ENET_MAC |
>FEC_QUIRK_SWAP_FRAME |
>> 				FEC_QUIRK_SINGLE_MDIO |
>FEC_QUIRK_HAS_RACC,
>> 	}, {
>>
>> ....
>> 	fep->bufdesc_ex = fep->quirks & FEC_QUIRK_HAS_BUFDESC_EX;
>> 	fep->clk_ptp = devm_clk_get(&pdev->dev, "ptp");
>> 	if (IS_ERR(fep->clk_ptp)) {
>> 		fep->clk_ptp = NULL;
>> 		fep->bufdesc_ex = false;
>> 	}
>> ______________
>>
>> You could make your way work though, if you remove the pps clock from
>> imx50.dtsi, imx51.dtsi, and imx53.dtsi.
>
>
>Whoops I meant "ptp" clock.
>
>That brings up a question though.
>
>interrupt-names = "int0", "int1", "int2", "pps"
>
>may be more accurate. Is there any desire for me to use "pps" instead ?
>
I agree this named method.
Set the property "interrupt-names" is optional properties that don't break other platforms.

Powered by blists - more mailing lists