Commit 2e588f84 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller

be2net: changes for BE3 native mode support

So far be2net has been using BE3 in legacy mode. It now checks for native
 mode capability and if available it sets it. In native mode, the RX_COMPL
 structure is different from that in legacy mode.
Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d478af0d
...@@ -67,7 +67,7 @@ static inline char *nic_name(struct pci_dev *pdev) ...@@ -67,7 +67,7 @@ static inline char *nic_name(struct pci_dev *pdev)
} }
/* Number of bytes of an RX frame that are copied to skb->data */ /* Number of bytes of an RX frame that are copied to skb->data */
#define BE_HDR_LEN 64 #define BE_HDR_LEN ((u16) 64)
#define BE_MAX_JUMBO_FRAME_SIZE 9018 #define BE_MAX_JUMBO_FRAME_SIZE 9018
#define BE_MIN_MTU 256 #define BE_MIN_MTU 256
...@@ -211,10 +211,30 @@ struct be_rx_stats { ...@@ -211,10 +211,30 @@ struct be_rx_stats {
u32 rx_fps; /* Rx frags per second */ u32 rx_fps; /* Rx frags per second */
}; };
struct be_rx_compl_info {
u32 rss_hash;
u16 vid;
u16 pkt_size;
u16 rxq_idx;
u16 mac_id;
u8 vlanf;
u8 num_rcvd;
u8 err;
u8 ipf;
u8 tcpf;
u8 udpf;
u8 ip_csum;
u8 l4_csum;
u8 ipv6;
u8 vtm;
u8 pkt_type;
};
struct be_rx_obj { struct be_rx_obj {
struct be_adapter *adapter; struct be_adapter *adapter;
struct be_queue_info q; struct be_queue_info q;
struct be_queue_info cq; struct be_queue_info cq;
struct be_rx_compl_info rxcp;
struct be_rx_page_info page_info_tbl[RX_Q_LEN]; struct be_rx_page_info page_info_tbl[RX_Q_LEN];
struct be_eq_obj rx_eq; struct be_eq_obj rx_eq;
struct be_rx_stats stats; struct be_rx_stats stats;
...@@ -312,6 +332,7 @@ struct be_adapter { ...@@ -312,6 +332,7 @@ struct be_adapter {
u32 flash_status; u32 flash_status;
struct completion flash_compl; struct completion flash_compl;
bool be3_native;
bool sriov_enabled; bool sriov_enabled;
struct be_vf_cfg vf_cfg[BE_MAX_VF]; struct be_vf_cfg vf_cfg[BE_MAX_VF];
u8 is_virtfn; u8 is_virtfn;
......
...@@ -2014,3 +2014,42 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) ...@@ -2014,3 +2014,42 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
attribs_cmd.dma); attribs_cmd.dma);
return status; return status;
} }
/* Uses mbox */
int be_cmd_check_native_mode(struct be_adapter *adapter)
{
struct be_mcc_wrb *wrb;
struct be_cmd_req_set_func_cap *req;
int status;
if (mutex_lock_interruptible(&adapter->mbox_lock))
return -1;
wrb = wrb_from_mbox(adapter);
if (!wrb) {
status = -EBUSY;
goto err;
}
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP, sizeof(*req));
req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS |
CAPABILITY_BE3_NATIVE_ERX_API);
req->cap_flags = cpu_to_le32(CAPABILITY_BE3_NATIVE_ERX_API);
status = be_mbox_notify_wait(adapter);
if (!status) {
struct be_cmd_resp_set_func_cap *resp = embedded_payload(wrb);
adapter->be3_native = le32_to_cpu(resp->cap_flags) &
CAPABILITY_BE3_NATIVE_ERX_API;
}
err:
mutex_unlock(&adapter->mbox_lock);
return status;
}
...@@ -190,6 +190,7 @@ struct be_mcc_mailbox { ...@@ -190,6 +190,7 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_GET_BEACON_STATE 70 #define OPCODE_COMMON_GET_BEACON_STATE 70
#define OPCODE_COMMON_READ_TRANSRECV_DATA 73 #define OPCODE_COMMON_READ_TRANSRECV_DATA 73
#define OPCODE_COMMON_GET_PHY_DETAILS 102 #define OPCODE_COMMON_GET_PHY_DETAILS 102
#define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103
#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 #define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121
#define OPCODE_ETH_RSS_CONFIG 1 #define OPCODE_ETH_RSS_CONFIG 1
...@@ -1042,6 +1043,24 @@ struct be_cmd_resp_cntl_attribs { ...@@ -1042,6 +1043,24 @@ struct be_cmd_resp_cntl_attribs {
struct mgmt_controller_attrib attribs; struct mgmt_controller_attrib attribs;
}; };
/*********************** Set driver function ***********************/
#define CAPABILITY_SW_TIMESTAMPS 2
#define CAPABILITY_BE3_NATIVE_ERX_API 4
struct be_cmd_req_set_func_cap {
struct be_cmd_req_hdr hdr;
u32 valid_cap_flags;
u32 cap_flags;
u8 rsvd[212];
};
struct be_cmd_resp_set_func_cap {
struct be_cmd_resp_hdr hdr;
u32 valid_cap_flags;
u32 cap_flags;
u8 rsvd[212];
};
extern int be_pci_fnum_get(struct be_adapter *adapter); extern int be_pci_fnum_get(struct be_adapter *adapter);
extern int be_cmd_POST(struct be_adapter *adapter); extern int be_cmd_POST(struct be_adapter *adapter);
extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
...@@ -1128,4 +1147,5 @@ extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); ...@@ -1128,4 +1147,5 @@ extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
extern void be_detect_dump_ue(struct be_adapter *adapter); extern void be_detect_dump_ue(struct be_adapter *adapter);
extern int be_cmd_get_die_temperature(struct be_adapter *adapter); extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
extern int be_cmd_check_native_mode(struct be_adapter *adapter);
...@@ -301,10 +301,10 @@ struct be_eth_rx_d { ...@@ -301,10 +301,10 @@ struct be_eth_rx_d {
/* RX Compl Queue Descriptor */ /* RX Compl Queue Descriptor */
/* Pseudo amap definition for eth_rx_compl in which each bit of the /* Pseudo amap definition for BE2 and BE3 legacy mode eth_rx_compl in which
* actual structure is defined as a byte: used to calculate * each bit of the actual structure is defined as a byte: used to calculate
* offset/shift/mask of each field */ * offset/shift/mask of each field */
struct amap_eth_rx_compl { struct amap_eth_rx_compl_v0 {
u8 vlan_tag[16]; /* dword 0 */ u8 vlan_tag[16]; /* dword 0 */
u8 pktsize[14]; /* dword 0 */ u8 pktsize[14]; /* dword 0 */
u8 port; /* dword 0 */ u8 port; /* dword 0 */
...@@ -335,6 +335,41 @@ struct amap_eth_rx_compl { ...@@ -335,6 +335,41 @@ struct amap_eth_rx_compl {
u8 rsshash[32]; /* dword 3 */ u8 rsshash[32]; /* dword 3 */
} __packed; } __packed;
/* Pseudo amap definition for BE3 native mode eth_rx_compl in which
* each bit of the actual structure is defined as a byte: used to calculate
* offset/shift/mask of each field */
struct amap_eth_rx_compl_v1 {
u8 vlan_tag[16]; /* dword 0 */
u8 pktsize[14]; /* dword 0 */
u8 vtp; /* dword 0 */
u8 ip_opt; /* dword 0 */
u8 err; /* dword 1 */
u8 rsshp; /* dword 1 */
u8 ipf; /* dword 1 */
u8 tcpf; /* dword 1 */
u8 udpf; /* dword 1 */
u8 ipcksm; /* dword 1 */
u8 l4_cksm; /* dword 1 */
u8 ip_version; /* dword 1 */
u8 macdst[7]; /* dword 1 */
u8 rsvd0; /* dword 1 */
u8 fragndx[10]; /* dword 1 */
u8 ct[2]; /* dword 1 */
u8 sw; /* dword 1 */
u8 numfrags[3]; /* dword 1 */
u8 rss_flush; /* dword 2 */
u8 cast_enc[2]; /* dword 2 */
u8 vtm; /* dword 2 */
u8 rss_bank; /* dword 2 */
u8 port[2]; /* dword 2 */
u8 vntagp; /* dword 2 */
u8 header_len[8]; /* dword 2 */
u8 header_split[2]; /* dword 2 */
u8 rsvd1[13]; /* dword 2 */
u8 valid; /* dword 2 */
u8 rsshash[32]; /* dword 3 */
} __packed;
struct be_eth_rx_compl { struct be_eth_rx_compl {
u32 dw[4]; u32 dw[4];
}; };
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment