On 14.01.2024 20:07, Sergey Shtylyov wrote: > On 1/10/24 2:55 PM, claudiu beznea wrote: > > [...] > >>>>>> From: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx> >>>>>> >>>>>> The runtime PM implementation will disable clocks at the end of >>>>>> ravb_probe(). As some IP variants switch to reset mode as a result of >>>>>> setting module standby through clock disable APIs, to implement runtime PM >>>>>> the resource parsing and requesting are moved in the probe function and IP >>>>>> settings are moved in the open function. This is done because at the end of >>>>>> the probe some IP variants will switch anyway to reset mode and the >>>>>> registers content is lost. Also keeping only register specific operations >>>>>> in the ravb_open()/ravb_close() functions will make them faster. >>>>>> >>>>>> Commit moves IRQ requests to ravb_probe() to have all the IRQs ready when >>>>>> the interface is open. As now IRQs gets and requests are in a single place >>>>>> there is no need to keep intermediary data (like ravb_rx_irqs[] and >>>>>> ravb_tx_irqs[] arrays or IRQs in struct ravb_private). >>>>> >>>>> There's one thing that you probably didn't take into account: after >>>>> you call request_irq(), you should be able to handle your IRQ as it's >>>>> automatically unmasked, unless you pass IRQF_NO_AUTOEN to request_irq(). >>>>> Your device may be held i reset or even powered off but if you pass >>>>> IRQF_SHARED to request_irq() (you do in a single IRQ config), you must >>>>> be prepared to get your device's registers read (in order to ascertain >>> >>> And, at least on arm32, reading a powered off (or not clocked?) device's >>> register causes an imprecise external abort exception -- which results in a >>> kernel oops... >>> >>>>> whether it's your IRQ or not). And you can't even pass IRQF_NO_AUTOEN >>>>> along with IRQF_SHARED, according to my reading of the IRQ code... >>>> >>>> Good point! > > Iff we can come up with a robust check whether the device is powered on, > we can overcome even the IRQF_SHARED issue though... > I'm seeing pm_runtime_active() API and wondering whether we can use it > from the IRQ context. Alternatively, we can add a is_opened flag, like > sh_eth.c does... The is_open flag should deal with this, too, AFAICT at the moment, and should also cover your concerns about U-Boot. Thank you, Claudiu Beznea > >>>>>> This is a preparatory change to add runtime PM support for all IP variants. >>>>> >>>>> I don't readily see why this is necessary for the full-fledged RPM >>>>> support... >>>> >>>> I tried to speed up the ravb_open()/ravb_close() but missed the IRQF_SHARED >>> >>> I doubt that optimizing ravb_{open,close}() is worth pursuing, frankly... > > OTOH, we'll get a simpler/cleaner code if we do this... > Previously, I was under an impression that it's common behavior of > the networking drivers to call request_irq() from their ndo_open() methods. > Apparently, it's not true anymore (probably with the introduction of the > managed device API) -- the newer drivers often call devm_request_irq() > from their probe() methods instead... > >>>> IRQ. As there is only one IRQ requested w/ IRQF_SHARED, are you OK with >>>> still keeping the rest of IRQs handled as proposed by this patch? >>> >>> I'm not, as this doesn't really seem necessary for your main goal. >>> It's not clear in what state U-Boot leaves EtherAVB... > > This still seems an issue though... My prior experience with the R-Car > MMC driver tells me that U-Boot may leave interrupts enabled... :-/ > >> Ok. One other reason I did this is, as commit message states, to keep >> resource parsing and allocation/freeing in probe/remove and hardware >> settings in open/close. >> >> Anyway, I'll revert all the changes IRQ related. > > Now I've changed my mind -- let's retain your patch! It needs some work > though... > >> Thank you, >> Claudiu Beznea > > [...] > > MBR, Sergey