diff options
author | Vasundhara Volam <vasundhara.volam@emulex.com> | 2013-04-21 19:28:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-22 15:36:06 -0400 |
commit | 94d73aaa3fe42292a30eaad2ec011035ae25fa90 (patch) | |
tree | 7eebaed2d910bbfed2cff96831c918ae97d79835 /drivers/net/ethernet/emulex | |
parent | 26f26b3a6493956837dadf302cebfe276ed6d984 (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.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 34 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 45 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_hw.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 11 |
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 | ||
216 | struct be_tx_obj { | 216 | struct 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 | ||
1098 | int be_cmd_txq_create(struct be_adapter *adapter, | 1098 | int 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 */ | ||
479 | struct 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 | |||
503 | struct be_cmd_req_eth_tx_create { | 477 | struct 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 | ||
513 | struct be_cmd_resp_eth_tx_create { | 492 | struct 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); |
1843 | extern int be_cmd_txq_create(struct be_adapter *adapter, | 1823 | extern 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); | ||
1846 | extern int be_cmd_rxq_create(struct be_adapter *adapter, | 1825 | extern 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 | ||
200 | static void be_txq_notify(struct be_adapter *adapter, u16 qid, u16 posted) | 200 | static 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 | ||
210 | static void be_eq_notify(struct be_adapter *adapter, u16 qid, | 211 | static 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 | } |