2009-01-25 12:41:54

by Alina Friedrichsen

[permalink] [raw]
Subject: [PATCH] b43: Accessing the TSF via mac80211

This allows the mac80211 high level code to access the TSF. This is e.g=
=2E needed for BSSID merges in the IBSS mode.

Signed-off-by: Alina Friedrichsen <[email protected]>
---
diff -urN wireless-testing.orig/drivers/net/wireless/b43/main.c wireles=
s-testing/drivers/net/wireless/b43/main.c
--- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-01-25 06=
:12:13.000000000 +0100
+++ wireless-testing/drivers/net/wireless/b43/main.c 2009-01-25 13:09:3=
5.000000000 +0100
@@ -3177,6 +3177,25 @@
return 0;
}
=20
+static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
+{
+ struct b43_wl *wl =3D hw_to_b43_wl(hw);
+ struct b43_wldev *dev =3D wl->current_dev;
+ u64 tsf;
+
+ b43_tsf_read(dev, &tsf);
+
+ return tsf;
+}
+
+static void b43_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
+{
+ struct b43_wl *wl =3D hw_to_b43_wl(hw);
+ struct b43_wldev *dev =3D wl->current_dev;
+
+ b43_tsf_write(dev, tsf);
+}
+
static void b43_put_phy_into_reset(struct b43_wldev *dev)
{
struct ssb_device *sdev =3D dev->dev;
@@ -4296,6 +4315,8 @@
.set_key =3D b43_op_set_key,
.get_stats =3D b43_op_get_stats,
.get_tx_stats =3D b43_op_get_tx_stats,
+ .get_tsf =3D b43_op_get_tsf,
+ .set_tsf =3D b43_op_set_tsf,
.start =3D b43_op_start,
.stop =3D b43_op_stop,
.set_tim =3D b43_op_beacon_set_tim,

--=20
Psssst! Schon vom neuen GMX MultiMessenger geh=F6rt? Der kann`s mit all=
en: http://www.gmx.net/de/go/multimessenger


2009-01-25 12:57:59

by Michael Büsch

[permalink] [raw]
Subject: Re: [PATCH] b43: Accessing the TSF via mac80211

On Sunday 25 January 2009 13:55:49 Michael Buesch wrote:
> On Sunday 25 January 2009 13:51:50 Michael Buesch wrote:
> > On Sunday 25 January 2009 13:41:51 Alina Friedrichsen wrote:
> > > This allows the mac80211 high level code to access the TSF. This is e.g. needed for BSSID merges in the IBSS mode.
> >
> > Thanks, can you also remove our private debugfs hook?
> >
> > > Signed-off-by: Alina Friedrichsen <[email protected]>
> > > ---
> > > diff -urN wireless-testing.orig/drivers/net/wireless/b43/main.c wireless-testing/drivers/net/wireless/b43/main.c
> > > --- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-01-25 06:12:13.000000000 +0100
> > > +++ wireless-testing/drivers/net/wireless/b43/main.c 2009-01-25 13:09:35.000000000 +0100
> > > @@ -3177,6 +3177,25 @@
> > > return 0;
> > > }
> > >
> > > +static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
> > > +{
> > > + struct b43_wl *wl = hw_to_b43_wl(hw);
> > > + struct b43_wldev *dev = wl->current_dev;
> > > + u64 tsf;
> > > +
> >
> > You must add a check and locking here.
> >
> > if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
> > mutex_lock(&wl->mutex);
> > spin_lock_irq(&wl->irq_lock);
> >
> > > + b43_tsf_read(dev, &tsf);
> >
> > spin_unlock_irq(&wl->irq_lock);
> > mutex_unlock(&wl->mutex);
> > } else
> > tsf = 0; //FIXME what to do on error?
> >
> > > + return tsf;
> > > +}
>
> Whoops, I got it wrong :D
> This is what it should look like:
>
> static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
> {
> struct b43_wl *wl = hw_to_b43_wl(hw);
> struct b43_wldev *dev = wl->current_dev;
> u64 tsf;
>
> mutex_lock(&wl->mutex);
> spin_lock_irq(&wl->irq_lock);
> if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
> b43_tsf_read(dev, &tsf);
> else
> tsf = 0;//FIXME? what to do on error?
> spin_unlock_irq(&wl->irq_lock);
> mutex_unlock(&wl->mutex);
>
> return tsf;
> }
>

Damn, I'm not awake, yet.
The dev = wl->current_dev also must be inside of the mutex.

--
Greetings, Michael.

2009-01-25 12:56:43

by Michael Büsch

[permalink] [raw]
Subject: Re: [PATCH] b43: Accessing the TSF via mac80211

On Sunday 25 January 2009 13:51:50 Michael Buesch wrote:
> On Sunday 25 January 2009 13:41:51 Alina Friedrichsen wrote:
> > This allows the mac80211 high level code to access the TSF. This is e.g. needed for BSSID merges in the IBSS mode.
>
> Thanks, can you also remove our private debugfs hook?
>
> > Signed-off-by: Alina Friedrichsen <[email protected]>
> > ---
> > diff -urN wireless-testing.orig/drivers/net/wireless/b43/main.c wireless-testing/drivers/net/wireless/b43/main.c
> > --- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-01-25 06:12:13.000000000 +0100
> > +++ wireless-testing/drivers/net/wireless/b43/main.c 2009-01-25 13:09:35.000000000 +0100
> > @@ -3177,6 +3177,25 @@
> > return 0;
> > }
> >
> > +static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
> > +{
> > + struct b43_wl *wl = hw_to_b43_wl(hw);
> > + struct b43_wldev *dev = wl->current_dev;
> > + u64 tsf;
> > +
>
> You must add a check and locking here.
>
> if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
> mutex_lock(&wl->mutex);
> spin_lock_irq(&wl->irq_lock);
>
> > + b43_tsf_read(dev, &tsf);
>
> spin_unlock_irq(&wl->irq_lock);
> mutex_unlock(&wl->mutex);
> } else
> tsf = 0; //FIXME what to do on error?
>
> > + return tsf;
> > +}

Whoops, I got it wrong :D
This is what it should look like:

static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
{
struct b43_wl *wl = hw_to_b43_wl(hw);
struct b43_wldev *dev = wl->current_dev;
u64 tsf;

mutex_lock(&wl->mutex);
spin_lock_irq(&wl->irq_lock);
if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
b43_tsf_read(dev, &tsf);
else
tsf = 0;//FIXME? what to do on error?
spin_unlock_irq(&wl->irq_lock);
mutex_unlock(&wl->mutex);

return tsf;
}

--
Greetings, Michael.

2009-01-25 12:52:45

by Michael Büsch

[permalink] [raw]
Subject: Re: [PATCH] b43: Accessing the TSF via mac80211

On Sunday 25 January 2009 13:41:51 Alina Friedrichsen wrote:
> This allows the mac80211 high level code to access the TSF. This is e.g. needed for BSSID merges in the IBSS mode.

Thanks, can you also remove our private debugfs hook?

> Signed-off-by: Alina Friedrichsen <[email protected]>
> ---
> diff -urN wireless-testing.orig/drivers/net/wireless/b43/main.c wireless-testing/drivers/net/wireless/b43/main.c
> --- wireless-testing.orig/drivers/net/wireless/b43/main.c 2009-01-25 06:12:13.000000000 +0100
> +++ wireless-testing/drivers/net/wireless/b43/main.c 2009-01-25 13:09:35.000000000 +0100
> @@ -3177,6 +3177,25 @@
> return 0;
> }
>
> +static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
> +{
> + struct b43_wl *wl = hw_to_b43_wl(hw);
> + struct b43_wldev *dev = wl->current_dev;
> + u64 tsf;
> +

You must add a check and locking here.

if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
mutex_lock(&wl->mutex);
spin_lock_irq(&wl->irq_lock);

> + b43_tsf_read(dev, &tsf);

spin_unlock_irq(&wl->irq_lock);
mutex_unlock(&wl->mutex);
} else
tsf = 0; //FIXME what to do on error?

> + return tsf;
> +}
> +
> +static void b43_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
> +{
> + struct b43_wl *wl = hw_to_b43_wl(hw);
> + struct b43_wldev *dev = wl->current_dev;

Same check and locking goes here.

> + b43_tsf_write(dev, tsf);
> +}
> +
> static void b43_put_phy_into_reset(struct b43_wldev *dev)
> {
> struct ssb_device *sdev = dev->dev;
> @@ -4296,6 +4315,8 @@
> .set_key = b43_op_set_key,
> .get_stats = b43_op_get_stats,
> .get_tx_stats = b43_op_get_tx_stats,
> + .get_tsf = b43_op_get_tsf,
> + .set_tsf = b43_op_set_tsf,
> .start = b43_op_start,
> .stop = b43_op_stop,
> .set_tim = b43_op_beacon_set_tim,
>



--
Greetings, Michael.