aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/benet/be.h2
-rw-r--r--drivers/net/benet/be_cmds.c61
-rw-r--r--drivers/net/benet/be_cmds.h33
-rw-r--r--drivers/net/benet/be_main.c20
4 files changed, 106 insertions, 10 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 59a17b569b7f..4594a28b1f66 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -264,6 +264,8 @@ struct be_adapter {
264 u16 vlans_added; 264 u16 vlans_added;
265 u16 max_vlans; /* Number of vlans supported */ 265 u16 max_vlans; /* Number of vlans supported */
266 u8 vlan_tag[VLAN_N_VID]; 266 u8 vlan_tag[VLAN_N_VID];
267 u8 vlan_prio_bmap; /* Available Priority BitMap */
268 u16 recommended_prio; /* Recommended Priority */
267 struct be_dma_mem mc_cmd_mem; 269 struct be_dma_mem mc_cmd_mem;
268 270
269 struct be_dma_mem stats_cmd; 271 struct be_dma_mem stats_cmd;
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index bf2dc269de12..1e7f305ed00b 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -96,6 +96,50 @@ static void be_async_link_state_process(struct be_adapter *adapter,
96 evt->port_link_status == ASYNC_EVENT_LINK_UP); 96 evt->port_link_status == ASYNC_EVENT_LINK_UP);
97} 97}
98 98
99/* Grp5 CoS Priority evt */
100static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
101 struct be_async_event_grp5_cos_priority *evt)
102{
103 if (evt->valid) {
104 adapter->vlan_prio_bmap = evt->available_priority_bmap;
105 adapter->recommended_prio =
106 evt->reco_default_priority << VLAN_PRIO_SHIFT;
107 }
108}
109
110/* Grp5 QOS Speed evt */
111static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
112 struct be_async_event_grp5_qos_link_speed *evt)
113{
114 if (evt->physical_port == adapter->port_num) {
115 /* qos_link_speed is in units of 10 Mbps */
116 adapter->link_speed = evt->qos_link_speed * 10;
117 }
118}
119
120static void be_async_grp5_evt_process(struct be_adapter *adapter,
121 u32 trailer, struct be_mcc_compl *evt)
122{
123 u8 event_type = 0;
124
125 event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
126 ASYNC_TRAILER_EVENT_TYPE_MASK;
127
128 switch (event_type) {
129 case ASYNC_EVENT_COS_PRIORITY:
130 be_async_grp5_cos_priority_process(adapter,
131 (struct be_async_event_grp5_cos_priority *)evt);
132 break;
133 case ASYNC_EVENT_QOS_SPEED:
134 be_async_grp5_qos_speed_process(adapter,
135 (struct be_async_event_grp5_qos_link_speed *)evt);
136 break;
137 default:
138 dev_warn(&adapter->pdev->dev, "Unknown grp5 event!\n");
139 break;
140 }
141}
142
99static inline bool is_link_state_evt(u32 trailer) 143static inline bool is_link_state_evt(u32 trailer)
100{ 144{
101 return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) & 145 return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
@@ -103,6 +147,13 @@ static inline bool is_link_state_evt(u32 trailer)
103 ASYNC_EVENT_CODE_LINK_STATE; 147 ASYNC_EVENT_CODE_LINK_STATE;
104} 148}
105 149
150static inline bool is_grp5_evt(u32 trailer)
151{
152 return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
153 ASYNC_TRAILER_EVENT_CODE_MASK) ==
154 ASYNC_EVENT_CODE_GRP_5);
155}
156
106static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter) 157static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
107{ 158{
108 struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq; 159 struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq;
@@ -143,6 +194,9 @@ int be_process_mcc(struct be_adapter *adapter, int *status)
143 if (is_link_state_evt(compl->flags)) 194 if (is_link_state_evt(compl->flags))
144 be_async_link_state_process(adapter, 195 be_async_link_state_process(adapter,
145 (struct be_async_event_link_state *) compl); 196 (struct be_async_event_link_state *) compl);
197 else if (is_grp5_evt(compl->flags))
198 be_async_grp5_evt_process(adapter,
199 compl->flags, compl);
146 } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { 200 } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
147 *status = be_mcc_compl_process(adapter, compl); 201 *status = be_mcc_compl_process(adapter, compl);
148 atomic_dec(&mcc_obj->q.used); 202 atomic_dec(&mcc_obj->q.used);
@@ -677,10 +731,10 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
677 ctxt = &req->context; 731 ctxt = &req->context;
678 732
679 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, 733 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
680 OPCODE_COMMON_MCC_CREATE); 734 OPCODE_COMMON_MCC_CREATE_EXT);
681 735
682 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 736 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
683 OPCODE_COMMON_MCC_CREATE, sizeof(*req)); 737 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req));
684 738
685 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 739 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
686 740
@@ -688,7 +742,8 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
688 AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt, 742 AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
689 be_encoded_q_len(mccq->len)); 743 be_encoded_q_len(mccq->len));
690 AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id); 744 AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
691 745 /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */
746 req->async_event_bitmap[0] |= 0x00000022;
692 be_dws_cpu_to_le(ctxt, sizeof(req->context)); 747 be_dws_cpu_to_le(ctxt, sizeof(req->context));
693 748
694 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 749 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index b7a40b172d1a..c7f6cdfe1c73 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -82,7 +82,12 @@ struct be_mcc_compl {
82 */ 82 */
83#define ASYNC_TRAILER_EVENT_CODE_SHIFT 8 /* bits 8 - 15 */ 83#define ASYNC_TRAILER_EVENT_CODE_SHIFT 8 /* bits 8 - 15 */
84#define ASYNC_TRAILER_EVENT_CODE_MASK 0xFF 84#define ASYNC_TRAILER_EVENT_CODE_MASK 0xFF
85#define ASYNC_TRAILER_EVENT_TYPE_SHIFT 16
86#define ASYNC_TRAILER_EVENT_TYPE_MASK 0xFF
85#define ASYNC_EVENT_CODE_LINK_STATE 0x1 87#define ASYNC_EVENT_CODE_LINK_STATE 0x1
88#define ASYNC_EVENT_CODE_GRP_5 0x5
89#define ASYNC_EVENT_QOS_SPEED 0x1
90#define ASYNC_EVENT_COS_PRIORITY 0x2
86struct be_async_event_trailer { 91struct be_async_event_trailer {
87 u32 code; 92 u32 code;
88}; 93};
@@ -105,6 +110,30 @@ struct be_async_event_link_state {
105 struct be_async_event_trailer trailer; 110 struct be_async_event_trailer trailer;
106} __packed; 111} __packed;
107 112
113/* When the event code of an async trailer is GRP-5 and event_type is QOS_SPEED
114 * the mcc_compl must be interpreted as follows
115 */
116struct be_async_event_grp5_qos_link_speed {
117 u8 physical_port;
118 u8 rsvd[5];
119 u16 qos_link_speed;
120 u32 event_tag;
121 struct be_async_event_trailer trailer;
122} __packed;
123
124/* When the event code of an async trailer is GRP5 and event type is
125 * CoS-Priority, the mcc_compl must be interpreted as follows
126 */
127struct be_async_event_grp5_cos_priority {
128 u8 physical_port;
129 u8 available_priority_bmap;
130 u8 reco_default_priority;
131 u8 valid;
132 u8 rsvd0;
133 u8 event_tag;
134 struct be_async_event_trailer trailer;
135} __packed;
136
108struct be_mcc_mailbox { 137struct be_mcc_mailbox {
109 struct be_mcc_wrb wrb; 138 struct be_mcc_wrb wrb;
110 struct be_mcc_compl compl; 139 struct be_mcc_compl compl;
@@ -123,8 +152,9 @@ struct be_mcc_mailbox {
123#define OPCODE_COMMON_WRITE_FLASHROM 7 152#define OPCODE_COMMON_WRITE_FLASHROM 7
124#define OPCODE_COMMON_CQ_CREATE 12 153#define OPCODE_COMMON_CQ_CREATE 12
125#define OPCODE_COMMON_EQ_CREATE 13 154#define OPCODE_COMMON_EQ_CREATE 13
126#define OPCODE_COMMON_MCC_CREATE 21 155#define OPCODE_COMMON_MCC_CREATE 21
127#define OPCODE_COMMON_SET_QOS 28 156#define OPCODE_COMMON_SET_QOS 28
157#define OPCODE_COMMON_MCC_CREATE_EXT 90
128#define OPCODE_COMMON_SEEPROM_READ 30 158#define OPCODE_COMMON_SEEPROM_READ 30
129#define OPCODE_COMMON_NTWK_RX_FILTER 34 159#define OPCODE_COMMON_NTWK_RX_FILTER 34
130#define OPCODE_COMMON_GET_FW_VERSION 35 160#define OPCODE_COMMON_GET_FW_VERSION 35
@@ -338,6 +368,7 @@ struct be_cmd_req_mcc_create {
338 struct be_cmd_req_hdr hdr; 368 struct be_cmd_req_hdr hdr;
339 u16 num_pages; 369 u16 num_pages;
340 u16 rsvd0; 370 u16 rsvd0;
371 u32 async_event_bitmap[1];
341 u8 context[sizeof(struct amap_mcc_context) / 8]; 372 u8 context[sizeof(struct amap_mcc_context) / 8];
342 struct phys_addr pages[8]; 373 struct phys_addr pages[8];
343} __packed; 374} __packed;
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index d5e796832fdd..45b1f6635282 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -429,9 +429,12 @@ static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len)
429 wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK; 429 wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK;
430} 430}
431 431
432static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb, 432static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr,
433 u32 wrb_cnt, u32 len) 433 struct sk_buff *skb, u32 wrb_cnt, u32 len)
434{ 434{
435 u8 vlan_prio = 0;
436 u16 vlan_tag = 0;
437
435 memset(hdr, 0, sizeof(*hdr)); 438 memset(hdr, 0, sizeof(*hdr));
436 439
437 AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1); 440 AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1);
@@ -449,10 +452,15 @@ static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb,
449 AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1); 452 AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1);
450 } 453 }
451 454
452 if (vlan_tx_tag_present(skb)) { 455 if (adapter->vlan_grp && vlan_tx_tag_present(skb)) {
453 AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1); 456 AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1);
454 AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, 457 vlan_tag = vlan_tx_tag_get(skb);
455 hdr, vlan_tx_tag_get(skb)); 458 vlan_prio = (vlan_tag & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
459 /* If vlan priority provided by OS is NOT in available bmap */
460 if (!(adapter->vlan_prio_bmap & (1 << vlan_prio)))
461 vlan_tag = (vlan_tag & ~VLAN_PRIO_MASK) |
462 adapter->recommended_prio;
463 AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, hdr, vlan_tag);
456 } 464 }
457 465
458 AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1); 466 AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1);
@@ -532,7 +540,7 @@ static int make_tx_wrbs(struct be_adapter *adapter,
532 queue_head_inc(txq); 540 queue_head_inc(txq);
533 } 541 }
534 542
535 wrb_fill_hdr(hdr, first_skb, wrb_cnt, copied); 543 wrb_fill_hdr(adapter, hdr, first_skb, wrb_cnt, copied);
536 be_dws_cpu_to_le(hdr, sizeof(*hdr)); 544 be_dws_cpu_to_le(hdr, sizeof(*hdr));
537 545
538 return copied; 546 return copied;