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
next prev parent 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 " 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome