aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_cmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_cmds.c')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c34
1 files changed, 18 insertions, 16 deletions
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