* pull request: iwlwifi 2014-05-07
@ 2014-05-07 19:59 Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 1/5] iwlwifi: mvm: several fixes in scan Emmanuel Grumbach
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 19:59 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, ilw
[-- Attachment #1: Type: text/plain, Size: 1945 bytes --]
Hi John,
This is a pull request intended for 3.15 release.
Alex fixes the scan by disabling the fragmented scan. David prevents scan offload while associated, the firmware seems not to like it. I fix a stupid bug I made in BT Coex, and fix a bad #ifdef clause in rate scaling.
Along with that there is a fix for a NULL pointer exception that can happen if we load the driver and our ISR gets called because the interrupt line is shared. The fix has been tested by the reporter.
Please pull.
The following changes since commit a6bc92803e7f765e02c923cf37c8e280e729642a:
iwlwifi: mvm: BT Coex - fix Look Up Table (2014-04-13 16:51:07 +0300)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git master
for you to fetch changes up to 83f7a85f1134c6e914453f5747435415a23d516b:
iwlwifi: pcie: disable interrupts upon PCIe alloc (2014-05-07 22:54:32 +0300)
----------------------------------------------------------------
Alexander Bondar (1):
iwlwifi: mvm: several fixes in scan
David Spinadel (1):
iwlwifi: mvm: do no sched scan while associated
Emmanuel Grumbach (3):
iwlwifi: mvm: BT Coex - fix validity flags during init
iwlwifi: mvm: rs - s/CPTCFG/CONFIG
iwlwifi: pcie: disable interrupts upon PCIe alloc
drivers/net/wireless/iwlwifi/mvm/coex.c | 6 +++---
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | 8 ++++----
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 5 +++++
drivers/net/wireless/iwlwifi/mvm/mvm.h | 3 +++
drivers/net/wireless/iwlwifi/mvm/rs.c | 2 +-
drivers/net/wireless/iwlwifi/mvm/scan.c | 53 ++++++++++++-----------------------------------------
drivers/net/wireless/iwlwifi/mvm/utils.c | 19 +++++++++++++++++++
drivers/net/wireless/iwlwifi/pcie/trans.c | 10 ++++++----
8 files changed, 53 insertions(+), 53 deletions(-)
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 901 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/5] iwlwifi: mvm: several fixes in scan
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
@ 2014-05-07 20:01 ` Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 2/5] iwlwifi: mvm: BT Coex - fix validity flags during init Emmanuel Grumbach
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 20:01 UTC (permalink / raw)
To: linux-wireless; +Cc: Alexander Bondar, Emmanuel Grumbach
From: Alexander Bondar <alexander.bondar@intel.com>
The firmware doesn't handle properly the fragmented scan.
Stop using it.
While at it change max_out_time and suspend_time units from
usec to TUs as expected by firmware API.
Signed-off-by: Alexander Bondar <alexander.bondar@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | 8 ++--
drivers/net/wireless/iwlwifi/mvm/scan.c | 53 ++++++--------------------
2 files changed, 16 insertions(+), 45 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index 9426905..d73a89e 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -183,9 +183,9 @@ enum iwl_scan_type {
* this number of packets were received (typically 1)
* @passive2active: is auto switching from passive to active during scan allowed
* @rxchain_sel_flags: RXON_RX_CHAIN_*
- * @max_out_time: in usecs, max out of serving channel time
+ * @max_out_time: in TUs, max out of serving channel time
* @suspend_time: how long to pause scan when returning to service channel:
- * bits 0-19: beacon interal in usecs (suspend before executing)
+ * bits 0-19: beacon interal in TUs (suspend before executing)
* bits 20-23: reserved
* bits 24-31: number of beacons (suspend between channels)
* @rxon_flags: RXON_FLG_*
@@ -383,8 +383,8 @@ enum scan_framework_client {
* @quiet_plcp_th: quiet channel num of packets threshold
* @good_CRC_th: passive to active promotion threshold
* @rx_chain: RXON rx chain.
- * @max_out_time: max uSec to be out of assoceated channel
- * @suspend_time: pause scan this long when returning to service channel
+ * @max_out_time: max TUs to be out of assoceated channel
+ * @suspend_time: pause scan this TUs when returning to service channel
* @flags: RXON flags
* @filter_flags: RXONfilter
* @tx_cmd: tx command for active scan; for 2GHz and for 5GHz.
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index c91dc84..cba88a3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -277,51 +277,22 @@ static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm,
IEEE80211_IFACE_ITER_NORMAL,
iwl_mvm_scan_condition_iterator,
&global_bound);
- /*
- * Under low latency traffic passive scan is fragmented meaning
- * that dwell on a particular channel will be fragmented. Each fragment
- * dwell time is 20ms and fragments period is 105ms. Skipping to next
- * channel will be delayed by the same period - 105ms. So suspend_time
- * parameter describing both fragments and channels skipping periods is
- * set to 105ms. This value is chosen so that overall passive scan
- * duration will not be too long. Max_out_time in this case is set to
- * 70ms, so for active scanning operating channel will be left for 70ms
- * while for passive still for 20ms (fragment dwell).
- */
- if (global_bound) {
- if (!iwl_mvm_low_latency(mvm)) {
- params->suspend_time = ieee80211_tu_to_usec(100);
- params->max_out_time = ieee80211_tu_to_usec(600);
- } else {
- params->suspend_time = ieee80211_tu_to_usec(105);
- /* P2P doesn't support fragmented passive scan, so
- * configure max_out_time to be at least longest dwell
- * time for passive scan.
- */
- if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p) {
- params->max_out_time = ieee80211_tu_to_usec(70);
- params->passive_fragmented = true;
- } else {
- u32 passive_dwell;
- /*
- * Use band G so that passive channel dwell time
- * will be assigned with maximum value.
- */
- band = IEEE80211_BAND_2GHZ;
- passive_dwell = iwl_mvm_get_passive_dwell(band);
- params->max_out_time =
- ieee80211_tu_to_usec(passive_dwell);
- }
- }
+ if (!global_bound)
+ goto not_bound;
+
+ params->suspend_time = 100;
+ params->max_out_time = 600;
+
+ if (iwl_mvm_low_latency(mvm)) {
+ params->suspend_time = 250;
+ params->max_out_time = 250;
}
+not_bound:
+
for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
- if (params->passive_fragmented)
- params->dwell[band].passive = 20;
- else
- params->dwell[band].passive =
- iwl_mvm_get_passive_dwell(band);
+ params->dwell[band].passive = iwl_mvm_get_passive_dwell(band);
params->dwell[band].active = iwl_mvm_get_active_dwell(band,
n_ssids);
}
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/5] iwlwifi: mvm: BT Coex - fix validity flags during init
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 1/5] iwlwifi: mvm: several fixes in scan Emmanuel Grumbach
@ 2014-05-07 20:01 ` Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 3/5] iwlwifi: mvm: rs - s/CPTCFG/CONFIG Emmanuel Grumbach
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 20:01 UTC (permalink / raw)
To: linux-wireless; +Cc: Emmanuel Grumbach
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
The commit below introduced a bug in the validity bits in
init. Due to that, all the Coex mechanism stopped sending
kills to the BT side. Fix that.
Fixes: b9fae2d54c9f ("iwlwifi: mvm: BT Coex add support for Co-running block")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
drivers/net/wireless/iwlwifi/mvm/coex.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex.c b/drivers/net/wireless/iwlwifi/mvm/coex.c
index fa858d54..0489314 100644
--- a/drivers/net/wireless/iwlwifi/mvm/coex.c
+++ b/drivers/net/wireless/iwlwifi/mvm/coex.c
@@ -611,14 +611,14 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
bt_cmd->flags |= cpu_to_le32(BT_COEX_SYNC2SCO);
if (IWL_MVM_BT_COEX_CORUNNING) {
- bt_cmd->valid_bit_msk = cpu_to_le32(BT_VALID_CORUN_LUT_20 |
- BT_VALID_CORUN_LUT_40);
+ bt_cmd->valid_bit_msk |= cpu_to_le32(BT_VALID_CORUN_LUT_20 |
+ BT_VALID_CORUN_LUT_40);
bt_cmd->flags |= cpu_to_le32(BT_COEX_CORUNNING);
}
if (IWL_MVM_BT_COEX_MPLUT) {
bt_cmd->flags |= cpu_to_le32(BT_COEX_MPLUT);
- bt_cmd->valid_bit_msk = cpu_to_le32(BT_VALID_MULTI_PRIO_LUT);
+ bt_cmd->valid_bit_msk |= cpu_to_le32(BT_VALID_MULTI_PRIO_LUT);
}
if (mvm->cfg->bt_shared_single_ant)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/5] iwlwifi: mvm: rs - s/CPTCFG/CONFIG
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 1/5] iwlwifi: mvm: several fixes in scan Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 2/5] iwlwifi: mvm: BT Coex - fix validity flags during init Emmanuel Grumbach
@ 2014-05-07 20:01 ` Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 4/5] iwlwifi: mvm: do no sched scan while associated Emmanuel Grumbach
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 20:01 UTC (permalink / raw)
To: linux-wireless; +Cc: Emmanuel Grumbach
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
My bad - I forgot to update this when sending the patch
upstream.
Fixes: 87d5e4155c00 ("iwlwifi: mvm: rs: reinit rs if no tx for a long time")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
drivers/net/wireless/iwlwifi/mvm/rs.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 9f52c5b..e1c8388 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -1010,7 +1010,7 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
return;
}
-#ifdef CPTCFG_MAC80211_DEBUGFS
+#ifdef CONFIG_MAC80211_DEBUGFS
/* Disable last tx check if we are debugging with fixed rate */
if (lq_sta->dbg_fixed_rate) {
IWL_DEBUG_RATE(mvm, "Fixed rate. avoid rate scaling\n");
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/5] iwlwifi: mvm: do no sched scan while associated
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
` (2 preceding siblings ...)
2014-05-07 20:01 ` [PATCH 3/5] iwlwifi: mvm: rs - s/CPTCFG/CONFIG Emmanuel Grumbach
@ 2014-05-07 20:01 ` Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 5/5] iwlwifi: pcie: disable interrupts upon PCIe alloc Emmanuel Grumbach
2014-05-08 15:29 ` pull request: iwlwifi 2014-05-07 John W. Linville
5 siblings, 0 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 20:01 UTC (permalink / raw)
To: linux-wireless; +Cc: David Spinadel, Emmanuel Grumbach
From: David Spinadel <david.spinadel@intel.com>
Currently the FW doesn't support sched scan while associated,
Prevent it.
Signed-off-by: David Spinadel <david.spinadel@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 5 +++++
drivers/net/wireless/iwlwifi/mvm/mvm.h | 3 +++
drivers/net/wireless/iwlwifi/mvm/utils.c | 19 +++++++++++++++++++
3 files changed, 27 insertions(+)
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index f0cebf1..593f723 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1807,6 +1807,11 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
mutex_lock(&mvm->mutex);
+ if (iwl_mvm_is_associated(mvm)) {
+ ret = -EBUSY;
+ goto out;
+ }
+
switch (mvm->scan_status) {
case IWL_MVM_SCAN_OS:
IWL_DEBUG_SCAN(mvm, "Stopping previous scan for sched_scan\n");
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index d564233..84c75a1 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -1003,6 +1003,9 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
return mvmvif->low_latency;
}
+/* Assoc status */
+bool iwl_mvm_is_associated(struct iwl_mvm *mvm);
+
/* Thermal management and CT-kill */
void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index d619851..6fdbef9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -644,3 +644,22 @@ bool iwl_mvm_low_latency(struct iwl_mvm *mvm)
return result;
}
+
+static void iwl_mvm_assoc_iter(void *_data, u8 *mac, struct ieee80211_vif *vif)
+{
+ bool *assoc = _data;
+
+ if (vif->bss_conf.assoc)
+ *assoc = true;
+}
+
+bool iwl_mvm_is_associated(struct iwl_mvm *mvm)
+{
+ bool assoc = false;
+
+ ieee80211_iterate_active_interfaces_atomic(
+ mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
+ iwl_mvm_assoc_iter, &assoc);
+
+ return assoc;
+}
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/5] iwlwifi: pcie: disable interrupts upon PCIe alloc
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
` (3 preceding siblings ...)
2014-05-07 20:01 ` [PATCH 4/5] iwlwifi: mvm: do no sched scan while associated Emmanuel Grumbach
@ 2014-05-07 20:01 ` Emmanuel Grumbach
2014-05-08 15:29 ` pull request: iwlwifi 2014-05-07 John W. Linville
5 siblings, 0 replies; 7+ messages in thread
From: Emmanuel Grumbach @ 2014-05-07 20:01 UTC (permalink / raw)
To: linux-wireless; +Cc: Emmanuel Grumbach, stable
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
In case RFKILL is in KILL position, the NIC will issue an
interrupt straight away. This interrupt won't be sent
because it is masked in the hardware.
But if our interrupt service routine is called for another
reason (SHARED_IRQ), then we'll look at the interrupt cause
and service it. This can cause bad things if we are not
ready yet.
Explicitly clean the interrupt cause register to make sure
we won't service anything before we are ready to.
Cc: <stable@vger.kernel.org> [3.14]
Reported-and-tested-by: Alexander Monakov <amonakov@gmail.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
drivers/net/wireless/iwlwifi/pcie/trans.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index dcfd6d8..2365553 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -1749,6 +1749,10 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
* PCI Tx retries from interfering with C3 CPU state */
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
+ trans->dev = &pdev->dev;
+ trans_pcie->pci_dev = pdev;
+ iwl_disable_interrupts(trans);
+
err = pci_enable_msi(pdev);
if (err) {
dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err);
@@ -1760,8 +1764,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
}
}
- trans->dev = &pdev->dev;
- trans_pcie->pci_dev = pdev;
trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
@@ -1787,8 +1789,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
goto out_pci_disable_msi;
}
- trans_pcie->inta_mask = CSR_INI_SET_MASK;
-
if (iwl_pcie_alloc_ict(trans))
goto out_free_cmd_pool;
@@ -1800,6 +1800,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
goto out_free_ict;
}
+ trans_pcie->inta_mask = CSR_INI_SET_MASK;
+
return trans;
out_free_ict:
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: pull request: iwlwifi 2014-05-07
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
` (4 preceding siblings ...)
2014-05-07 20:01 ` [PATCH 5/5] iwlwifi: pcie: disable interrupts upon PCIe alloc Emmanuel Grumbach
@ 2014-05-08 15:29 ` John W. Linville
5 siblings, 0 replies; 7+ messages in thread
From: John W. Linville @ 2014-05-08 15:29 UTC (permalink / raw)
To: Emmanuel Grumbach; +Cc: linux-wireless, ilw
On Wed, May 07, 2014 at 10:59:57PM +0300, Emmanuel Grumbach wrote:
> Hi John,
>
> This is a pull request intended for 3.15 release.
>
> Alex fixes the scan by disabling the fragmented scan. David prevents scan offload while associated, the firmware seems not to like it. I fix a stupid bug I made in BT Coex, and fix a bad #ifdef clause in rate scaling.
> Along with that there is a fix for a NULL pointer exception that can happen if we load the driver and our ISR gets called because the interrupt line is shared. The fix has been tested by the reporter.
>
> Please pull.
>
> The following changes since commit a6bc92803e7f765e02c923cf37c8e280e729642a:
>
> iwlwifi: mvm: BT Coex - fix Look Up Table (2014-04-13 16:51:07 +0300)
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git master
>
> for you to fetch changes up to 83f7a85f1134c6e914453f5747435415a23d516b:
>
> iwlwifi: pcie: disable interrupts upon PCIe alloc (2014-05-07 22:54:32 +0300)
Pulling now... Please limit any further fix requests to very small
and important fixes only.
Thanks,
John
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-05-08 15:30 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-07 19:59 pull request: iwlwifi 2014-05-07 Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 1/5] iwlwifi: mvm: several fixes in scan Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 2/5] iwlwifi: mvm: BT Coex - fix validity flags during init Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 3/5] iwlwifi: mvm: rs - s/CPTCFG/CONFIG Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 4/5] iwlwifi: mvm: do no sched scan while associated Emmanuel Grumbach
2014-05-07 20:01 ` [PATCH 5/5] iwlwifi: pcie: disable interrupts upon PCIe alloc Emmanuel Grumbach
2014-05-08 15:29 ` pull request: iwlwifi 2014-05-07 John W. Linville
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).