* [PATCH net 0/5] qlcnic: Bug fixes.
@ 2013-12-10 17:33 Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues Himanshu Madhani
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
This series contains bug fixes for multi Tx queue implementation for
all adapters.
Please apply to net.
Thanks,
Himanshu
Himanshu Madhani (4):
qlcnic: use correct netif api to enable tx queues.
qlcnic: fix diagnostic test for all supported adapters.
qlcnic: Fix Tx/SDS ring validation logic.
qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter.
Shahed Shaikh (1):
qlcnic: Use spinlock per transmit queue
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 3 ++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 4 ++--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 19 ++++++++-----------
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | 3 +++
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 6 +++---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 6 ++----
6 files changed, 20 insertions(+), 21 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues.
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
@ 2013-12-10 17:33 ` Himanshu Madhani
2013-12-10 22:49 ` David Miller
2013-12-10 17:33 ` [PATCH net 2/5] qlcnic: Fix diagnostic test for all supported adapters Himanshu Madhani
` (3 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
o commit id 012ec81223aa45d2b80aeafb77392fd1a19c7b10
("qlcnic: Multi Tx queue support for 82xx Series adapter.")
enabled multiple tx queue API's for qlcnic driver.
During link change event, driver will stop/start Tx queues
which manages Link up event is received after Tx context is created
driver needs to call netif_tx_wake_all_queues()
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 0149c94..312c6cd 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -696,7 +696,7 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup)
adapter->ahw->linkup = 1;
if (netif_running(netdev)) {
netif_carrier_on(netdev);
- netif_wake_queue(netdev);
+ netif_tx_wake_all_queues(netdev);
}
}
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 2/5] qlcnic: Fix diagnostic test for all supported adapters.
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues Himanshu Madhani
@ 2013-12-10 17:33 ` Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 3/5] qlcnic: Fix Tx/SDS ring validation logic Himanshu Madhani
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
o TSS/RSS ring change could hang afer diagnostic test was executed
for 82xx series adapter. This regression was added by commit id
c2c5e3a0681bb1945c0cb211a5f4baa22cb2cbb3 ("qlcnic: Enable
diagnostic test for multiple Tx queues.")
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 2 ++
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 1 -
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index b36c02f..6d3edf6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -948,6 +948,7 @@ static int qlcnic_irq_test(struct net_device *netdev)
struct qlcnic_hardware_context *ahw = adapter->ahw;
struct qlcnic_cmd_args cmd;
int ret, drv_sds_rings = adapter->drv_sds_rings;
+ int drv_tx_rings = adapter->drv_tx_rings;
if (qlcnic_83xx_check(adapter))
return qlcnic_83xx_interrupt_test(netdev);
@@ -980,6 +981,7 @@ free_diag_res:
clear_diag_irq:
adapter->drv_sds_rings = drv_sds_rings;
+ adapter->drv_tx_rings = drv_tx_rings;
clear_bit(__QLCNIC_RESETTING, &adapter->state);
return ret;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 05c1eef..aa019c3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1940,7 +1940,6 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test)
qlcnic_detach(adapter);
adapter->drv_sds_rings = QLCNIC_SINGLE_RING;
- adapter->drv_tx_rings = QLCNIC_SINGLE_RING;
adapter->ahw->diag_test = test;
adapter->ahw->linkup = 0;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 3/5] qlcnic: Fix Tx/SDS ring validation logic.
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 2/5] qlcnic: Fix diagnostic test for all supported adapters Himanshu Madhani
@ 2013-12-10 17:33 ` Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 4/5] qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 5/5] qlcnic: Use spinlock per transmit queue Himanshu Madhani
4 siblings, 0 replies; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
o Tx/SDS ring validation does not take into account that either
of these ring values can be 0. This patch fixes this validation
and would fail set_channel operation if any of these ring value
is 0. This regression was added as part of commit id
34e8c406fda5b5a9d2e126a92bab84cd28e3b5fa ("qlcnic: refactor Tx/SDS
ring calculation and validation in driver.")
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 4 ++--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 6 +++++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 1 +
3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index 89208e5..fae1b71 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -2073,8 +2073,8 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
ahw->nic_mode = QLCNIC_DEFAULT_MODE;
adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
- adapter->max_sds_rings = ahw->max_rx_ques;
- adapter->max_tx_rings = ahw->max_tx_ques;
+ adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
+ adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
} else {
return -EIO;
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 6d3edf6..78f5e81 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -667,9 +667,13 @@ qlcnic_set_ringparam(struct net_device *dev,
static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter,
u8 rx_ring, u8 tx_ring)
{
+ if (rx_ring == 0 || tx_ring == 0)
+ return -EINVAL;
+
if (rx_ring != 0) {
if (rx_ring > adapter->max_sds_rings) {
- netdev_err(adapter->netdev, "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n",
+ netdev_err(adapter->netdev,
+ "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n",
rx_ring, adapter->max_sds_rings);
return -EINVAL;
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index aa019c3..2c8cac0 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1178,6 +1178,7 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
} else {
adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE;
adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS;
+ adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 4/5] qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter.
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
` (2 preceding siblings ...)
2013-12-10 17:33 ` [PATCH net 3/5] qlcnic: Fix Tx/SDS ring validation logic Himanshu Madhani
@ 2013-12-10 17:33 ` Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 5/5] qlcnic: Use spinlock per transmit queue Himanshu Madhani
4 siblings, 0 replies; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
o Remove check for validation for TSS/RSS when user wants to
change TSS/RSS ring using set_channel ops in ethtool for
multiple Tx supported adapters. This regression was introduced
by commit id 18afc102fdcb95d6c7d57f2967a06f2f8fe3ba4c
("qlcnic: Enable multiple Tx queue support for 83xx/84xx Series adapter.")
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 78f5e81..e3be276 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -680,21 +680,12 @@ static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter,
}
if (tx_ring != 0) {
- if (qlcnic_82xx_check(adapter) &&
- (tx_ring > adapter->max_tx_rings)) {
+ if (tx_ring > adapter->max_tx_rings) {
netdev_err(adapter->netdev,
"Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n",
tx_ring, adapter->max_tx_rings);
return -EINVAL;
}
-
- if (qlcnic_83xx_check(adapter) &&
- (tx_ring > QLCNIC_SINGLE_RING)) {
- netdev_err(adapter->netdev,
- "Invalid ring count, Tx ring count %d should not be greater than %d driver Tx rings.\n",
- tx_ring, QLCNIC_SINGLE_RING);
- return -EINVAL;
- }
}
return 0;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 5/5] qlcnic: Use spinlock per transmit queue
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
` (3 preceding siblings ...)
2013-12-10 17:33 ` [PATCH net 4/5] qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter Himanshu Madhani
@ 2013-12-10 17:33 ` Himanshu Madhani
4 siblings, 0 replies; 7+ messages in thread
From: Himanshu Madhani @ 2013-12-10 17:33 UTC (permalink / raw)
To: davem; +Cc: netdev, Dept_NX_Linux_NIC_Driver, Shahed Shaikh, himanshu.madhani
From: Shahed Shaikh <shahed.shaikh@qlogic.com>
Driver was using common spinlock to protect Tx descriptor cleanup
for all Tx queues.
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 3 ++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | 3 +++
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 4 ++--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 4 +---
4 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 631ea0a..1842fe4 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -578,6 +578,8 @@ struct qlcnic_host_tx_ring {
dma_addr_t phys_addr;
dma_addr_t hw_cons_phys_addr;
struct netdev_queue *txq;
+ /* Lock to protect Tx descriptors cleanup */
+ spinlock_t tx_clean_lock;
} ____cacheline_internodealigned_in_smp;
/*
@@ -1093,7 +1095,6 @@ struct qlcnic_adapter {
struct qlcnic_filter_hash rx_fhash;
struct list_head vf_mc_list;
- spinlock_t tx_clean_lock;
spinlock_t mac_learn_lock;
/* spinlock for catching rcv filters for eswitch traffic */
spinlock_t rx_mac_learn_lock;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index e9c21e5..e5e7902 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -134,6 +134,7 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter,
struct qlcnic_skb_frag *buffrag;
int i, j;
+ spin_lock(&tx_ring->tx_clean_lock);
cmd_buf = tx_ring->cmd_buf_arr;
for (i = 0; i < tx_ring->num_desc; i++) {
buffrag = cmd_buf->frag_array;
@@ -157,6 +158,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter,
}
cmd_buf++;
}
+
+ spin_unlock(&tx_ring->tx_clean_lock);
}
void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 312c6cd..d9e8e10 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -784,7 +784,7 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter,
struct net_device *netdev = adapter->netdev;
struct qlcnic_skb_frag *frag;
- if (!spin_trylock(&adapter->tx_clean_lock))
+ if (!spin_trylock(&tx_ring->tx_clean_lock))
return 1;
sw_consumer = tx_ring->sw_consumer;
@@ -840,7 +840,7 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter,
*/
hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer));
done = (sw_consumer == hw_consumer);
- spin_unlock(&adapter->tx_clean_lock);
+ spin_unlock(&tx_ring->tx_clean_lock);
return done;
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 2c8cac0..b8a245a 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1756,7 +1756,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
if (qlcnic_sriov_vf_check(adapter))
qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc);
smp_mb();
- spin_lock(&adapter->tx_clean_lock);
netif_carrier_off(netdev);
adapter->ahw->linkup = 0;
netif_tx_disable(netdev);
@@ -1777,7 +1776,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
for (ring = 0; ring < adapter->drv_tx_rings; ring++)
qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]);
- spin_unlock(&adapter->tx_clean_lock);
}
/* Usage: During suspend and firmware recovery module */
@@ -2172,6 +2170,7 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
}
memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring));
tx_ring->cmd_buf_arr = cmd_buf_arr;
+ spin_lock_init(&tx_ring->tx_clean_lock);
}
if (qlcnic_83xx_check(adapter) ||
@@ -2299,7 +2298,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
rwlock_init(&adapter->ahw->crb_lock);
mutex_init(&adapter->ahw->mem_lock);
- spin_lock_init(&adapter->tx_clean_lock);
INIT_LIST_HEAD(&adapter->mac_list);
qlcnic_register_dcb(adapter);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues.
2013-12-10 17:33 ` [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues Himanshu Madhani
@ 2013-12-10 22:49 ` David Miller
0 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2013-12-10 22:49 UTC (permalink / raw)
To: himanshu.madhani; +Cc: netdev, Dept_NX_Linux_NIC_Driver
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
Date: Tue, 10 Dec 2013 12:33:01 -0500
> From: Himanshu Madhani <himanshu.madhani@qlogic.com>
>
> o commit id 012ec81223aa45d2b80aeafb77392fd1a19c7b10
> ("qlcnic: Multi Tx queue support for 82xx Series adapter.")
> enabled multiple tx queue API's for qlcnic driver.
> During link change event, driver will stop/start Tx queues
> which manages Link up event is received after Tx context is created
> driver needs to call netif_tx_wake_all_queues()
>
> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
This is a symptom of the fact that this driver does not manage it's
queues correctly.
When the carrier is marked off, the core networking will not queue
packets to the device.
You should never manage queue state manually in response to link
state changes, netif_carrir_{on,off}() takes care of everything.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-12-10 22:49 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-10 17:33 [PATCH net 0/5] qlcnic: Bug fixes Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 1/5] qlcnic: Use correct netif api to enable tx queues Himanshu Madhani
2013-12-10 22:49 ` David Miller
2013-12-10 17:33 ` [PATCH net 2/5] qlcnic: Fix diagnostic test for all supported adapters Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 3/5] qlcnic: Fix Tx/SDS ring validation logic Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 4/5] qlcnic: Fix TSS/RSS validation for 83xx/84xx series adapter Himanshu Madhani
2013-12-10 17:33 ` [PATCH net 5/5] qlcnic: Use spinlock per transmit queue Himanshu Madhani
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).