|
@@ -96,6 +96,50 @@ static void be_async_link_state_process(struct be_adapter *adapter,
|
|
evt->port_link_status == ASYNC_EVENT_LINK_UP);
|
|
evt->port_link_status == ASYNC_EVENT_LINK_UP);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Grp5 CoS Priority evt */
|
|
|
|
+static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
|
|
|
|
+ struct be_async_event_grp5_cos_priority *evt)
|
|
|
|
+{
|
|
|
|
+ if (evt->valid) {
|
|
|
|
+ adapter->vlan_prio_bmap = evt->available_priority_bmap;
|
|
|
|
+ adapter->recommended_prio =
|
|
|
|
+ evt->reco_default_priority << VLAN_PRIO_SHIFT;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Grp5 QOS Speed evt */
|
|
|
|
+static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
|
|
|
|
+ struct be_async_event_grp5_qos_link_speed *evt)
|
|
|
|
+{
|
|
|
|
+ if (evt->physical_port == adapter->port_num) {
|
|
|
|
+ /* qos_link_speed is in units of 10 Mbps */
|
|
|
|
+ adapter->link_speed = evt->qos_link_speed * 10;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void be_async_grp5_evt_process(struct be_adapter *adapter,
|
|
|
|
+ u32 trailer, struct be_mcc_compl *evt)
|
|
|
|
+{
|
|
|
|
+ u8 event_type = 0;
|
|
|
|
+
|
|
|
|
+ event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
|
|
|
|
+ ASYNC_TRAILER_EVENT_TYPE_MASK;
|
|
|
|
+
|
|
|
|
+ switch (event_type) {
|
|
|
|
+ case ASYNC_EVENT_COS_PRIORITY:
|
|
|
|
+ be_async_grp5_cos_priority_process(adapter,
|
|
|
|
+ (struct be_async_event_grp5_cos_priority *)evt);
|
|
|
|
+ break;
|
|
|
|
+ case ASYNC_EVENT_QOS_SPEED:
|
|
|
|
+ be_async_grp5_qos_speed_process(adapter,
|
|
|
|
+ (struct be_async_event_grp5_qos_link_speed *)evt);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ dev_warn(&adapter->pdev->dev, "Unknown grp5 event!\n");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static inline bool is_link_state_evt(u32 trailer)
|
|
static inline bool is_link_state_evt(u32 trailer)
|
|
{
|
|
{
|
|
return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
|
|
return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
|
|
@@ -103,6 +147,13 @@ static inline bool is_link_state_evt(u32 trailer)
|
|
ASYNC_EVENT_CODE_LINK_STATE;
|
|
ASYNC_EVENT_CODE_LINK_STATE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline bool is_grp5_evt(u32 trailer)
|
|
|
|
+{
|
|
|
|
+ return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
|
|
|
|
+ ASYNC_TRAILER_EVENT_CODE_MASK) ==
|
|
|
|
+ ASYNC_EVENT_CODE_GRP_5);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
|
|
static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
|
|
{
|
|
{
|
|
struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq;
|
|
struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq;
|
|
@@ -143,6 +194,9 @@ int be_process_mcc(struct be_adapter *adapter, int *status)
|
|
if (is_link_state_evt(compl->flags))
|
|
if (is_link_state_evt(compl->flags))
|
|
be_async_link_state_process(adapter,
|
|
be_async_link_state_process(adapter,
|
|
(struct be_async_event_link_state *) compl);
|
|
(struct be_async_event_link_state *) compl);
|
|
|
|
+ else if (is_grp5_evt(compl->flags))
|
|
|
|
+ be_async_grp5_evt_process(adapter,
|
|
|
|
+ compl->flags, compl);
|
|
} else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
|
|
} else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
|
|
*status = be_mcc_compl_process(adapter, compl);
|
|
*status = be_mcc_compl_process(adapter, compl);
|
|
atomic_dec(&mcc_obj->q.used);
|
|
atomic_dec(&mcc_obj->q.used);
|
|
@@ -677,10 +731,10 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|
ctxt = &req->context;
|
|
ctxt = &req->context;
|
|
|
|
|
|
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
|
|
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
|
|
- OPCODE_COMMON_MCC_CREATE);
|
|
|
|
|
|
+ OPCODE_COMMON_MCC_CREATE_EXT);
|
|
|
|
|
|
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_MCC_CREATE, sizeof(*req));
|
|
|
|
|
|
+ OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req));
|
|
|
|
|
|
req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
|
|
req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
|
|
|
|
|
|
@@ -688,7 +742,8 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
|
|
AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
|
|
AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
|
|
be_encoded_q_len(mccq->len));
|
|
be_encoded_q_len(mccq->len));
|
|
AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
|
|
AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
|
|
-
|
|
|
|
|
|
+ /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */
|
|
|
|
+ req->async_event_bitmap[0] |= 0x00000022;
|
|
be_dws_cpu_to_le(ctxt, sizeof(req->context));
|
|
be_dws_cpu_to_le(ctxt, sizeof(req->context));
|
|
|
|
|
|
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
|
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|