All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Akhil Goyal <akhil.goyal@freescale.com>
Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
	pankaj.chauhan@freescale.com
Subject: Re: [PATCH 1/5] drivers/misc: Support for RF interface device framework
Date: Tue, 18 Jun 2013 15:40:45 +0200	[thread overview]
Message-ID: <201306181540.45454.arnd@arndb.de> (raw)
In-Reply-To: <51C00FC0.90105@freescale.com>

On Tuesday 18 June 2013, Akhil Goyal wrote:
> On 6/18/2013 2:58 AM, Arnd Bergmann wrote:
> >> +	/*
> >> +	 * Spin_locks are changed to mutexes if PREEMPT_RT is enabled,
> >> +	 * i.e they can sleep. This fact is problem for us because
> >> +	 * add_wait_queue()/wake_up_all() takes wait queue spin lock.
> >> +	 * Since spin lock can sleep with PREEMPT_RT, wake_up_all() can not be
> >> +	 * called from rf_notify_dl_tti (which is called in interrupt context).
> >> +	 * As a workaround, wait_q_lock is used for protecting the wait_q and
> >> +	 * add_wait_queue_locked()/ wake_up_locked() functions of wait queues
> >> +	 * are used.
> >> +	 */
> >> +	raw_spin_lock_irqsave(&rf_dev->wait_q_lock, flags);
> >> +	__add_wait_queue_tail_exclusive(&rf_dev->wait_q,&wait);
> >> +	raw_spin_unlock_irqrestore(&rf_dev->wait_q_lock, flags);
> >> +	set_current_state(TASK_INTERRUPTIBLE);
> >> +	/*Now wait here, tti notificaion will wake us up*/
> >> +	schedule();
> >> +	set_current_state(TASK_RUNNING);
> >> +	raw_spin_lock_irqsave(&rf_dev->wait_q_lock, flags);
> >> +	__remove_wait_queue(&rf_dev->wait_q,&wait);
> >> +	raw_spin_unlock_irqrestore(&rf_dev->wait_q_lock, flags);
> >
> > This is not a proper method of waiting for an event. Why can't you
> > use wait_event() here?
> wait_event() is internally calling spin_lock_irqsave() and this function 
> will be called in hard IRQ context with PREEMPT_RT enabled(IRQF_NODELAY 
> set). So wait_event cannot be used.
> This problem can be solved if we can get the following patch applied on 
> the tree.
> https://patchwork.kernel.org/patch/2161261/

I see. How about using wait_event here then and adding a comment about
the RT kernel?

> > The explanation about the interrupt handler seems incorrect, since PREEMPT_RT
> > also turns interrupt handlers into threads.
> The interrupt handler has real time requirement and thus running in 
> HARDIRQ context with flag IRQF_NODELAY. We get this interrupt in every 
> millisecond.

Ok. So there would be no problem without the RT patch set.

IRQF_NODELAY is specific to the RT kernel, so you can change the wait_event
function to something else in the same patch that adds this flag.
> >> +#define RF_MAGIC 0xEE
> >> +#define RIF_DEV_INIT		_IOWR(RF_MAGIC, 1, struct rf_init_params)
> >> +#define RIF_SET_TIMER_SOURCE	_IOW(RF_MAGIC, 2, unsigned int)
> >> +#define RIF_GET_STATE		_IOR(RF_MAGIC, 3, unsigned int)
> >> +#define RIF_SET_TIMER_CORRECTION _IOW(RF_MAGIC, 4, struct rif_dac_params)
> >> +#define	RIF_RUN_PHY_CMDS	_IOW(RF_MAGIC, 5, struct rif_phy_cmd_set)
> >> +#define RIF_READ_RSSI		_IOWR(RF_MAGIC, 6, struct rf_rssi)
> >> +#define RIF_READ_PHY_REGS	_IOR(RF_MAGIC, 7, struct rif_reg_buf)
> >> +#define RIF_READ_CTRL_REGS	_IOR(RF_MAGIC, 8, struct rif_reg_buf)
> >> +#define RIF_START		_IO(RF_MAGIC, 9)
> >> +#define RIF_STOP		_IO(RF_MAGIC, 10)
> >> +#define RIF_GET_DEV_INFO	_IOWR(RF_MAGIC, 11, struct rf_dev_info)
> >> +#define RIF_WRITE_PHY_REGS _IOR(RF_MAGIC, 12, struct rif_write_reg_buf)
> >> +#define RIF_GET_DAC_VALUE	_IOR(RF_MAGIC, 13, struct rif_dac_buf)
> >> +#define RIF_SET_TX_ATTEN	_IOW(RF_MAGIC, 14, struct rf_tx_buf)
> >> +#define RIF_EN_DIS_TX		_IOW(RF_MAGIC, 15, struct rf_tx_en_dis)
> >> +#define RIF_WRITE_CTRL_REGS 	_IOW(RF_MAGIC, 16, struct rif_write_reg_buf)
> >> +#define RIF_READ_RX_GAIN 	_IOWR(RF_MAGIC, 17, struct rf_rx_gain)
> >> +#define RIF_CONFIG_SNIFF 	_IOWR(RF_MAGIC, 18, struct rf_sniff_params)
> >> +#define RIF_WRITE_RX_GAIN 	_IOW(RF_MAGIC, 19, struct rf_rx_gain)
> >> +#define RIF_SET_GAIN_CTRL_MODE 	_IOW(RF_MAGIC, 20, struct rf_gain_ctrl)
> >> +#define RIF_INIT_SYNTH_TABLE	_IOW(RF_MAGIC, 21, struct rf_synth_table)
> >> +#define RIF_CHANNEL_OPEN	_IOW(RF_MAGIC, 22, struct rf_channel_params)
> >> +#define RIF_CHANNEL_CLOSE	_IOW(RF_MAGIC, 23, unsigned int)
> >> +#define RIF_REGISTER_EVENT	_IOW(RF_MAGIC, 24, struct rf_event_listener)
> >> +#define RIF_UNREGISTER_EVENT	_IO(RF_MAGIC, 25)
> >
> > On the whole, the ioctl API looks very complex to me. It may well be that
> > the complexity is necessary, but I cannot tell because I don't understand
> > the subsystem. Can you find someone from another company that has hardware
> > which would use the same subsystem, and have them do a review of the API
> > to ensure it works for them as well?
> >
> Antenna controller is a Freescale designed hardware block in the BSC9131 
> SOC. I am not aware of any other company which has similar kind of 
> controller. I could not find any existing Antenna Controller Driver in 
> kernel.
> 
> AD9361 RF PHY is being used by other companies also but again there is 
> no open source driver for that.
> 
> This framework binds the Radio PHY and the Antenna Controller and expose 
> the complete rf device(phy + controller) to the user space. Since I am 
> not aware of other companies using similar hardware, I was hoping to get 
> feedback about framework and APIs on the list itself.

Ok. I hope you can find someone else to provide a review of the API.

> Also I will try to explain more on the IOCTL APIs in the Documentation 
> file that I have added in this patch.

Yes, that would be good.

	Arnd

  reply	other threads:[~2013-06-18 13:40 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-17  8:09 [PATCH 0/5] Radio device framework akhil.goyal
2013-06-17  8:09 ` [PATCH 1/5] drivers/misc: Support for RF interface " akhil.goyal
2013-06-17  8:09   ` [PATCH 2/5] drivers/misc/rf: AIC: Freescale Antenna Interface controller driver akhil.goyal
2013-06-17  8:09     ` [PATCH 3/5] drivers/misc: rf/ad9361: AD9361 device driver for Radio phy akhil.goyal
2013-06-17  8:09       ` [PATCH 4/5] binding: Add device tree bindings for freescale AIC and AD phy akhil.goyal
2013-06-17  8:09         ` [PATCH 5/5] BSC9131rdb/dts: Add nodes for supporting AIC and AD PHY akhil.goyal
2013-06-19 12:57       ` [PATCH 3/5] drivers/misc: rf/ad9361: AD9361 device driver for Radio phy Lars-Peter Clausen
2013-06-19 14:30         ` Greg KH
2013-06-19 14:58           ` Arnd Bergmann
2013-06-20 10:35         ` pankaj chauhan
2013-06-21 23:46           ` pankaj chauhan
2013-06-24  8:19           ` Getz, Robin
2013-06-24 12:05             ` pankaj chauhan
2013-07-03 19:36           ` Mark Brown
2013-07-05  6:14             ` pankaj chauhan
2013-06-17 21:28   ` [PATCH 1/5] drivers/misc: Support for RF interface device framework Arnd Bergmann
2013-06-18  7:44     ` Akhil Goyal
2013-06-18 13:40       ` Arnd Bergmann [this message]
2013-06-19  6:00         ` Akhil Goyal
2013-06-19 11:31       ` Lars-Peter Clausen
2013-06-20 10:47         ` pankaj chauhan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201306181540.45454.arnd@arndb.de \
    --to=arnd@arndb.de \
    --cc=akhil.goyal@freescale.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pankaj.chauhan@freescale.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.