aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex
diff options
context:
space:
mode:
authorVasundhara Volam <vasundhara.volam@emulex.com>2013-04-21 19:28:14 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-22 15:36:06 -0400
commit94d73aaa3fe42292a30eaad2ec011035ae25fa90 (patch)
tree7eebaed2d910bbfed2cff96831c918ae97d79835 /drivers/net/ethernet/emulex
parent26f26b3a6493956837dadf302cebfe276ed6d984 (diff)
be2net: Use TXQ_CREATE_V2 cmd
Skyhawk-R and BE3-R (SuperNIC profile) require V2 version of TXQ_CREATE cmd to be used. Signed-off-by: Vasundhara Volam <vasundhara.volam@emulex.com> Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h1
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c34
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h45
-rw-r--r--drivers/net/ethernet/emulex/benet/be_hw.h4
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c11
5 files changed, 41 insertions, 54 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 2e2700e3a5ab..880226872c64 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -214,6 +214,7 @@ struct be_tx_stats {
214}; 214};
215 215
216struct be_tx_obj { 216struct be_tx_obj {
217 u32 db_offset;
217 struct be_queue_info q; 218 struct be_queue_info q;
218 struct be_queue_info cq; 219 struct be_queue_info cq;
219 /* Remember the skbs that were transmitted */ 220 /* Remember the skbs that were transmitted */
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index cf9408f574af..5d96f773ea92 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -1095,15 +1095,14 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
1095 return status; 1095 return status;
1096} 1096}
1097 1097
1098int be_cmd_txq_create(struct be_adapter *adapter, 1098int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo)
1099 struct be_queue_info *txq,
1100 struct be_queue_info *cq)
1101{ 1099{
1102 struct be_mcc_wrb *wrb; 1100 struct be_mcc_wrb *wrb;
1103 struct be_cmd_req_eth_tx_create *req; 1101 struct be_cmd_req_eth_tx_create *req;
1102 struct be_queue_info *txq = &txo->q;
1103 struct be_queue_info *cq = &txo->cq;
1104 struct be_dma_mem *q_mem = &txq->dma_mem; 1104 struct be_dma_mem *q_mem = &txq->dma_mem;
1105 void *ctxt; 1105 int status, ver = 0;
1106 int status;
1107 1106
1108 spin_lock_bh(&adapter->mcc_lock); 1107 spin_lock_bh(&adapter->mcc_lock);
1109 1108
@@ -1114,34 +1113,37 @@ int be_cmd_txq_create(struct be_adapter *adapter,
1114 } 1113 }
1115 1114
1116 req = embedded_payload(wrb); 1115 req = embedded_payload(wrb);
1117 ctxt = &req->context;
1118 1116
1119 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, 1117 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1120 OPCODE_ETH_TX_CREATE, sizeof(*req), wrb, NULL); 1118 OPCODE_ETH_TX_CREATE, sizeof(*req), wrb, NULL);
1121 1119
1122 if (lancer_chip(adapter)) { 1120 if (lancer_chip(adapter)) {
1123 req->hdr.version = 1; 1121 req->hdr.version = 1;
1124 AMAP_SET_BITS(struct amap_tx_context, if_id, ctxt, 1122 req->if_id = cpu_to_le16(adapter->if_handle);
1125 adapter->if_handle); 1123 } else if (BEx_chip(adapter)) {
1124 if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC)
1125 req->hdr.version = 2;
1126 } else { /* For SH */
1127 req->hdr.version = 2;
1126 } 1128 }
1127 1129
1128 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); 1130 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
1129 req->ulp_num = BE_ULP1_NUM; 1131 req->ulp_num = BE_ULP1_NUM;
1130 req->type = BE_ETH_TX_RING_TYPE_STANDARD; 1132 req->type = BE_ETH_TX_RING_TYPE_STANDARD;
1131 1133 req->cq_id = cpu_to_le16(cq->id);
1132 AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, 1134 req->queue_size = be_encoded_q_len(txq->len);
1133 be_encoded_q_len(txq->len));
1134 AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
1135 AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id);
1136
1137 be_dws_cpu_to_le(ctxt, sizeof(req->context));
1138
1139 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 1135 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1140 1136
1137 ver = req->hdr.version;
1138
1141 status = be_mcc_notify_wait(adapter); 1139 status = be_mcc_notify_wait(adapter);
1142 if (!status) { 1140 if (!status) {
1143 struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb); 1141 struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
1144 txq->id = le16_to_cpu(resp->cid); 1142 txq->id = le16_to_cpu(resp->cid);
1143 if (ver == 2)
1144 txo->db_offset = le32_to_cpu(resp->db_offset);
1145 else
1146 txo->db_offset = DB_TXULP1_OFFSET;
1145 txq->created = true; 1147 txq->created = true;
1146 } 1148 }
1147 1149
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index f2af85517218..ba41f8360f9f 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -474,46 +474,27 @@ struct be_cmd_resp_mcc_create {
474#define BE_ETH_TX_RING_TYPE_STANDARD 2 474#define BE_ETH_TX_RING_TYPE_STANDARD 2
475#define BE_ULP1_NUM 1 475#define BE_ULP1_NUM 1
476 476
477/* Pseudo amap definition in which each bit of the actual structure is defined
478 * as a byte: used to calculate offset/shift/mask of each field */
479struct amap_tx_context {
480 u8 if_id[16]; /* dword 0 */
481 u8 tx_ring_size[4]; /* dword 0 */
482 u8 rsvd1[26]; /* dword 0 */
483 u8 pci_func_id[8]; /* dword 1 */
484 u8 rsvd2[9]; /* dword 1 */
485 u8 ctx_valid; /* dword 1 */
486 u8 cq_id_send[16]; /* dword 2 */
487 u8 rsvd3[16]; /* dword 2 */
488 u8 rsvd4[32]; /* dword 3 */
489 u8 rsvd5[32]; /* dword 4 */
490 u8 rsvd6[32]; /* dword 5 */
491 u8 rsvd7[32]; /* dword 6 */
492 u8 rsvd8[32]; /* dword 7 */
493 u8 rsvd9[32]; /* dword 8 */
494 u8 rsvd10[32]; /* dword 9 */
495 u8 rsvd11[32]; /* dword 10 */
496 u8 rsvd12[32]; /* dword 11 */
497 u8 rsvd13[32]; /* dword 12 */
498 u8 rsvd14[32]; /* dword 13 */
499 u8 rsvd15[32]; /* dword 14 */
500 u8 rsvd16[32]; /* dword 15 */
501} __packed;
502
503struct be_cmd_req_eth_tx_create { 477struct be_cmd_req_eth_tx_create {
504 struct be_cmd_req_hdr hdr; 478 struct be_cmd_req_hdr hdr;
505 u8 num_pages; 479 u8 num_pages;
506 u8 ulp_num; 480 u8 ulp_num;
507 u8 type; 481 u16 type;
508 u8 bound_port; 482 u16 if_id;
509 u8 context[sizeof(struct amap_tx_context) / 8]; 483 u8 queue_size;
484 u8 rsvd0;
485 u32 rsvd1;
486 u16 cq_id;
487 u16 rsvd2;
488 u32 rsvd3[13];
510 struct phys_addr pages[8]; 489 struct phys_addr pages[8];
511} __packed; 490} __packed;
512 491
513struct be_cmd_resp_eth_tx_create { 492struct be_cmd_resp_eth_tx_create {
514 struct be_cmd_resp_hdr hdr; 493 struct be_cmd_resp_hdr hdr;
515 u16 cid; 494 u16 cid;
516 u16 rsvd0; 495 u16 rid;
496 u32 db_offset;
497 u32 rsvd0[4];
517} __packed; 498} __packed;
518 499
519/******************** Create RxQ ***************************/ 500/******************** Create RxQ ***************************/
@@ -1067,7 +1048,6 @@ struct be_cmd_resp_modify_eq_delay {
1067} __packed; 1048} __packed;
1068 1049
1069/******************** Get FW Config *******************/ 1050/******************** Get FW Config *******************/
1070#define BE_FUNCTION_CAPS_RSS 0x2
1071/* The HW can come up in either of the following multi-channel modes 1051/* The HW can come up in either of the following multi-channel modes
1072 * based on the skew/IPL. 1052 * based on the skew/IPL.
1073 */ 1053 */
@@ -1841,8 +1821,7 @@ extern int be_cmd_mccq_create(struct be_adapter *adapter,
1841 struct be_queue_info *mccq, 1821 struct be_queue_info *mccq,
1842 struct be_queue_info *cq); 1822 struct be_queue_info *cq);
1843extern int be_cmd_txq_create(struct be_adapter *adapter, 1823extern int be_cmd_txq_create(struct be_adapter *adapter,
1844 struct be_queue_info *txq, 1824 struct be_tx_obj *txo);
1845 struct be_queue_info *cq);
1846extern int be_cmd_rxq_create(struct be_adapter *adapter, 1825extern int be_cmd_rxq_create(struct be_adapter *adapter,
1847 struct be_queue_info *rxq, u16 cq_id, 1826 struct be_queue_info *rxq, u16 cq_id,
1848 u16 frag_size, u32 if_id, u32 rss, u8 *rss_id); 1827 u16 frag_size, u32 if_id, u32 rss, u8 *rss_id);
diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h
index 89e6d8cfaf0d..b305f8d22f9c 100644
--- a/drivers/net/ethernet/emulex/benet/be_hw.h
+++ b/drivers/net/ethernet/emulex/benet/be_hw.h
@@ -72,6 +72,10 @@
72 */ 72 */
73#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK (1 << 29) /* bit 29 */ 73#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK (1 << 29) /* bit 29 */
74 74
75/********* PCI Function Capability *********/
76#define BE_FUNCTION_CAPS_RSS 0x2
77#define BE_FUNCTION_CAPS_SUPER_NIC 0x40
78
75/********* Power management (WOL) **********/ 79/********* Power management (WOL) **********/
76#define PCICFG_PM_CONTROL_OFFSET 0x44 80#define PCICFG_PM_CONTROL_OFFSET 0x44
77#define PCICFG_PM_CONTROL_MASK 0x108 /* bits 3 & 8 */ 81#define PCICFG_PM_CONTROL_MASK 0x108 /* bits 3 & 8 */
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 811d0a47d17a..8d10b781bc65 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -197,14 +197,15 @@ static void be_rxq_notify(struct be_adapter *adapter, u16 qid, u16 posted)
197 iowrite32(val, adapter->db + DB_RQ_OFFSET); 197 iowrite32(val, adapter->db + DB_RQ_OFFSET);
198} 198}
199 199
200static void be_txq_notify(struct be_adapter *adapter, u16 qid, u16 posted) 200static void be_txq_notify(struct be_adapter *adapter, struct be_tx_obj *txo,
201 u16 posted)
201{ 202{
202 u32 val = 0; 203 u32 val = 0;
203 val |= qid & DB_TXULP_RING_ID_MASK; 204 val |= txo->q.id & DB_TXULP_RING_ID_MASK;
204 val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT; 205 val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;
205 206
206 wmb(); 207 wmb();
207 iowrite32(val, adapter->db + DB_TXULP1_OFFSET); 208 iowrite32(val, adapter->db + txo->db_offset);
208} 209}
209 210
210static void be_eq_notify(struct be_adapter *adapter, u16 qid, 211static void be_eq_notify(struct be_adapter *adapter, u16 qid,
@@ -833,7 +834,7 @@ static netdev_tx_t be_xmit(struct sk_buff *skb,
833 stopped = true; 834 stopped = true;
834 } 835 }
835 836
836 be_txq_notify(adapter, txq->id, wrb_cnt); 837 be_txq_notify(adapter, txo, wrb_cnt);
837 838
838 be_tx_stats_update(txo, wrb_cnt, copied, gso_segs, stopped); 839 be_tx_stats_update(txo, wrb_cnt, copied, gso_segs, stopped);
839 } else { 840 } else {
@@ -1969,7 +1970,7 @@ static int be_tx_qs_create(struct be_adapter *adapter)
1969 if (status) 1970 if (status)
1970 return status; 1971 return status;
1971 1972
1972 status = be_cmd_txq_create(adapter, &txo->q, &txo->cq); 1973 status = be_cmd_txq_create(adapter, txo);
1973 if (status) 1974 if (status)
1974 return status; 1975 return status;
1975 } 1976 }