* [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
2013-02-17 5:38 ` Joe Perches
2013-02-17 4:53 ` [PATCH net-next 2/6] qlcnic: fix mailbox interrupt Jitendra Kalsaria
` (4 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Jitendra Kalsaria
From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Add debug messages for FW CDRP command failure.
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | 32 +++++++++++++++++++++-
1 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 4a3bd64..51461ad 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
- dev_err(&pdev->dev, "failed card response code:0x%x\n",
- cmd->rsp.arg[0]);
+ switch (cmd->rsp.arg[0]) {
+ case QLCNIC_RCODE_INVALID_ARGS:
+ dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
+ cmd->rsp.arg[0]);
+ break;
+ case QLCNIC_RCODE_NOT_SUPPORTED:
+ case QLCNIC_RCODE_NOT_IMPL:
+ dev_err(&pdev->dev,
+ "CDRP command not supported: 0x%x.\n",
+ cmd->rsp.arg[0]);
+ break;
+ case QLCNIC_RCODE_NOT_PERMITTED:
+ dev_err(&pdev->dev,
+ "CDRP requested action not permitted: 0x%x.\n",
+ cmd->rsp.arg[0]);
+ break;
+ case QLCNIC_RCODE_INVALID:
+ dev_err(&pdev->dev,
+ "CDRP invalid or unknown cmd received: 0x%x.\n",
+ cmd->rsp.arg[0]);
+ break;
+ case QLCNIC_RCODE_TIMEOUT:
+ dev_err(&pdev->dev, "CDRP command timeout: 0x%x.\n",
+ cmd->rsp.arg[0]);
+ break;
+ default:
+ dev_err(&pdev->dev, "CDRP command failed: 0x%x.\n",
+ cmd->rsp.arg[0]);
+ break;
+ }
} else if (rsp == QLCNIC_CDRP_RSP_OK)
cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
2013-02-17 4:53 ` [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message Jitendra Kalsaria
@ 2013-02-17 5:38 ` Joe Perches
2013-02-17 9:40 ` Jitendra Kalsaria
0 siblings, 1 reply; 9+ messages in thread
From: Joe Perches @ 2013-02-17 5:38 UTC (permalink / raw)
To: Jitendra Kalsaria; +Cc: davem, netdev, sony.chacko, Dept_NX_Linux_NIC_Driver
On Sat, 2013-02-16 at 23:53 -0500, Jitendra Kalsaria wrote:
> From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
>
> Add debug messages for FW CDRP command failure.
These aren't debug messages but are more detailed.
> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
[]
> @@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
> cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
> } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
> cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
> - dev_err(&pdev->dev, "failed card response code:0x%x\n",
> - cmd->rsp.arg[0]);
> + switch (cmd->rsp.arg[0]) {
> + case QLCNIC_RCODE_INVALID_ARGS:
> + dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
> + cmd->rsp.arg[0]);
> + break;
Not sure you care about object size much, but
it's much smaller object code to do:
const char *fmt;
switch (cmd->rsp.arg[0]);
case FOO:
fmt = "...";
break;
etc...
}
dev_err(&pdev->dev, fmt, cmd->rsp.arg[0]);
Also, the #defines are decimal, I don't know why you
print them out as hex or if you need to print them
at all really.
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
2013-02-17 5:38 ` Joe Perches
@ 2013-02-17 9:40 ` Jitendra Kalsaria
0 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 9:40 UTC (permalink / raw)
To: Joe Perches; +Cc: David Miller, netdev, Sony Chacko, Dept-NX Linux NIC Driver
On 2/16/13 9:38 PM, "Joe Perches" <joe@perches.com> wrote:
>On Sat, 2013-02-16 at 23:53 -0500, Jitendra Kalsaria wrote:
>> From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
>>
>> Add debug messages for FW CDRP command failure.
>
>These aren't debug messages but are more detailed.
>
>> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
>>b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
>[]
>> @@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter
>>*adapter,
>> cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
>> } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
>> cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
>> - dev_err(&pdev->dev, "failed card response code:0x%x\n",
>> - cmd->rsp.arg[0]);
>> + switch (cmd->rsp.arg[0]) {
>> + case QLCNIC_RCODE_INVALID_ARGS:
>> + dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
>> + cmd->rsp.arg[0]);
>> + break;
>
>Not sure you care about object size much, but
>it's much smaller object code to do:
>
> const char *fmt;
> switch (cmd->rsp.arg[0]);
> case FOO:
> fmt = "...";
> break;
> etc...
> }
>
> dev_err(&pdev->dev, fmt, cmd->rsp.arg[0]);
>
>Also, the #defines are decimal, I don't know why you
>print them out as hex or if you need to print them
>at all really.
Joe,
Yes, your suggestion will definitely reduce object code and we don't
really need
to print them all, will print in decimal. I will re-spin series and submit
again.
Thanks!
Jiten
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net-next 2/6] qlcnic: fix mailbox interrupt.
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 3/6] qlcnic: refactor Legacy interrupt handling for 83xx Jitendra Kalsaria
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver,
Sucheta Chakraborty
From: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
o Config interrupt is not needed for mailbox interrupts.
Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
.../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 4 +--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | 27 +++++++++++++++++--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 17 +++---------
3 files changed, 29 insertions(+), 19 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index f7b39d1..e92cc52 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -497,8 +497,6 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
/* Enable mailbox interrupt */
qlcnic_83xx_enable_mbx_intrpt(adapter);
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- err = qlcnic_83xx_config_intrpt(adapter, 1);
return err;
}
@@ -1915,7 +1913,7 @@ int qlcnic_83xx_config_intrpt(struct qlcnic_adapter *adapter, bool op_type)
u32 val, temp;
struct qlcnic_cmd_args cmd;
- max_ints = adapter->ahw->num_msix;
+ max_ints = adapter->ahw->num_msix - 1;
qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
cmd.req.arg[1] = max_ints;
for (i = 0, index = 2; i < max_ints; i++) {
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 51461ad..938b0ee 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -606,9 +606,17 @@ int qlcnic_fw_create_ctx(struct qlcnic_adapter *dev)
dev->flags &= ~QLCNIC_NEED_FLR;
}
+ if (qlcnic_83xx_check(dev) && (dev->flags & QLCNIC_MSIX_ENABLED)) {
+ if (dev->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
+ err = qlcnic_83xx_config_intrpt(dev, 1);
+ if (err)
+ return err;
+ }
+ }
+
err = qlcnic_fw_cmd_create_rx_ctx(dev);
if (err)
- return err;
+ goto err_out;
for (ring = 0; ring < dev->max_drv_tx_rings; ring++) {
err = qlcnic_fw_cmd_create_tx_ctx(dev,
@@ -617,18 +625,25 @@ int qlcnic_fw_create_ctx(struct qlcnic_adapter *dev)
if (err) {
qlcnic_fw_cmd_destroy_rx_ctx(dev);
if (ring == 0)
- return err;
+ goto err_out;
for (i = 0; i < ring; i++)
qlcnic_fw_cmd_destroy_tx_ctx(dev,
&dev->tx_ring[i]);
- return err;
+ goto err_out;
}
}
set_bit(__QLCNIC_FW_ATTACHED, &dev->state);
return 0;
+
+err_out:
+ if (qlcnic_83xx_check(dev) && (dev->flags & QLCNIC_MSIX_ENABLED)) {
+ if (dev->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
+ qlcnic_83xx_config_intrpt(dev, 0);
+ }
+ return err;
}
void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter)
@@ -640,6 +655,12 @@ void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter)
for (ring = 0; ring < adapter->max_drv_tx_rings; ring++)
qlcnic_fw_cmd_destroy_tx_ctx(adapter,
&adapter->tx_ring[ring]);
+
+ if (qlcnic_83xx_check(adapter) &&
+ (adapter->flags & QLCNIC_MSIX_ENABLED)) {
+ if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
+ qlcnic_83xx_config_intrpt(adapter, 0);
+ }
/* Allow dma queues to drain after context reset */
mdelay(20);
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index b953168..f084dc1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1965,11 +1965,8 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return 0;
err_out_disable_mbx_intr:
- if (qlcnic_83xx_check(adapter)) {
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- qlcnic_83xx_config_intrpt(adapter, 0);
+ if (qlcnic_83xx_check(adapter))
qlcnic_83xx_free_mbx_intr(adapter);
- }
err_out_disable_msi:
qlcnic_teardown_intr(adapter);
@@ -2015,8 +2012,6 @@ static void qlcnic_remove(struct pci_dev *pdev)
unregister_netdev(netdev);
if (qlcnic_83xx_check(adapter)) {
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- qlcnic_83xx_config_intrpt(adapter, 0);
qlcnic_83xx_free_mbx_intr(adapter);
qlcnic_83xx_register_nic_idc_func(adapter, 0);
cancel_delayed_work_sync(&adapter->idc_aen_work);
@@ -3107,8 +3102,6 @@ static pci_ers_result_t qlcnic_io_error_detected(struct pci_dev *pdev,
qlcnic_down(adapter, netdev);
if (qlcnic_83xx_check(adapter)) {
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- qlcnic_83xx_config_intrpt(adapter, 0);
qlcnic_83xx_free_mbx_intr(adapter);
qlcnic_83xx_register_nic_idc_func(adapter, 0);
cancel_delayed_work_sync(&adapter->idc_aen_work);
@@ -3203,13 +3196,11 @@ int qlcnic_set_max_rss(struct qlcnic_adapter *adapter, u8 data, size_t len)
if (netif_running(netdev))
__qlcnic_down(adapter, netdev);
- if (qlcnic_83xx_check(adapter)) {
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- qlcnic_83xx_config_intrpt(adapter, 0);
+ qlcnic_detach(adapter);
+
+ if (qlcnic_83xx_check(adapter))
qlcnic_83xx_free_mbx_intr(adapter);
- }
- qlcnic_detach(adapter);
qlcnic_teardown_intr(adapter);
err = qlcnic_setup_intr(adapter, data);
if (err) {
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH net-next 3/6] qlcnic: refactor Legacy interrupt handling for 83xx
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 2/6] qlcnic: fix mailbox interrupt Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 4/6] qlcnic: fix estimation of receive MSS in case of LRO for 83xx adapter Jitendra Kalsaria
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
From: Himanshu Madhani <himanshu.madhani@qlogic.com>
o Cleanly seperate 83xx Legacy interrupt handling code from 82xx
o Update 83xx Legacy interrupt handling code to match with the spec
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
.../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 135 +++++++++++++++++---
.../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 3 +
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 30 +----
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 37 ++++--
4 files changed, 148 insertions(+), 57 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index e92cc52..4b9e062 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -388,12 +388,45 @@ int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr)
return 0;
}
-inline void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
- struct qlcnic_host_sds_ring *sds_ring)
+inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter)
+{
+ writel(0, adapter->tgt_mask_reg);
+}
+
+/* Enable MSI-x and INT-x interrupts */
+void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
+ struct qlcnic_host_sds_ring *sds_ring)
{
writel(0, sds_ring->crb_intr_mask);
- if (!QLCNIC_IS_MSI_FAMILY(adapter))
- writel(0, adapter->tgt_mask_reg);
+}
+
+/* Disable MSI-x and INT-x interrupts */
+void qlcnic_83xx_disable_intr(struct qlcnic_adapter *adapter,
+ struct qlcnic_host_sds_ring *sds_ring)
+{
+ writel(1, sds_ring->crb_intr_mask);
+}
+
+inline void qlcnic_83xx_enable_legacy_msix_mbx_intr(struct qlcnic_adapter
+ *adapter)
+{
+ u32 mask;
+
+ /* Mailbox in MSI-x mode and Legacy Interrupt share the same
+ * source register. We could be here before contexts are created
+ * and sds_ring->crb_intr_mask has not been initialized, calculate
+ * BAR offset for Interrupt Source Register
+ */
+ mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
+ writel(0, adapter->ahw->pci_base0 + mask);
+}
+
+inline void qlcnic_83xx_disable_mbx_intr(struct qlcnic_adapter *adapter)
+{
+ u32 mask;
+
+ mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
+ writel(1, adapter->ahw->pci_base0 + mask);
}
static inline void qlcnic_83xx_get_mbx_data(struct qlcnic_adapter *adapter,
@@ -419,23 +452,66 @@ irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
adapter->stats.spurious_intr++;
return IRQ_NONE;
}
+ /* The barrier is required to ensure writes to the registers */
+ wmb();
+
/* clear the interrupt trigger control register */
writel(0, adapter->isr_int_vec);
+ intr_val = readl(adapter->isr_int_vec);
do {
intr_val = readl(adapter->tgt_status_reg);
if (QLC_83XX_INTX_FUNC(intr_val) != ahw->pci_func)
break;
retries++;
} while (QLC_83XX_VALID_INTX_BIT30(intr_val) &&
- (retries < QLC_83XX_LEGACY_INTX_MAX_RETRY));
+ (retries < QLC_83XX_LEGACY_INTX_MAX_RETRY));
- if (retries == QLC_83XX_LEGACY_INTX_MAX_RETRY) {
- dev_info(&adapter->pdev->dev,
- "Reached maximum retries to clear legacy interrupt\n");
+ return IRQ_HANDLED;
+}
+
+static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
+{
+ u32 resp, event;
+
+ if (!spin_trylock(&adapter->ahw->mbx_lock)) {
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+ return;
+ }
+
+ resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
+ if (!(resp & QLCNIC_SET_OWNER))
+ goto out;
+ event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
+ if (event & QLCNIC_MBX_ASYNC_EVENT)
+ qlcnic_83xx_process_aen(adapter);
+out:
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+ spin_unlock(&adapter->ahw->mbx_lock);
+}
+
+irqreturn_t qlcnic_83xx_intr(int irq, void *data)
+{
+ struct qlcnic_adapter *adapter = data;
+ struct qlcnic_host_sds_ring *sds_ring;
+ struct qlcnic_hardware_context *ahw = adapter->ahw;
+
+ if (qlcnic_83xx_clear_legacy_intr(adapter) == IRQ_NONE)
return IRQ_NONE;
+
+ qlcnic_83xx_poll_process_aen(adapter);
+
+ if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
+ ahw->diag_cnt++;
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+ return IRQ_HANDLED;
}
- mdelay(QLC_83XX_LEGACY_INTX_DELAY);
+ if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+ } else {
+ sds_ring = &adapter->recv_ctx->sds_rings[0];
+ napi_schedule(&sds_ring->napi);
+ }
return IRQ_HANDLED;
}
@@ -460,14 +536,20 @@ done:
void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter)
{
- u32 val = 0;
- u32 num_msix = adapter->ahw->num_msix - 1;
+ u32 val = 0, num_msix = adapter->ahw->num_msix - 1;
- val = (num_msix << 8);
+ if (adapter->flags & QLCNIC_MSIX_ENABLED)
+ num_msix = adapter->ahw->num_msix - 1;
+ else
+ num_msix = 0;
QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val);
- if (adapter->flags & QLCNIC_MSIX_ENABLED)
- free_irq(adapter->msix_entries[num_msix].vector, adapter);
+
+ qlcnic_83xx_disable_mbx_intr(adapter);
+
+ msleep(20);
+ synchronize_irq(adapter->msix_entries[num_msix].vector);
+ free_irq(adapter->msix_entries[num_msix].vector, adapter);
}
int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
@@ -486,13 +568,23 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
handler = qlcnic_83xx_handle_aen;
val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector;
snprintf(name, (IFNAMSIZ + 4),
- "%s[%s]", adapter->netdev->name, "aen");
+ "%s[%s]", "qlcnic", "aen");
err = request_irq(val, handler, flags, name, adapter);
if (err) {
dev_err(&adapter->pdev->dev,
"failed to register MBX interrupt\n");
return err;
}
+ } else {
+ handler = qlcnic_83xx_intr;
+ val = adapter->msix_entries[0].vector;
+ err = request_irq(val, handler, flags, "qlcnic", adapter);
+ if (err) {
+ dev_err(&adapter->pdev->dev,
+ "failed to register INTx interrupt\n");
+ return err;
+ }
+ qlcnic_83xx_clear_legacy_intr_mask(adapter);
}
/* Enable mailbox interrupt */
@@ -604,6 +696,7 @@ void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *adapter)
val = BIT_2;
QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val);
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
}
void qlcnic_83xx_check_vf(struct qlcnic_adapter *adapter,
@@ -1194,7 +1287,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
sds_ring = &adapter->recv_ctx->sds_rings[ring];
- writel(1, sds_ring->crb_intr_mask);
+ qlcnic_83xx_disable_intr(adapter, sds_ring);
}
}
@@ -1723,20 +1816,24 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data)
{
struct qlcnic_adapter *adapter = data;
- unsigned long flags;
u32 mask, resp, event;
- spin_lock_irqsave(&adapter->ahw->mbx_lock, flags);
+ if (!spin_trylock(&adapter->ahw->mbx_lock)) {
+ qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+ return IRQ_HANDLED;
+ }
+
resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
if (!(resp & QLCNIC_SET_OWNER))
goto out;
+
event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
if (event & QLCNIC_MBX_ASYNC_EVENT)
qlcnic_83xx_process_aen(adapter);
out:
mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
writel(0, adapter->ahw->pci_base0 + mask);
- spin_unlock_irqrestore(&adapter->ahw->mbx_lock, flags);
+ spin_unlock(&adapter->ahw->mbx_lock);
return IRQ_HANDLED;
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index f60e28a..127fa27 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -368,9 +368,12 @@ irqreturn_t qlcnic_83xx_handle_aen(int, void *);
int qlcnic_83xx_get_port_info(struct qlcnic_adapter *);
void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *);
irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *);
+irqreturn_t qlcnic_83xx_intr(int, void *);
irqreturn_t qlcnic_83xx_tmp_intr(int, void *);
void qlcnic_83xx_enable_intr(struct qlcnic_adapter *,
struct qlcnic_host_sds_ring *);
+void qlcnic_83xx_disable_intr(struct qlcnic_adapter *,
+ struct qlcnic_host_sds_ring *);
void qlcnic_83xx_check_vf(struct qlcnic_adapter *,
const struct pci_device_id *);
void qlcnic_83xx_process_aen(struct qlcnic_adapter *);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 93839f8..662292d 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -1558,24 +1558,6 @@ skip:
return count;
}
-static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
-{
- unsigned long flags;
- u32 mask, resp, event;
-
- spin_lock_irqsave(&adapter->ahw->mbx_lock, flags);
- resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
- if (!(resp & QLCNIC_SET_OWNER))
- goto out;
- event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
- if (event & QLCNIC_MBX_ASYNC_EVENT)
- qlcnic_83xx_process_aen(adapter);
-out:
- mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
- writel(0, adapter->ahw->pci_base0 + mask);
- spin_unlock_irqrestore(&adapter->ahw->mbx_lock, flags);
-}
-
static int qlcnic_83xx_poll(struct napi_struct *napi, int budget)
{
int tx_complete;
@@ -1589,15 +1571,11 @@ static int qlcnic_83xx_poll(struct napi_struct *napi, int budget)
/* tx ring count = 1 */
tx_ring = adapter->tx_ring;
- if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
- qlcnic_83xx_poll_process_aen(adapter);
-
tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget);
work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget);
if ((work_done < budget) && tx_complete) {
napi_complete(&sds_ring->napi);
- if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
- qlcnic_83xx_enable_intr(adapter, sds_ring);
+ qlcnic_83xx_enable_intr(adapter, sds_ring);
}
return work_done;
@@ -1653,7 +1631,8 @@ void qlcnic_83xx_napi_enable(struct qlcnic_adapter *adapter)
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
sds_ring = &recv_ctx->sds_rings[ring];
napi_enable(&sds_ring->napi);
- qlcnic_83xx_enable_intr(adapter, sds_ring);
+ if (adapter->flags & QLCNIC_MSIX_ENABLED)
+ qlcnic_83xx_enable_intr(adapter, sds_ring);
}
if (adapter->flags & QLCNIC_MSIX_ENABLED) {
@@ -1677,7 +1656,8 @@ void qlcnic_83xx_napi_disable(struct qlcnic_adapter *adapter)
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
sds_ring = &recv_ctx->sds_rings[ring];
- writel(1, sds_ring->crb_intr_mask);
+ if (adapter->flags & QLCNIC_MSIX_ENABLED)
+ qlcnic_83xx_disable_intr(adapter, sds_ring);
napi_synchronize(&sds_ring->napi);
napi_disable(&sds_ring->napi);
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index f084dc1..3a0f182 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1269,20 +1269,27 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
handler = qlcnic_msi_intr;
else {
flags |= IRQF_SHARED;
- handler = qlcnic_intr;
+ if (qlcnic_82xx_check(adapter))
+ handler = qlcnic_intr;
+ else
+ handler = qlcnic_83xx_intr;
}
}
adapter->irq = netdev->irq;
if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
- for (ring = 0; ring < adapter->max_sds_rings; ring++) {
- sds_ring = &recv_ctx->sds_rings[ring];
- snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ,
- "%s[%d]", netdev->name, ring);
- err = request_irq(sds_ring->irq, handler, flags,
- sds_ring->name, sds_ring);
- if (err)
- return err;
+ if (qlcnic_82xx_check(adapter) ||
+ (qlcnic_83xx_check(adapter) &&
+ (adapter->flags & QLCNIC_MSIX_ENABLED))) {
+ for (ring = 0; ring < adapter->max_sds_rings; ring++) {
+ sds_ring = &recv_ctx->sds_rings[ring];
+ snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ,
+ "%s[%d]", netdev->name, ring);
+ err = request_irq(sds_ring->irq, handler, flags,
+ sds_ring->name, sds_ring);
+ if (err)
+ return err;
+ }
}
if (qlcnic_83xx_check(adapter) &&
(adapter->flags & QLCNIC_MSIX_ENABLED)) {
@@ -1292,7 +1299,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
tx_ring = &adapter->tx_ring[ring];
snprintf(tx_ring->name, sizeof(int) + IFNAMSIZ,
"%s[%d]", netdev->name,
- adapter->max_sds_rings + ring);
+ adapter->max_sds_rings + ring);
err = request_irq(tx_ring->irq, handler, flags,
tx_ring->name, tx_ring);
if (err)
@@ -1313,9 +1320,13 @@ qlcnic_free_irq(struct qlcnic_adapter *adapter)
struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
- for (ring = 0; ring < adapter->max_sds_rings; ring++) {
- sds_ring = &recv_ctx->sds_rings[ring];
- free_irq(sds_ring->irq, sds_ring);
+ if (qlcnic_82xx_check(adapter) ||
+ (qlcnic_83xx_check(adapter) &&
+ (adapter->flags & QLCNIC_MSIX_ENABLED))) {
+ for (ring = 0; ring < adapter->max_sds_rings; ring++) {
+ sds_ring = &recv_ctx->sds_rings[ring];
+ free_irq(sds_ring->irq, sds_ring);
+ }
}
if (qlcnic_83xx_check(adapter)) {
for (ring = 0; ring < adapter->max_drv_tx_rings;
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH net-next 4/6] qlcnic: fix estimation of receive MSS in case of LRO for 83xx adapter
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
` (2 preceding siblings ...)
2013-02-17 4:53 ` [PATCH net-next 3/6] qlcnic: refactor Legacy interrupt handling for 83xx Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 5/6] qlcnic: fix ping resumption to a VM after a live migration Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 6/6] qlcnic: Bump up the version to 5.1.34 Jitendra Kalsaria
5 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Shahed Shaikh
From: Shahed Shaikh <shahed.shaikh@qlogic.com>
Set gso_size to MSS obtained from adapter to avoid incorrect estimation
of receive MSS, which would lead to delayed ACKs in some traffic patterns
Example:
Send two or three packets and wait for ack and only then send
remaining packets.
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
.../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 1 +
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 13 ++++++++++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 24 +++++++++++++------
3 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 127fa27..61f81f6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -223,6 +223,7 @@ struct qlc_83xx_idc {
#define QLC_83XX_GET_LSO_CAPABILITY(val) (val & 0x40)
#define QLC_83XX_GET_HW_LRO_CAPABILITY(val) (val & 0x400)
#define QLC_83XX_GET_VLAN_ALIGN_CAPABILITY(val) (val & 0x4000)
+#define QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(val) (val & 0x20000)
#define QLC_83XX_VIRTUAL_NIC_MODE 0xFF
#define QLC_83XX_DEFAULT_MODE 0x0
#define QLCNIC_BRDTYPE_83XX_10G 0x0083
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 662292d..2990f45 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -88,6 +88,8 @@
#define qlcnic_get_lro_sts_mss(sts_data1) \
((sts_data1 >> 32) & 0x0FFFF)
+#define qlcnic_83xx_get_lro_sts_mss(sts) ((sts) & 0xffff)
+
/* opcode field in status_desc */
#define QLCNIC_SYN_OFFLOAD 0x03
#define QLCNIC_RXPKT_DESC 0x04
@@ -1423,7 +1425,7 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
bool push;
int l2_hdr_offset, l4_hdr_offset;
int index;
- u16 lro_length, length, data_offset;
+ u16 lro_length, length, data_offset, gso_size;
u16 vid = 0xffff;
if (unlikely(ring > adapter->max_rds_rings))
@@ -1478,6 +1480,15 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
th->psh = push;
length = skb->len;
+ if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) {
+ gso_size = qlcnic_83xx_get_lro_sts_mss(sts_data[0]);
+ skb_shinfo(skb)->gso_size = gso_size;
+ if (skb->protocol == htons(ETH_P_IPV6))
+ skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
+ else
+ skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+ }
+
if (vid != 0xffff)
__vlan_hwaccel_put_tag(skb, vid);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 3a0f182..e03017a 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1339,11 +1339,24 @@ qlcnic_free_irq(struct qlcnic_adapter *adapter)
}
}
+static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter)
+{
+ u32 capab = 0;
+
+ if (qlcnic_82xx_check(adapter)) {
+ if (adapter->ahw->capabilities2 &
+ QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
+ adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
+ } else {
+ capab = adapter->ahw->capabilities;
+ if (QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(capab))
+ adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
+ }
+}
+
int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
{
int ring;
- u32 capab2;
-
struct qlcnic_host_rds_ring *rds_ring;
if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
@@ -1353,12 +1366,7 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
return 0;
if (qlcnic_set_eswitch_port_config(adapter))
return -EIO;
-
- if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
- capab2 = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
- if (capab2 & QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
- adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
- }
+ qlcnic_get_lro_mss_capability(adapter);
if (qlcnic_fw_create_ctx(adapter))
return -EIO;
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH net-next 5/6] qlcnic: fix ping resumption to a VM after a live migration
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
` (3 preceding siblings ...)
2013-02-17 4:53 ` [PATCH net-next 4/6] qlcnic: fix estimation of receive MSS in case of LRO for 83xx adapter Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
2013-02-17 4:53 ` [PATCH net-next 6/6] qlcnic: Bump up the version to 5.1.34 Jitendra Kalsaria
5 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Shahed Shaikh
From: Shahed Shaikh <shahed.shaikh@qlogic.com>
Delete the MAC address of a VM, from the adapter's embedded switch,
after the VM had been migrated out of this adapter/server.
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 5 +
drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c | 18 +++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 145 ++++++++++++++++++++--
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 21 +++
4 files changed, 177 insertions(+), 12 deletions(-)
XXXX --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
XXXXX 61b594c..01e9ea1 100644
XXX a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
XXX b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
XX -1008,9 +1008,12 @@ struct qlcnic_adapter {
XXXXXX delayed_work idc_aen_work;
XXXXXX qlcnic_filter_hash fhash;
X struct qlcnic_filter_hash rx_fhash;
XXXXXXXXXX tx_clean_lock;
XXXXXXXXXX mac_learn_lock;
X /* spinlock for catching rcv filters for eswitch traffic */
X spinlock_t rx_mac_learn_lock;
XXX file_prd_off; /*File fw product offset*/
XXX fw_version;
XXXXX struct firmware *fw;
XX -1506,6 +1509,8 @@ int qlcnic_init_pci_info(struct qlcnic_adapter *);
XXX qlcnic_set_default_offload_settings(struct qlcnic_adapter *);
XXX qlcnic_reset_npar_config(struct qlcnic_adapter *);
XXX qlcnic_set_eswitch_port_config(struct qlcnic_adapter *);
XXXXX qlcnic_add_lb_filter(struct qlcnic_adapter *, struct sk_buff *, int,
X __le16);
XX
X QLOGIC Board information
XX
XXXX --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
XXXXX 51716ab..325e11e 100644
XXX a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
XXX b/drivers/net/ethernet/qlogicXXXXXXXXXXXXXXXXXXX
XX -578,7 +578,8 @@ void qlcnic_prune_lb_filters(struct qlcnic_adapter *adapter)
XXXXXX qlcnic_filter *tmp_fil;
XXXXXX hlist_node *tmp_hnode, *n;
XXXXXX hlist_head *head;
X int i, time;
X int i;
X unsigned long time;
XX cmd;
XXX (i = 0; i < adapter->fhash.fbucket_size; i++) {
XX -600,6 +601,21 @@ void qlcnic_prune_lb_filters(struct qlcnic_adapter *adapter)
X
X
X
X for (i = 0; i < adapter->rx_fhash.fbucket_size; i++) {
X head = &(adapter->rx_fhash.fhead[i]);
X
X hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode)
X {
X time = tmp_fil->ftime;
X if (jiffies > (QLCNIC_FILTER_AGE * HZ + time)) {
X spin_lock_bh(&adapter->rx_mac_learn_lock);
X adapter->rx_fhash.fnum--;
X hlist_del(&tmp_fil->fnode);
X spin_unlock_bh(&adapter->rx_mac_learn_lock);
X kfree(tmp_fil);
X }
X }
X }
X
XXXX qlcnic_delete_lb_filters(struct qlcnic_adapter *adapter)
XXXX --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
XXXXX 2990f45..6387e0c 100644
XXX a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
XXX b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
XX -152,6 +152,89 @@ static inline u32 qlcnic_get_ref_handle(struct qlcnic_adapter *adapter,
XXXXXX handle;
X
XXXXXXX inline int qlcniXXXXXXXXXXXXXXXXXXXX sts_data)
XX
X return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0;
XX
X
XXXXX qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
X int loopback_pkt, __le16 vlan_id)
XX
X struct ethhdr *phdr = (struct ethhdr *)(skb->data);
X struct qlcnic_filter *fil, *tmp_fil;
X struct hlist_node *tmp_hnode, *n;
X struct hlist_head *head;
X unsigned long time;
X u64 src_addr = 0;
X u8 hindex, found = 0, op;
X int ret;
X
X memcpy(&src_addr, phdr->h_source, ETH_ALEN);
X
X if (loopback_pkt) {
X if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax)
X return;
X
X hindex = qlcnic_mac_hash(src_addr) &
X (adapter->fhash.fbucket_size - 1);
X head = &(adapter->rx_fhash.fhead[hindex]);
X
X hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode) {
X if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
X tmp_fil->vlan_id == vlan_id) {
X time = tmp_fil->ftime;
X if (jiffies > (QLCNIC_READD_AGE * HZ + time))
X tmp_fil->ftime = jiffies;
X return;
X }
X }
X
X fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC);
X if (!fil)
X return;
X
X fil->ftime = jiffies;
X memcpy(fil->faddr, &src_addr, ETH_ALEN);
X fil->vlan_id = vlan_id;
X spin_lock(&adapter->rx_mac_learn_lock);
X hlist_add_head(&(fil->fnode), hXXXXX
X adapter->rx_fhash.fnum++;
X spin_unlock(&adapter->rx_mac_learn_lock);
X } else {
X hindex = qlcnic_mac_hash(src_addr) &
X (adapter->fhash.fbucket_size - 1);
X head = &(adapter->rx_fhash.fhead[hindex]);
X spin_lock(&adapter->rx_mac_learn_lock);
X hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode) {
X if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
X tmp_fil->vlan_id == vlan_id) {
X found = 1;
X break;
X }
X }
X
X if (!found) {
X spin_unlock(&adapter->rx_mac_learn_lock);
X return;
X }
X
X op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
X ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr,
X vlan_id, op);
X if (!ret) {
X op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
X ret = qlcnic_sre_macaddr_change(adapter,
X (u8 *)&src_addr,
X vlan_id, op);
X if (!ret) {
X hlist_del(&(tmp_fil->fnode));
X adapter->rx_fhash.fnum--;
X }
X }
X spin_unlock(&adapter->rx_mac_learn_lock);
X }
XX
X
XXXX qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
XXXXXX vlan_id)
X
XX -207,9 +290,6 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
XXXXXXX
X
X /* Only NPAR capable devices support vlan based learning */
X if (adapter->flags & QLCNIC_ESWITCH_ENXXXXXX
X vlan_id = first_desc->vlan_TCI;
XXXXXXXXXXXXXXXXX phdr->h_source, ETH_ALEN);
XXXXXX = qlcnic_mac_hash(src_addr) & (adapter->fhash.fbucket_size - 1);
XXXX = &(adapter->fhash.fhead[hindex]);
XX -920,8 +1000,8 @@ qlcnic_process_rcv(struct qlcnic_adapter *adapter,
XXXXXX qlcnic_rx_buffer *buffer;
XXXXXX sk_buff *skb;
XXXXXX qlcnic_host_rds_ring *rds_ring;
X int index, length, cksum, pkt_offset;
X u16 vid = 0xffff;
X int index, length, cksum, pkt_offset, is_lb_pkt;
X u16 vid = 0xffff, t_vid;
XX (unlikely(ring >= adapter->max_rds_rings))
XXXXXX NULL;
XX -941,6 +1021,14 @@ qlcnic_process_rcv(struct qlcnic_adapter *adapter,
XX (!skb)
XXXXXX buffer;
X if (adapter->drv_mac_learn &&
X (adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
X t_vid = 0;
X is_lb_pkt = qlcnic_82xx_is_lb_pkt(sts_data0);
X qlcnic_add_lb_filter(adapter, skb, is_lb_pkt,
X cpu_to_le16(t_vid));
X }
X
XX (length > rds_ring->skb_size)
XXXXXXXXXXXX rds_ring->skb_size);
XXXX
XX -985,8 +1073,8 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
XXXXXX ipv6hdr *ipv6h;
XXXXXX tcphdr *th;
XXXX push, timestamp;
X int index, l2_hdr_offset, l4_hdr_offset;
X u16 lro_length, length, data_offset, vid = 0xffff;
X int index, l2_hdr_offset, l4_hdr_offset, is_lb_pkt;
X u16 lro_length, lengXXX data_offset, t_vid, vid = 0xffff;
XXX seq_number;
XX (unlikely(ring > adapter->max_rds_rings))
XX -1011,6 +1099,14 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
XX (!skb)
XXXXXX buffer;
X if (adapter->drv_mac_learn &&
X (adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
X t_vid = 0;
X is_lb_pkt = qlcnic_82xx_is_lb_pkt(sts_data0);
X qlcnic_add_lb_filter(adapter, skb, is_lb_pkt,
X cpu_to_le16(t_vid));
X }
X
XX (timestamp)
XXXXXXXXXXX = l4_hdr_offset + QLC_TCP_TS_HDR_SIZE;
XXXX
XX -1357,6 +1453,17 @@ void qlcnic_82xx_napi_disable(struct qlcnic_adapter *adapter)
X
X
XXXXXXXX QLC_83XX_NORMAL_LB_PKT (1ULL << 36)
XXXXXXXX QLC_83XX_LRO_LB_PKT (1ULL << 46)
X
XXXXXXX inline int qlcnic_83xx_is_lb_pkt(u64 sts_data, int lro_pkt)
XX
X if (lro_pkt)
X return (sts_data & QLC_83XX_LRO_LB_PKT) ? 1 : 0;
X else
X return (sts_data & QLC_83XX_NORMAL_LB_PKT) ? 1 : 0;
XX
X
XXXXXX struct qlcnic_rx_buffer *
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX qlcnic_adapter *adapter,
XXXXXX qlcnic_host_sds_ring *sds_ring,
XX -1367,8 +1474,8 @@ qlcnic_83xx_process_rcv(struct qlcnic_adapter *adapter,
XXXXXX qlcnic_rx_buffer *buffer;
XXXXXX sk_buff *skb;
XXXXXX qlcnic_host_rds_ring *rds_ring;
X int index, length, cksum;
X u16 vid = 0xffff;
X int index, length, cksum, is_lb_pktX
X u16 vid = 0xffff, t_vid;
XX (unlikely(ring >= adapter->max_rds_rings))
XXXXXX NULL;
XX -1386,6 +1493,14 @@ qlcnic_83xx_process_rcv(struct qlcnic_adapter *adapter,
XX (!skb)
XXXXXX buffer;
X if (adapter->drv_mac_learn &&
X (adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
X t_vid = 0;
X is_lb_pkt = qlcnic_83xx_is_lb_pkt(sts_data[1], 0);
X qlcnic_add_lb_filter(adapter, skb, is_lb_pkt,
X cpu_to_le16(t_vid));
X }
X
XX (length > rds_ring->skb_size)
XXXXXXXXXXXX rds_ring->skb_size);
XXXX
XX -1424,9 +1539,9 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
XXXXXX tcphdr *th;
XXXX push;
XXX l2_hdr_offset, l4_hdr_offset;
X int index;
X int index, is_lb_pkt;
XXX lro_length, length, data_offset, gso_size;
X u16 vid = 0xffff;
X u16 vid = 0xffff, t_vid;
XX (unlikely(ring > adapter->max_rds_rings))
XXXXXX NULL;
XX -1447,6 +1562,14 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
XXX = qlcnic_process_rxbuf(adapter, rds_ring, index, STATUS_CKSUM_OK);
XX (!skb)
XXXXXX buffer;
X
X if (adapter->drv_mac_learn &&
X (adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
X t_vid = 0;
X is_lb_pkt = qlcnic_83xx_is_lb_pkt(sts_data[1], 1);
X qlcnic_add_lb_filter(adapter, skb, is_lb_pkt,
X cpu_to_le16(t_vid));
X }
XX (qlcnic_83xxXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXX = l4_hdr_offset + QLCNIC_TCP_TS_HDR_SIZE;
XXXX
XXXX --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
XXXXX e03017a..5d5fd06 100644
XXX a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
XXX b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
XX -2208,6 +2208,7 @@ void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
XXXXXXXXXXXX = adapter->ahw->act_pci_func;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X spin_lock_init(&adapter->rx_mac_learn_lock);
XX (qlcnic_82xx_check(adapter)) {
XXXXXXXXXXX = QLCNIC_LB_MAX_FILTERS;
XX -2231,6 +2232,20 @@ void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
XXX (i = 0; i < adapter->fhash.fbucket_size; i++)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X
X adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size;
X
X head = kcalloc(adapter->rx_fhash.fbucket_size,
X sizeof(struct hlist_head), GFP_ATOMIC);
X
X if (!head)
X return;
X
X adapter->rx_fhash.fmax = (filter_size / act_pci_func);
X adapter->rx_fhash.fhead = head;
X
X for (i = 0; i < adapter->rx_fhash.fbucket_size; i++)
X INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]);
X
XXXXXX void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter)
XX -2240,6 XXXXXXXX @@ static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter)
XXXXXXXXXXXXXXXXXXXX = NULL;
XXXXXXXXXXXXXXXXXXX = 0;
X
X if (adapter->rx_fhash.fmax && adapter->rx_fhash.fhead)
X kfree(adapter->rx_fhash.fhead);
X
X adapter->rx_fhash.fmax = 0;
X adapter->rx_fhash.fhead = NULL;
X
XXX qlcnic_check_temp(struct qlcnic_adapter *adapter)
XX
XXXXX
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH net-next 6/6] qlcnic: Bump up the version to 5.1.34
2013-02-17 4:53 [PATCH net-next 0/6] qlcnic: bug fixes and feature updates Jitendra Kalsaria
` (4 preceding siblings ...)
2013-02-17 4:53 ` [PATCH net-next 5/6] qlcnic: fix ping resumption to a VM after a live migration Jitendra Kalsaria
@ 2013-02-17 4:53 ` Jitendra Kalsaria
5 siblings, 0 replies; 9+ messages in thread
From: Jitendra Kalsaria @ 2013-02-17 4:53 UTC (permalink / raw)
To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Jitendra Kalsaria
From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 01e9ea1..11c3db6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -38,8 +38,8 @@
#define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MINOR 1
-#define _QLCNIC_LINUX_SUBVERSION 33
-#define QLCNIC_LINUX_VERSIONID "5.1.33"
+#define _QLCNIC_LINUX_SUBVERSION 34
+#define QLCNIC_LINUX_VERSIONID "5.1.34"
#define QLCNIC_DRV_IDC_VER 0x01
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread