Bryan Rittmeyer wrote:
Hello again. I've been reviewing the zd1211rw code with the thought of
working on ad-hoc mode.

While reading I found the amusing locking in zd_mac_clear().

I think the point is to make sure that nobody is holding the lock before we finish clearing up. The code is obviously inaccurate because if that was even possible, someone could and would take it immediately after the spin_unlock.

There is actually even more redundancy in the clear path, see the attached patch. When the clearing happens, the network interface is down and our interrupts are disabled, so yes, no need for locking. Also, the whole structure gets freed immediately after clear, so there is no point in zeroing everything again.

The only risk is that our future housekeeping thread is still running, but it goes without saying that we must make sure that it is fully stopped when the interface is brought down when we come to implement it.

Should probably get Ulrich's opinion on this before committing, the confusing interleaving of layers is his thing ;)

diff --git a/zd_chip.c b/zd_chip.c
index 65def95..91c3e90 100644
--- a/zd_chip.c
+++ b/zd_chip.c
@@ -42,12 +42,8 @@ void zd_chip_init(struct zd_chip *chip,
 void zd_chip_clear(struct zd_chip *chip)
-       mutex_lock(&chip->mutex);
-       zd_rf_clear(&chip->rf);
-       mutex_unlock(&chip->mutex);
-       memset(chip, 0, sizeof(*chip));
 static int scnprint_mac_oui(const u8 *addr, char *buffer, size_t size)
diff --git a/zd_mac.c b/zd_mac.c
index 114b23d..4bb5a14 100644
--- a/zd_mac.c
+++ b/zd_mac.c
@@ -124,11 +124,7 @@ out:
 void zd_mac_clear(struct zd_mac *mac)
-       /* Aquire the lock. */
-       spin_lock(&mac->lock);
-       spin_unlock(&mac->lock);
-       memset(mac, 0, sizeof(*mac));
 static int reset_mode(struct zd_mac *mac)
diff --git a/zd_rf.c b/zd_rf.c
index 4198062..45bd775 100644
--- a/zd_rf.c
+++ b/zd_rf.c
@@ -54,11 +54,6 @@ void zd_rf_init(struct zd_rf *rf)
        memset(rf, 0, sizeof(*rf));
-void zd_rf_clear(struct zd_rf *rf)
-       memset(rf, 0, sizeof(*rf));
 int zd_rf_init_hw(struct zd_rf *rf, u8 type)
        int r, t;
diff --git a/zd_rf.h b/zd_rf.h
index 0276e1e..0da2cf8 100644
--- a/zd_rf.h
+++ b/zd_rf.h
@@ -64,7 +64,6 @@ struct zd_rf {
 const char *zd_rf_name(u8 type);
 void zd_rf_init(struct zd_rf *rf);
-void zd_rf_clear(struct zd_rf *rf);
 int zd_rf_init_hw(struct zd_rf *rf, u8 type);
 int zd_rf_reset_hw(struct zd_rf *rf);
diff --git a/zd_usb.c b/zd_usb.c
index b773ec1..bfa3208 100644
--- a/zd_usb.c
+++ b/zd_usb.c
@@ -865,7 +865,6 @@ void zd_usb_clear(struct zd_usb *usb)
        usb_set_intfdata(usb->intf, NULL);
-       memset(usb, 0, sizeof(*usb));
        /* FIXME: usb_interrupt, usb_tx, usb_rx? */
Zd1211-devs mailing list -

Reply via email to