diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/benet/be.h | 2 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.c | 61 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 33 | ||||
-rw-r--r-- | drivers/net/benet/be_main.c | 20 |
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 */ | ||
100 | static 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 */ | ||
111 | static 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 | |||
120 | static 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 | |||
99 | static inline bool is_link_state_evt(u32 trailer) | 143 | static 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 | ||
150 | static 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 | |||
106 | static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter) | 157 | static 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 | ||
86 | struct be_async_event_trailer { | 91 | struct 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 | */ | ||
116 | struct 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 | */ | ||
127 | struct 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 | |||
108 | struct be_mcc_mailbox { | 137 | struct 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 | ||
432 | static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb, | 432 | static 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; |