qlcnic: Mailbox refactoring and ethtool updates
Subsystems (3)
cover qlcnic: Mailbox refactoring and ethtool updates
From: Himanshu Madhani <[email protected]>
This series contains
* patch for adding board temperature for ethtool statistics.
* patch for returning correct error code for loopback diagnostic test.
* patches for mailbox refactoring.
There was suggestion from Ben Hutchings, in response to RFC patch, to use hwmon device for extracting board temperature from an adapter. We are still investigating this approach. We will send out patches later as a separate series when we have decide to implement hwmon API.
Thanks,
Himanshu
Himanshu Madhani (2):
qlcnic: Add ethtool statistics for board temperature.
qlcnic: Update version to 5.2.45
Jitendra Kalsaria (1):
qlcnic: Return appropriate error code.
Manish Chopra (3):
qlcnic: Interrupt based driver firmware mailbox mechanism
qlcnic: Replace poll mode mailbox interface with interrupt based
mailbox interface
qlcnic: Enable mailbox interface in poll mode when interrupts are not
available
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 57 +- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 615 +++++++++++++++------ .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 27 +- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 83 ++- .../net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 7 +- drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 20 +- .../ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 146 ++--- 7 files changed, 656 insertions(+), 299 deletions(-)
Signature · 1 line
1.8.1.4
PATCH 1/6 qlcnic: Add ethtool statistics for board temperature.
From: Himanshu Madhani <[email protected]>
o Added ethtool statistics to display adapter board temperature.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 1 + drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 5 +++++ drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 2 ++ 3 files changed, 8 insertions(+)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +1 -0
@@ -490,6 +490,7 @@ struct qlcnic_adapter_stats {u64 tx_dma_map_error;u64 spurious_intr;u64 mac_filter_limit_overrun; +u64 board_temperature; };/*
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +5 -0
@@ -53,6 +53,8 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = { QLC_OFF(stats.mac_filter_limit_overrun)}, {"spurious intr" ,QLC_SIZEOF (stats.spurious_intr), QLC_OFF(stats.spurious_intr)}, + {"board_temperature", QLC_SIZEOF(stats.board_temperature), + QLC_OFF(stats.board_temperature)}, };
@@ -1147,6 +1149,9 @@ static void qlcnic_get_ethtool_stats(struct net_device *dev,memset (data,0 , stats->n_stats *sizeof (u64)); length =QLCNIC_STATS_LEN ; + +qlcnic_check_temp (adapter); +for (index =0 ; index < length; index++) { p = (char *)adapter + qlcnic_gstrings_stats[index].stat_offset; size = qlcnic_gstrings_stats[index].sizeof_stat;
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +2 -0
@@ -2457,6 +2457,8 @@ int qlcnic_check_temp(struct qlcnic_adapter *adapter) } } adapter->ahw->temp = temp_state; + adapter->stats.board_temperature = temp_val; +return rv; }
Signature · 1 line
1.8.1.4
David Miller
maintainerRe: [PATCH net-next 1/6] qlcnic: Add ethtool statistics for board temperature.
From: Himanshu Madhani <[email protected]>
Date: Tue, 30 Jul 2013 21:54:19 -0400
Quoted 6 lines
From: Himanshu Madhani <[email protected]>
o Added ethtool statistics to display adapter board temperature.
Signed-off-by Himanshu Madhani <[email protected]>
A statistic is a count of events, this is not such a thing.
Furthermore, even if this fit the model of statistical events, there is no way for the user to know what units the value is in.
Sorry I'm not applying these patches.
RE: [PATCH net-next 1/6] qlcnic: Add ethtool statistics for board temperature.
Quoted 16 lines
-----Original Message-----
From: David Miller [mailto:[email protected]]
Sent: Tuesday, July 30, 2013 7:27 PM
To: Himanshu Madhani
Cc: netdev; Dept-NX Linux NIC Driver
Subject: Re: [PATCH net-next 1/6] qlcnic: Add ethtool statistics for board temperature.From: Himanshu Madhani <[email protected]>
Date: Tue, 30 Jul 2013 21:54:19 -0400Quoted 5 lines
From: Himanshu Madhani <[email protected]>
o Added ethtool statistics to display adapter board temperature.
Quoted 8 lines
Quoted 1 line
Signed-off-by Himanshu Madhani <[email protected]>A statistic is a count of events, this is not such a thing.
Furthermore, even if this fit the model of statistical events, there is no way for the user to know what units the value is in.
Sorry I'm not applying these patches.
I am dropping this patch from this series and will implement HWMON API for sensing temperature.
I am resubmitting rest of the patches in this series which are unrelated to the above patch.
Thanks,
-Himanshu
Re: [PATCH net-next 1/6] qlcnic: Add ethtool statistics for board temperature.
In reply to Himanshu MadhaniQuoted 6 lines · On Tue, 30 Jul 2013 21:54:19 -0400 Himanshu Madhani…
From: Himanshu Madhani <[email protected]>
o Added ethtool statistics to display adapter board temperature.
Signed-off-by Himanshu Madhani <[email protected]>
If you look at igb driver you will see how Intel implemented temperature monitoring to make it available through standard sensors.
PATCH 2/6 qlcnic: Return appropriate error code.
In reply to Himanshu MadhaniFrom: Jitendra Kalsaria <[email protected]>
Driver should return appropriate error code when diagnotics loopback test is performed.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 3 ++- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 23 +++++++++++++++------- .../net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +2 -1
@@ -953,10 +953,11 @@ struct qlcnic_ipaddr {#define QLCNIC_LB_BUCKET_SIZE 32/* QLCNIC Driver Error Code */ -#define QLCNIC_FW_NOT_RESPOND 51 +#define QLCNIC_FW_RESPONSE_TIMEOUT 51#define QLCNIC_TEST_IN_PROGRESS 52#define QLCNIC_UNDEFINED_ERROR 53#define QLCNIC_LB_CABLE_NOT_CONN 54 +#define QLCNIC_LB_IN_PROGRESS 55#define QLCNIC_ILB_MAX_RCV_LOOP 10struct qlcnic_filter {
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +16 -7
@@ -1652,7 +1652,7 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)if (ahw->op_mode ==QLCNIC_NON_PRIV_FUNC ) {netdev_warn (netdev,"Loopback test not supported in non privileged mode\n" ); -return ret; +return -ENOTSUPP ; }if (test_bit (__QLCNIC_RESETTING, &adapter->state)) {
@@ -1686,13 +1686,13 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)if (test_bit (__QLCNIC_RESETTING, &adapter->state)) {netdev_info (netdev,"Device is resetting, free LB test resources\n" ); - ret = -EIO ; + ret = -EBUSY ; goto free_diag_res; }if (loop++ >QLC_83XX_LB_WAIT_COUNT ) {netdev_info (netdev,"Firmware didn't sent link up event to loopback request\n" ); - ret = -QLCNIC_FW_NOT_RESPOND ; + ret = -QLCNIC_FW_RESPONSE_TIMEOUT ;qlcnic_83xx_clear_lb_mode (adapter, mode); goto free_diag_res; }
@@ -1729,6 +1729,15 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)return status; config = ahw->port_config; + +/* Check if port is already in loopback mode */ +if ((config &QLC_83XX_CFG_LOOPBACK_HSS ) || + (config &QLC_83XX_CFG_LOOPBACK_EXT )) { +netdev_err (netdev, +"Port already in Loopback mode.\n" ); +return -QLCNIC_LB_IN_PROGRESS ; + } +set_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status);if (mode ==QLCNIC_ILB_MODE )
@@ -1756,14 +1765,14 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)netdev_info (netdev,"Device is resetting, free LB test resources\n" );clear_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status); -return -EIO ; +return -EBUSY ; }if (loop++ >QLC_83XX_LB_WAIT_COUNT ) {netdev_err (netdev,"Did not receive IDC completion AEN\n" );clear_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status);qlcnic_83xx_clear_lb_mode (adapter, mode); -return -EIO ; +return -QLCNIC_FW_RESPONSE_TIMEOUT ; } }while (test_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status));
@@ -1805,14 +1814,14 @@ int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)netdev_info (netdev,"Device is resetting, free LB test resources\n" );clear_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status); -return -EIO ; +return -EBUSY ; }if (loop++ >QLC_83XX_LB_WAIT_COUNT ) {netdev_err (netdev,"Did not receive IDC completion AEN\n" );clear_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status); -return -EIO ; +return -QLCNIC_FW_RESPONSE_TIMEOUT ; } }while (test_bit (QLC_83XX_IDC_COMP_AEN , &ahw->idc.status));
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +1 -1
@@ -984,7 +984,7 @@ int qlcnic_loopback_test(struct net_device *netdev, u8 mode)if (loop++ >QLCNIC_ILB_MAX_RCV_LOOP ) {netdev_info (netdev,"firmware didnt respond to loopback" " configure request\n" ); - ret = -QLCNIC_FW_NOT_RESPOND ; + ret = -QLCNIC_FW_RESPONSE_TIMEOUT ; goto free_res; }else if (adapter->ahw->diag_cnt) { ret = adapter->ahw->diag_cnt;
Signature · 1 line
1.8.1.4
PATCH 3/6 qlcnic: Interrupt based driver firmware mailbox mechanism
In reply to Himanshu MadhaniFrom: Manish Chopra <[email protected]>
o Driver firmware mailbox interface was operating in polling mode because of issues with the earlier versions of 83xx adapter firmware
o Implement callbacks and data structures to replace driver firmware existing mailbox interface with interrupt based mailbox interface
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 48 +++- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 314 ++++++++++++++++++++- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 25 +- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 4 +- .../ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 18 +- 5 files changed, 388 insertions(+), 21 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +44 -4
@@ -20,7 +20,6 @@#include <linux/tcp.h> #include <linux/skbuff.h> #include <linux/firmware.h> -#include <linux/ethtool.h> #include <linux/mii.h> #include <linux/timer.h>
@@ -468,6 +467,7 @@ struct qlcnic_hardware_context {u32 mbox_aen[QLC_83XX_MBX_AEN_CNT ];u32 mbox_reg[4 ];spinlock_t mbx_lock; +struct qlcnic_mailbox *mailbox; };struct qlcnic_adapter_stats {
@@ -974,6 +974,21 @@ struct qlcnic_filter_hash {u16 fbucket_size; }; +/* Mailbox specific data structures */ +struct qlcnic_mailbox { +struct workqueue_struct *work_q; +struct qlcnic_adapter *adapter; +struct qlcnic_mbx_ops *ops; +struct work_struct work; +struct completion completion; +struct list_head cmd_q; +unsigned long status; +spinlock_t queue_lock;/* Mailbox queue lock */ +spinlock_t aen_lock;/* Mailbox response/AEN lock */ +atomic_t rsp_status; +u32 num_cmds; +}; +struct qlcnic_adapter {struct qlcnic_hardware_context *ahw;struct qlcnic_recv_context *recv_ctx;
@@ -1387,9 +1402,20 @@ struct _cdrp_cmd { };struct qlcnic_cmd_args { -struct _cdrp_cmd req; -struct _cdrp_cmd rsp; -int op_type; +struct completion completion; +struct list_head list; +struct _cdrp_cmd req; +struct _cdrp_cmd rsp; +atomic_t rsp_status; +int pay_size; +u32 rsp_opcode; +u32 total_cmds; +u32 op_type; +u32 type; +u32 cmd_op; +u32 *hdr;/* Back channel message header */ +u32 *pay;/* Back channel message payload */ +u8 func_num; };int qlcnic_fw_cmd_get_minidump_temp (struct qlcnic_adapter *adapter);
@@ -1602,6 +1628,20 @@ struct qlcnic_nic_template {int (*resume)(struct qlcnic_adapter *); }; +struct qlcnic_mbx_ops { +int (*enqueue_cmd) (struct qlcnic_adapter *, +struct qlcnic_cmd_args *,unsigned long *); +void (*dequeue_cmd) (struct qlcnic_adapter *,struct qlcnic_cmd_args *); +void (*decode_resp) (struct qlcnic_adapter *,struct qlcnic_cmd_args *); +void (*encode_cmd) (struct qlcnic_adapter *,struct qlcnic_cmd_args *); +void (*nofity_fw) (struct qlcnic_adapter *,u8 ); +}; + +int qlcnic_83xx_init_mailbox_work (struct qlcnic_adapter *); +void qlcnic_83xx_detach_mailbox_work (struct qlcnic_adapter *); +void qlcnic_83xx_reinit_mbx_work (struct qlcnic_mailbox *mbx); +void qlcnic_83xx_free_mailbox (struct qlcnic_mailbox *mbx); +/* Adapter hardware abstraction */ struct qlcnic_hardware_ops {void (*read_crb) (struct qlcnic_adapter *,char *,loff_t ,size_t );
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +309 -5
353 lines not on this page · raw message
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +23 -2
@@ -89,6 +89,13 @@#define QLC_83XX_MAX_RESET_SEQ_ENTRIES 16 +#define QLC_83XX_MBX_POST_BC_OP 0x1 +#define QLC_83XX_MBX_COMPLETION 0x0 +#define QLC_83XX_MBX_REQUEST 0x1 + +#define QLC_83XX_MBX_TIMEOUT (5 * HZ) +#define QLC_83XX_MBX_CMD_LOOP 5000000 +/* status descriptor mailbox data * @phy_addr_{low|high}: physical address of buffer * @sds_ring_size: buffer size
@@ -449,6 +456,20 @@ enum qlcnic_83xx_states {#define QLC_83xx_FLASH_MAX_WAIT_USEC 100#define QLC_83XX_FLASH_LOCK_TIMEOUT 10000 +enum qlc_83xx_mbx_cmd_type { +QLC_83XX_MBX_CMD_WAIT =0 , +QLC_83XX_MBX_CMD_NO_WAIT , +QLC_83XX_MBX_CMD_BUSY_WAIT , +}; + +enum qlc_83xx_mbx_response_states { +QLC_83XX_MBX_RESPONSE_WAIT =0 , +QLC_83XX_MBX_RESPONSE_ARRIVED , +}; + +#define QLC_83XX_MBX_RESPONSE_FAILED 0x2 +#define QLC_83XX_MBX_RESPONSE_UNKNOWN 0x3 +/* Additional registers in 83xx */ enum qlc_83xx_ext_regs {QLCNIC_GLOBAL_RESET =0 ,
@@ -498,7 +519,7 @@ enum qlc_83xx_ext_regs {/* 83xx funcitons */ int qlcnic_83xx_get_fw_version (struct qlcnic_adapter *); -int qlcnic_83xx_mbx_op (struct qlcnic_adapter *,struct qlcnic_cmd_args *); +int qlcnic_83xx_issue_cmd (struct qlcnic_adapter *,struct qlcnic_cmd_args *);int qlcnic_83xx_setup_intr (struct qlcnic_adapter *,u8 );void qlcnic_83xx_get_func_no (struct qlcnic_adapter *);int qlcnic_83xx_cam_lock (struct qlcnic_adapter *);
@@ -551,7 +572,7 @@ void qlcnic_set_npar_data(struct qlcnic_adapter *, const struct qlcnic_info *,void qlcnic_83xx_config_intr_coal (struct qlcnic_adapter *);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 *); +void qlcnic_83xx_enable_mbx_interrupt (struct qlcnic_adapter *);void qlcnic_83xx_disable_mbx_intr (struct qlcnic_adapter *);irqreturn_t qlcnic_83xx_clear_legacy_intr (struct qlcnic_adapter *);irqreturn_t qlcnic_83xx_intr (int ,void *);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +2 -2
@@ -617,7 +617,7 @@ int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)if (err)return err; -qlcnic_83xx_enable_mbx_intrpt (adapter); +qlcnic_83xx_enable_mbx_interrupt (adapter);if (qlcnic_83xx_configure_opmode (adapter)) {qlcnic_83xx_idc_enter_failed_state (adapter,1 );
@@ -2120,7 +2120,7 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)/* Initilaize 83xx mailbox spinlock */ spin_lock_init (&ahw->mbx_lock); -set_bit (QLC_83XX_MBX_READY , &adapter->ahw->idc.status); +set_bit (QLC_83XX_MBX_READY , &ahw->idc.status);qlcnic_83xx_clear_function_resources (adapter);/* register for NIC IDC AEN Events */
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +10 -8
@@ -33,7 +33,7 @@ static int qlcnic_sriov_alloc_bc_mbx_args(struct qlcnic_cmd_args *, u32);static void qlcnic_sriov_vf_poll_dev_state (struct work_struct *);static void qlcnic_sriov_vf_cancel_fw_work (struct qlcnic_adapter *);static void qlcnic_sriov_cleanup_transaction (struct qlcnic_bc_trans *); -static int qlcnic_sriov_vf_mbx_op (struct qlcnic_adapter *, +static int qlcnic_sriov_issue_cmd (struct qlcnic_adapter *,struct qlcnic_cmd_args *);static void qlcnic_sriov_process_bc_cmd (struct work_struct *);
@@ -45,7 +45,7 @@ static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = { .get_mac_address = qlcnic_83xx_get_mac_address, .setup_intr = qlcnic_83xx_setup_intr, .alloc_mbx_args = qlcnic_83xx_alloc_mbx_args, - .mbx_cmd = qlcnic_sriov_vf_mbx_op, + .mbx_cmd = qlcnic_sriov_issue_cmd, .get_func_no = qlcnic_83xx_get_func_no, .api_lock = qlcnic_83xx_cam_lock, .api_unlock = qlcnic_83xx_cam_unlock,
@@ -295,7 +295,7 @@ static int qlcnic_sriov_post_bc_msg(struct qlcnic_adapter *adapter, u32 *hdr, opcode = ((struct qlcnic_bc_hdr *)hdr)->cmd_op; -if (!test_bit (QLC_83XX_MBX_READY , &adapter->ahw->idc.status)) { +if (!test_bit (QLC_83XX_MBX_READY , &ahw->idc.status)) {dev_info (&adapter->pdev->dev,"Mailbox cmd attempted, 0x%x\n" , opcode);dev_info (&adapter->pdev->dev,"Mailbox detached\n" );
@@ -1083,6 +1083,7 @@ static void qlcnic_sriov_process_bc_cmd(struct work_struct *work)if (test_bit (QLC_BC_VF_FLR , &vf->state))return ; +memset (&cmd,0 ,sizeof (struct qlcnic_cmd_args )); trans =list_first_entry (&vf->rcv_act.wait_list, struct qlcnic_bc_trans, list); adapter = vf->adapter;
@@ -1232,6 +1233,7 @@ static void qlcnic_sriov_handle_bc_cmd(struct qlcnic_sriov *sriov,return ; } +memset (&cmd,0 ,sizeof (struct qlcnic_cmd_args )); cmd_op = hdr->cmd_op;if (qlcnic_sriov_alloc_bc_trans (&trans))return ;
@@ -1357,7 +1359,7 @@ int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter *adapter, u8 enable)if (enable) cmd.req.arg[1 ] = (1 <<4 ) | (1 <<5 ) | (1 <<6 ) | (1 <<7 ); - err =qlcnic_83xx_mbx_op (adapter, &cmd); + err =qlcnic_83xx_issue_cmd (adapter, &cmd);if (err !=QLCNIC_RCODE_SUCCESS ) { dev_err(&adapter->pdev->dev,
@@ -1389,7 +1391,7 @@ static int qlcnic_sriov_retry_bc_cmd(struct qlcnic_adapter *adapter,return -EIO ; } -static int qlcnic_sriov_vf_mbx_op (struct qlcnic_adapter *adapter, +static int qlcnic_sriov_issue_cmd (struct qlcnic_adapter *adapter,struct qlcnic_cmd_args *cmd) {struct qlcnic_hardware_context *ahw = adapter->ahw;
@@ -1409,7 +1411,7 @@ static int qlcnic_sriov_vf_mbx_op(struct qlcnic_adapter *adapter, goto cleanup_transaction; retry: -if (!test_bit (QLC_83XX_MBX_READY , &adapter->ahw->idc.status)) { +if (!test_bit (QLC_83XX_MBX_READY , &ahw->idc.status)) { rsp = -EIO ;QLCDB (adapter,DRV ,"MBX not Ready!(cmd 0x%x) for VF 0x%x\n" ,QLCNIC_MBX_RSP (cmd->req.arg[0 ]), func);
@@ -1612,7 +1614,7 @@ static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter)int err;set_bit (QLC_83XX_MBX_READY , &adapter->ahw->idc.status); -qlcnic_83xx_enable_mbx_intrpt (adapter); +qlcnic_83xx_enable_mbx_interrupt (adapter); err =qlcnic_sriov_cfg_bc_intr (adapter,1 );if (err)
@@ -1988,7 +1990,7 @@ int qlcnic_sriov_vf_resume(struct qlcnic_adapter *adapter)int err;set_bit (QLC_83XX_MODULE_LOADED , &idc->status); -qlcnic_83xx_enable_mbx_intrpt (adapter); +qlcnic_83xx_enable_mbx_interrupt (adapter); err =qlcnic_sriov_cfg_bc_intr (adapter,1 );if (err)return err;
Signature · 1 line
1.8.1.4
PATCH 4/6 qlcnic: Replace poll mode mailbox interface with interrupt based mailbox interface
In reply to Himanshu MadhaniFrom: Manish Chopra <[email protected]>
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 1 - .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 260 ++++++++++----------- .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 2 - .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 81 +++++-- drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 18 +- .../ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 134 ++++------- 6 files changed, 232 insertions(+), 264 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +0 -1
@@ -466,7 +466,6 @@ struct qlcnic_hardware_context {u32 *ext_reg_tbl;u32 mbox_aen[QLC_83XX_MBX_AEN_CNT ];u32 mbox_reg[4 ]; -spinlock_t mbx_lock;struct qlcnic_mailbox *mailbox; };
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +123 -137
389 lines not on this page · raw message
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +0 -2
@@ -644,8 +644,6 @@ int qlcnic_83xx_set_led(struct net_device *, enum ethtool_phys_id_state);int qlcnic_83xx_flash_test (struct qlcnic_adapter *);int qlcnic_83xx_enable_flash_write (struct qlcnic_adapter *);int qlcnic_83xx_disable_flash_write (struct qlcnic_adapter *); -u32 qlcnic_83xx_mac_rcode (struct qlcnic_adapter *); -u32 qlcnic_83xx_mbx_poll (struct qlcnic_adapter *,u32 *);void qlcnic_83xx_enable_mbx_poll (struct qlcnic_adapter *);void qlcnic_83xx_disable_mbx_poll (struct qlcnic_adapter *);void qlcnic_83xx_set_mac_filter_count (struct qlcnic_adapter *);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +61 -20
172 lines not on this page · raw message
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +8 -10
@@ -2141,16 +2141,12 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)dev_warn (&pdev->dev,"83xx adapter do not support MSI interrupts\n" ); - err =qlcnic_setup_intr (adapter,0 ); -if (err) { -dev_err (&pdev->dev,"Failed to setup interrupt\n" ); - goto err_out_disable_msi; - } - -if (qlcnic_83xx_check (adapter)) { - err =qlcnic_83xx_setup_mbx_intr (adapter); -if (err) +if (qlcnic_82xx_check (adapter)) { + err =qlcnic_setup_intr (adapter,0 ); +if (err) { +dev_err (&pdev->dev,"Failed to setup interrupt\n" ); goto err_out_disable_msi; + } } err =qlcnic_get_act_pci_func (adapter);
@@ -2237,9 +2233,11 @@ static void qlcnic_remove(struct pci_dev *pdev)qlcnic_sriov_cleanup (adapter);if (qlcnic_83xx_check (adapter)) { -qlcnic_83xx_free_mbx_intr (adapter);qlcnic_83xx_register_nic_idc_func (adapter,0 );cancel_delayed_work_sync (&adapter->idc_aen_work); +qlcnic_83xx_free_mbx_intr (adapter); +qlcnic_83xx_detach_mailbox_work (adapter); +qlcnic_83xx_free_mailbox (ahw->mailbox); }qlcnic_detach (adapter);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +40 -94
226 lines not on this page · raw message
Signature · 1 line
1.8.1.4
PATCH 5/6 qlcnic: Enable mailbox interface in poll mode when interrupts are not available
In reply to Himanshu MadhaniFrom: Manish Chopra <[email protected]>
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +11 -7
@@ -945,6 +945,7 @@ void qlcnic_83xx_enable_mbx_poll(struct qlcnic_adapter *adapter)return ;INIT_DELAYED_WORK (&adapter->mbx_poll_work, qlcnic_83xx_mbx_poll_work); +queue_delayed_work (adapter->qlcnic_wq, &adapter->mbx_poll_work,0 ); }void qlcnic_83xx_disable_mbx_poll (struct qlcnic_adapter *adapter)
@@ -1331,8 +1332,10 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,if (adapter->ahw->diag_test ==QLCNIC_LOOPBACK_TEST ) {/* disable and free mailbox interrupt */ -if (!(adapter->flags &QLCNIC_MSIX_ENABLED )) +if (!(adapter->flags &QLCNIC_MSIX_ENABLED )) { +qlcnic_83xx_enable_mbx_poll (adapter);qlcnic_83xx_free_mbx_intr (adapter); + } adapter->ahw->loopback_state =0 ; adapter->ahw->hw_ops->setup_link_event (adapter,1 ); }
@@ -1353,6 +1356,8 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,for (ring =0 ; ring < adapter->max_sds_rings; ring++) { sds_ring = &adapter->recv_ctx->sds_rings[ring];qlcnic_83xx_disable_intr (adapter, sds_ring); +if (!(adapter->flags &QLCNIC_MSIX_ENABLED )) +qlcnic_83xx_enable_mbx_poll (adapter); } }
@@ -1362,6 +1367,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,if (adapter->ahw->diag_test ==QLCNIC_LOOPBACK_TEST ) {if (!(adapter->flags &QLCNIC_MSIX_ENABLED )) { err =qlcnic_83xx_setup_mbx_intr (adapter); +qlcnic_83xx_disable_mbx_poll (adapter);if (err) { dev_err(&adapter->pdev->dev, "%s: failed to setup mbx interrupt\n",
@@ -1378,6 +1384,10 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,if (netif_running (netdev))__qlcnic_up (adapter, netdev); + +if (adapter->ahw->diag_test ==QLCNIC_INTERRUPT_TEST && + !(adapter->flags &QLCNIC_MSIX_ENABLED )) +qlcnic_83xx_disable_mbx_poll (adapter); out:netif_device_attach (netdev); }
@@ -1662,8 +1672,6 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)/* Poll for link up event before running traffic */ do { msleep(QLC_83XX_LB_MSLEEP_COUNT); - if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) - qlcnic_83xx_process_aen(adapter); if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { netdev_info(netdev,
@@ -1740,8 +1748,6 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)/* Wait for Link and IDC Completion AEN */ do { msleep(QLC_83XX_LB_MSLEEP_COUNT); - if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) - qlcnic_83xx_process_aen(adapter); if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { netdev_info(netdev,
@@ -1789,8 +1795,6 @@ int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)/* Wait for Link and IDC Completion AEN */ do { msleep(QLC_83XX_LB_MSLEEP_COUNT); - if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) - qlcnic_83xx_process_aen(adapter); if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { netdev_info(netdev,
Signature · 1 line
1.8.1.4
PATCH 6/6 qlcnic: Update version to 5.2.45
In reply to Himanshu MadhaniFrom: Himanshu Madhani <[email protected]>
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +2 -2
@@ -37,8 +37,8 @@#define _QLCNIC_LINUX_MAJOR 5#define _QLCNIC_LINUX_MINOR 2 -#define _QLCNIC_LINUX_SUBVERSION 44 -#define QLCNIC_LINUX_VERSIONID "5.2.44" +#define _QLCNIC_LINUX_SUBVERSION 45 +#define QLCNIC_LINUX_VERSIONID "5.2.45"#define QLCNIC_DRV_IDC_VER 0x01#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
Signature · 1 line
1.8.1.4