Minor improvement of orinoco driver

Jean Tourrilhes jt at bougret.hpl.hp.com
Tue Dec 18 12:00:17 EST 2001


On Tue, Dec 18, 2001 at 11:44:14AM +1100, David Gibson wrote:
>
> > 	What I like about the current setup is the constant cost. If I
> > double the number of ioctl, the code stays exactly the same. It also
> > mean that people can just yank a new wireless.h in their kernel and
> > expect it to work.
> 
> Except that the source of every driver needs to change to expand the
> standard handler table.  With structures using the gcc structure
> initialization extension (as used all over the kernel) only a
> recompile is needed.

	Not true. The old driver would work fine even not
recompiled. I was very careful about that.

> It's a nop in the .o, but both breaking the union and pulling the
> various items out (rather than having them as separate parameters)
> makes the source uglier.

	Just do :
----------------------------------------------------------------
static int orinoco_ioctl_getwap(struct net_device *dev,
				struct iw_request_info *info,
				struct sockaddr *arq,
				char *extra)
{
	struct orinoco_private *priv = dev->priv;

	arq->sa_family = ARPHRD_ETHER;
	return orinoco_hw_get_bssid(priv, arq->sa_data);
}
[...]
static const iw_handler		orinoco_handler[] =
{
[...]
	(iw_handler) orinoco_ioctl_getwap,		/* SIOCGIWAP */
----------------------------------------------------------------

	Satisfied ?


> > 	Also : not all driver check/set all the fields of the
> > structure. For example, the old Wavelan doesn't use key index and key
> > flags, whereas the Orinoco does. By expanding things too much in the
> > kernel you would make those drivers that use only a few things pay a
> > price.
> 
> I don't see that it's a price of any significance.  ioctl() is not
> critical path.

	Bloat. Especially static bloat that is there even for people
who don't use it.

> > 	The only issue is if people put the iw_handler in the wrong
> > slot. Your proposal would detect it. But people would realise that
> > pretty quicly (I try to set the encryption, and the frequency changes
> > - how bizzare !).
> 
> Or it SEGVs or oopses because it tries to copy_from_user() when
> actually passed an iw_param.

	Nope. The copy_to/from_user is only between user space and the
kernel wrapper. The driver doesn't see the pointer anymore, so doesn't
get a chance to mess with it.

> > 	And best, you can mix/matches the two approaches, which gives
> > you maximum flexibility. If you look, this is what I have done for the
> > force_reset and card_reset which share the same iw_handler (of course,
> > you won't like it). I think it's a cool feature of the API, and I want
> > to keep it.
> 
> Nifty, but not a decisive advantage IMO>

	Well, it sure depend on your hardware.
	For example, I added the "commit" stuff. For some hardware,
it's totally useless. For some other, like the Orinoco, it makes a
*big* difference.

	Jean




More information about the wireless mailing list