2 * Copyright (C) 2005 - 2009 ServerEngines
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation. The full GNU General
8 * Public License is included in this distribution in the file called COPYING.
10 * Contact Information:
11 * linux-drivers@serverengines.com
14 * 209 N. Fair Oaks Ave
20 void be_mcc_notify(struct be_ctrl_info *ctrl)
22 struct be_queue_info *mccq = &ctrl->mcc_obj.q;
25 val |= mccq->id & DB_MCCQ_RING_ID_MASK;
26 val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
27 iowrite32(val, ctrl->db + DB_MCCQ_OFFSET);
30 /* To check if valid bit is set, check the entire word as we don't know
31 * the endianness of the data (old entry is host endian while a new entry is
33 static inline bool be_mcc_compl_is_new(struct be_mcc_cq_entry *compl)
35 if (compl->flags != 0) {
36 compl->flags = le32_to_cpu(compl->flags);
37 BUG_ON((compl->flags & CQE_FLAGS_VALID_MASK) == 0);
44 /* Need to reset the entire word that houses the valid bit */
45 static inline void be_mcc_compl_use(struct be_mcc_cq_entry *compl)
50 static int be_mcc_compl_process(struct be_ctrl_info *ctrl,
51 struct be_mcc_cq_entry *compl)
53 u16 compl_status, extd_status;
55 /* Just swap the status to host endian; mcc tag is opaquely copied
57 be_dws_le_to_cpu(compl, 4);
59 compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) &
60 CQE_STATUS_COMPL_MASK;
61 if (compl_status != MCC_STATUS_SUCCESS) {
62 extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
64 printk(KERN_WARNING DRV_NAME
65 " error in cmd completion: status(compl/extd)=%d/%d\n",
66 compl_status, extd_status);
73 static struct be_mcc_cq_entry *be_mcc_compl_get(struct be_ctrl_info *ctrl)
75 struct be_queue_info *mcc_cq = &ctrl->mcc_obj.cq;
76 struct be_mcc_cq_entry *compl = queue_tail_node(mcc_cq);
78 if (be_mcc_compl_is_new(compl)) {
79 queue_tail_inc(mcc_cq);
85 void be_process_mcc(struct be_ctrl_info *ctrl)
87 struct be_mcc_cq_entry *compl;
90 spin_lock_bh(&ctrl->mcc_cq_lock);
91 while ((compl = be_mcc_compl_get(ctrl))) {
92 if (!(compl->flags & CQE_FLAGS_ASYNC_MASK)) {
93 be_mcc_compl_process(ctrl, compl);
94 atomic_dec(&ctrl->mcc_obj.q.used);
96 be_mcc_compl_use(compl);
100 be_cq_notify(ctrl, ctrl->mcc_obj.cq.id, true, num);
101 spin_unlock_bh(&ctrl->mcc_cq_lock);
104 static int be_mbox_db_ready_wait(void __iomem *db)
106 int cnt = 0, wait = 5;
110 ready = ioread32(db) & MPU_MAILBOX_DB_RDY_MASK;
115 printk(KERN_WARNING DRV_NAME
116 ": mbox_db poll timed out\n");
130 * Insert the mailbox address into the doorbell in two steps
131 * Polls on the mbox doorbell till a command completion (or a timeout) occurs
133 static int be_mbox_db_ring(struct be_ctrl_info *ctrl)
137 void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET;
138 struct be_dma_mem *mbox_mem = &ctrl->mbox_mem;
139 struct be_mcc_mailbox *mbox = mbox_mem->va;
140 struct be_mcc_cq_entry *cqe = &mbox->cqe;
142 memset(cqe, 0, sizeof(*cqe));
144 val &= ~MPU_MAILBOX_DB_RDY_MASK;
145 val |= MPU_MAILBOX_DB_HI_MASK;
146 /* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */
147 val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
150 /* wait for ready to be set */
151 status = be_mbox_db_ready_wait(db);
156 val &= ~MPU_MAILBOX_DB_RDY_MASK;
157 val &= ~MPU_MAILBOX_DB_HI_MASK;
158 /* at bits 2 - 31 place mbox dma addr lsb bits 4 - 33 */
159 val |= (u32)(mbox_mem->dma >> 4) << 2;
162 status = be_mbox_db_ready_wait(db);
166 /* A cq entry has been made now */
167 if (be_mcc_compl_is_new(cqe)) {
168 status = be_mcc_compl_process(ctrl, &mbox->cqe);
169 be_mcc_compl_use(cqe);
173 printk(KERN_WARNING DRV_NAME "invalid mailbox completion\n");
179 static int be_POST_stage_get(struct be_ctrl_info *ctrl, u16 *stage)
181 u32 sem = ioread32(ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
183 *stage = sem & EP_SEMAPHORE_POST_STAGE_MASK;
184 if ((sem >> EP_SEMAPHORE_POST_ERR_SHIFT) & EP_SEMAPHORE_POST_ERR_MASK)
190 static int be_POST_stage_poll(struct be_ctrl_info *ctrl, u16 poll_stage)
192 u16 stage, cnt, error;
193 for (cnt = 0; cnt < 5000; cnt++) {
194 error = be_POST_stage_get(ctrl, &stage);
198 if (stage == poll_stage)
202 if (stage != poll_stage)
208 int be_cmd_POST(struct be_ctrl_info *ctrl)
212 error = be_POST_stage_get(ctrl, &stage);
216 if (stage == POST_STAGE_ARMFW_RDY)
219 if (stage != POST_STAGE_AWAITING_HOST_RDY)
222 /* On awaiting host rdy, reset and again poll on awaiting host rdy */
223 iowrite32(POST_STAGE_BE_RESET, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
224 error = be_POST_stage_poll(ctrl, POST_STAGE_AWAITING_HOST_RDY);
228 /* Now kickoff POST and poll on armfw ready */
229 iowrite32(POST_STAGE_HOST_RDY, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
230 error = be_POST_stage_poll(ctrl, POST_STAGE_ARMFW_RDY);
236 printk(KERN_WARNING DRV_NAME ": ERROR, stage=%d\n", stage);
240 static inline void *embedded_payload(struct be_mcc_wrb *wrb)
242 return wrb->payload.embedded_payload;
245 static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
247 return &wrb->payload.sgl[0];
250 /* Don't touch the hdr after it's prepared */
251 static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
252 bool embedded, u8 sge_cnt)
255 wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
257 wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
258 MCC_WRB_SGE_CNT_SHIFT;
259 wrb->payload_length = payload_len;
260 be_dws_cpu_to_le(wrb, 20);
263 /* Don't touch the hdr after it's prepared */
264 static void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
265 u8 subsystem, u8 opcode, int cmd_len)
267 req_hdr->opcode = opcode;
268 req_hdr->subsystem = subsystem;
269 req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
272 static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
273 struct be_dma_mem *mem)
275 int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
276 u64 dma = (u64)mem->dma;
278 for (i = 0; i < buf_pages; i++) {
279 pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF);
280 pages[i].hi = cpu_to_le32(upper_32_bits(dma));
285 /* Converts interrupt delay in microseconds to multiplier value */
286 static u32 eq_delay_to_mult(u32 usec_delay)
288 #define MAX_INTR_RATE 651042
289 const u32 round = 10;
295 u32 interrupt_rate = 1000000 / usec_delay;
296 /* Max delay, corresponding to the lowest interrupt rate */
297 if (interrupt_rate == 0)
300 multiplier = (MAX_INTR_RATE - interrupt_rate) * round;
301 multiplier /= interrupt_rate;
302 /* Round the multiplier to the closest value.*/
303 multiplier = (multiplier + round/2) / round;
304 multiplier = min(multiplier, (u32)1023);
310 static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem)
312 return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
315 static inline struct be_mcc_wrb *wrb_from_mcc(struct be_queue_info *mccq)
317 struct be_mcc_wrb *wrb = NULL;
318 if (atomic_read(&mccq->used) < mccq->len) {
319 wrb = queue_head_node(mccq);
320 queue_head_inc(mccq);
321 atomic_inc(&mccq->used);
322 memset(wrb, 0, sizeof(*wrb));
327 int be_cmd_eq_create(struct be_ctrl_info *ctrl,
328 struct be_queue_info *eq, int eq_delay)
330 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
331 struct be_cmd_req_eq_create *req = embedded_payload(wrb);
332 struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
333 struct be_dma_mem *q_mem = &eq->dma_mem;
336 spin_lock(&ctrl->mbox_lock);
337 memset(wrb, 0, sizeof(*wrb));
339 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
341 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
342 OPCODE_COMMON_EQ_CREATE, sizeof(*req));
344 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
346 AMAP_SET_BITS(struct amap_eq_context, func, req->context,
348 AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1);
350 AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0);
351 AMAP_SET_BITS(struct amap_eq_context, count, req->context,
352 __ilog2_u32(eq->len/256));
353 AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context,
354 eq_delay_to_mult(eq_delay));
355 be_dws_cpu_to_le(req->context, sizeof(req->context));
357 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
359 status = be_mbox_db_ring(ctrl);
361 eq->id = le16_to_cpu(resp->eq_id);
364 spin_unlock(&ctrl->mbox_lock);
368 int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr,
369 u8 type, bool permanent, u32 if_handle)
371 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
372 struct be_cmd_req_mac_query *req = embedded_payload(wrb);
373 struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
376 spin_lock(&ctrl->mbox_lock);
377 memset(wrb, 0, sizeof(*wrb));
379 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
381 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
382 OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req));
388 req->if_id = cpu_to_le16((u16)if_handle);
392 status = be_mbox_db_ring(ctrl);
394 memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
396 spin_unlock(&ctrl->mbox_lock);
400 int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr,
401 u32 if_id, u32 *pmac_id)
403 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
404 struct be_cmd_req_pmac_add *req = embedded_payload(wrb);
407 spin_lock(&ctrl->mbox_lock);
408 memset(wrb, 0, sizeof(*wrb));
410 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
412 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
413 OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req));
415 req->if_id = cpu_to_le32(if_id);
416 memcpy(req->mac_address, mac_addr, ETH_ALEN);
418 status = be_mbox_db_ring(ctrl);
420 struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb);
421 *pmac_id = le32_to_cpu(resp->pmac_id);
424 spin_unlock(&ctrl->mbox_lock);
428 int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id)
430 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
431 struct be_cmd_req_pmac_del *req = embedded_payload(wrb);
434 spin_lock(&ctrl->mbox_lock);
435 memset(wrb, 0, sizeof(*wrb));
437 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
439 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
440 OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req));
442 req->if_id = cpu_to_le32(if_id);
443 req->pmac_id = cpu_to_le32(pmac_id);
445 status = be_mbox_db_ring(ctrl);
446 spin_unlock(&ctrl->mbox_lock);
451 int be_cmd_cq_create(struct be_ctrl_info *ctrl,
452 struct be_queue_info *cq, struct be_queue_info *eq,
453 bool sol_evts, bool no_delay, int coalesce_wm)
455 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
456 struct be_cmd_req_cq_create *req = embedded_payload(wrb);
457 struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
458 struct be_dma_mem *q_mem = &cq->dma_mem;
459 void *ctxt = &req->context;
462 spin_lock(&ctrl->mbox_lock);
463 memset(wrb, 0, sizeof(*wrb));
465 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
467 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
468 OPCODE_COMMON_CQ_CREATE, sizeof(*req));
470 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
472 AMAP_SET_BITS(struct amap_cq_context, coalescwm, ctxt, coalesce_wm);
473 AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay);
474 AMAP_SET_BITS(struct amap_cq_context, count, ctxt,
475 __ilog2_u32(cq->len/256));
476 AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1);
477 AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts);
478 AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1);
479 AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id);
480 AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 1);
481 AMAP_SET_BITS(struct amap_cq_context, func, ctxt, ctrl->pci_func);
482 be_dws_cpu_to_le(ctxt, sizeof(req->context));
484 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
486 status = be_mbox_db_ring(ctrl);
488 cq->id = le16_to_cpu(resp->cq_id);
491 spin_unlock(&ctrl->mbox_lock);
496 static u32 be_encoded_q_len(int q_len)
498 u32 len_encoded = fls(q_len); /* log2(len) + 1 */
499 if (len_encoded == 16)
504 int be_cmd_mccq_create(struct be_ctrl_info *ctrl,
505 struct be_queue_info *mccq,
506 struct be_queue_info *cq)
508 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
509 struct be_cmd_req_mcc_create *req = embedded_payload(wrb);
510 struct be_dma_mem *q_mem = &mccq->dma_mem;
511 void *ctxt = &req->context;
514 spin_lock(&ctrl->mbox_lock);
515 memset(wrb, 0, sizeof(*wrb));
517 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
519 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
520 OPCODE_COMMON_MCC_CREATE, sizeof(*req));
522 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
524 AMAP_SET_BITS(struct amap_mcc_context, fid, ctxt, ctrl->pci_func);
525 AMAP_SET_BITS(struct amap_mcc_context, valid, ctxt, 1);
526 AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
527 be_encoded_q_len(mccq->len));
528 AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
530 be_dws_cpu_to_le(ctxt, sizeof(req->context));
532 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
534 status = be_mbox_db_ring(ctrl);
536 struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb);
537 mccq->id = le16_to_cpu(resp->id);
538 mccq->created = true;
540 spin_unlock(&ctrl->mbox_lock);
545 int be_cmd_txq_create(struct be_ctrl_info *ctrl,
546 struct be_queue_info *txq,
547 struct be_queue_info *cq)
549 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
550 struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb);
551 struct be_dma_mem *q_mem = &txq->dma_mem;
552 void *ctxt = &req->context;
556 spin_lock(&ctrl->mbox_lock);
557 memset(wrb, 0, sizeof(*wrb));
559 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
561 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_TX_CREATE,
564 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
565 req->ulp_num = BE_ULP1_NUM;
566 req->type = BE_ETH_TX_RING_TYPE_STANDARD;
568 len_encoded = fls(txq->len); /* log2(len) + 1 */
569 if (len_encoded == 16)
571 AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded);
572 AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt,
574 AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
575 AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id);
577 be_dws_cpu_to_le(ctxt, sizeof(req->context));
579 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
581 status = be_mbox_db_ring(ctrl);
583 struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
584 txq->id = le16_to_cpu(resp->cid);
587 spin_unlock(&ctrl->mbox_lock);
592 int be_cmd_rxq_create(struct be_ctrl_info *ctrl,
593 struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
594 u16 max_frame_size, u32 if_id, u32 rss)
596 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
597 struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb);
598 struct be_dma_mem *q_mem = &rxq->dma_mem;
601 spin_lock(&ctrl->mbox_lock);
602 memset(wrb, 0, sizeof(*wrb));
604 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
606 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_CREATE,
609 req->cq_id = cpu_to_le16(cq_id);
610 req->frag_size = fls(frag_size) - 1;
612 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
613 req->interface_id = cpu_to_le32(if_id);
614 req->max_frame_size = cpu_to_le16(max_frame_size);
615 req->rss_queue = cpu_to_le32(rss);
617 status = be_mbox_db_ring(ctrl);
619 struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
620 rxq->id = le16_to_cpu(resp->id);
623 spin_unlock(&ctrl->mbox_lock);
628 /* Generic destroyer function for all types of queues */
629 int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
632 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
633 struct be_cmd_req_q_destroy *req = embedded_payload(wrb);
634 u8 subsys = 0, opcode = 0;
637 spin_lock(&ctrl->mbox_lock);
639 memset(wrb, 0, sizeof(*wrb));
640 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
642 switch (queue_type) {
644 subsys = CMD_SUBSYSTEM_COMMON;
645 opcode = OPCODE_COMMON_EQ_DESTROY;
648 subsys = CMD_SUBSYSTEM_COMMON;
649 opcode = OPCODE_COMMON_CQ_DESTROY;
652 subsys = CMD_SUBSYSTEM_ETH;
653 opcode = OPCODE_ETH_TX_DESTROY;
656 subsys = CMD_SUBSYSTEM_ETH;
657 opcode = OPCODE_ETH_RX_DESTROY;
660 subsys = CMD_SUBSYSTEM_COMMON;
661 opcode = OPCODE_COMMON_MCC_DESTROY;
664 printk(KERN_WARNING DRV_NAME ":bad Q type in Q destroy cmd\n");
668 be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
669 req->id = cpu_to_le16(q->id);
671 status = be_mbox_db_ring(ctrl);
673 spin_unlock(&ctrl->mbox_lock);
678 /* Create an rx filtering policy configuration on an i/f */
679 int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 flags, u8 *mac,
680 bool pmac_invalid, u32 *if_handle, u32 *pmac_id)
682 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
683 struct be_cmd_req_if_create *req = embedded_payload(wrb);
686 spin_lock(&ctrl->mbox_lock);
687 memset(wrb, 0, sizeof(*wrb));
689 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
691 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
692 OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req));
694 req->capability_flags = cpu_to_le32(flags);
695 req->enable_flags = cpu_to_le32(flags);
697 memcpy(req->mac_addr, mac, ETH_ALEN);
699 status = be_mbox_db_ring(ctrl);
701 struct be_cmd_resp_if_create *resp = embedded_payload(wrb);
702 *if_handle = le32_to_cpu(resp->interface_id);
704 *pmac_id = le32_to_cpu(resp->pmac_id);
707 spin_unlock(&ctrl->mbox_lock);
711 int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 interface_id)
713 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
714 struct be_cmd_req_if_destroy *req = embedded_payload(wrb);
717 spin_lock(&ctrl->mbox_lock);
718 memset(wrb, 0, sizeof(*wrb));
720 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
722 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
723 OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req));
725 req->interface_id = cpu_to_le32(interface_id);
726 status = be_mbox_db_ring(ctrl);
728 spin_unlock(&ctrl->mbox_lock);
733 /* Get stats is a non embedded command: the request is not embedded inside
734 * WRB but is a separate dma memory block
736 int be_cmd_get_stats(struct be_ctrl_info *ctrl, struct be_dma_mem *nonemb_cmd)
738 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
739 struct be_cmd_req_get_stats *req = nonemb_cmd->va;
740 struct be_sge *sge = nonembedded_sgl(wrb);
743 spin_lock(&ctrl->mbox_lock);
744 memset(wrb, 0, sizeof(*wrb));
746 memset(req, 0, sizeof(*req));
748 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
750 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
751 OPCODE_ETH_GET_STATISTICS, sizeof(*req));
752 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
753 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
754 sge->len = cpu_to_le32(nonemb_cmd->size);
756 status = be_mbox_db_ring(ctrl);
758 struct be_cmd_resp_get_stats *resp = nonemb_cmd->va;
759 be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats));
762 spin_unlock(&ctrl->mbox_lock);
766 int be_cmd_link_status_query(struct be_ctrl_info *ctrl,
767 struct be_link_info *link)
769 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
770 struct be_cmd_req_link_status *req = embedded_payload(wrb);
773 spin_lock(&ctrl->mbox_lock);
774 memset(wrb, 0, sizeof(*wrb));
776 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
778 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
779 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req));
781 status = be_mbox_db_ring(ctrl);
783 struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
784 link->speed = resp->mac_speed;
785 link->duplex = resp->mac_duplex;
786 link->fault = resp->mac_fault;
788 link->speed = PHY_LINK_SPEED_ZERO;
791 spin_unlock(&ctrl->mbox_lock);
795 int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver)
797 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
798 struct be_cmd_req_get_fw_version *req = embedded_payload(wrb);
801 spin_lock(&ctrl->mbox_lock);
802 memset(wrb, 0, sizeof(*wrb));
804 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
806 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
807 OPCODE_COMMON_GET_FW_VERSION, sizeof(*req));
809 status = be_mbox_db_ring(ctrl);
811 struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
812 strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
815 spin_unlock(&ctrl->mbox_lock);
819 /* set the EQ delay interval of an EQ to specified value */
820 int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd)
822 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
823 struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb);
826 spin_lock(&ctrl->mbox_lock);
827 memset(wrb, 0, sizeof(*wrb));
829 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
831 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
832 OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req));
834 req->num_eq = cpu_to_le32(1);
835 req->delay[0].eq_id = cpu_to_le32(eq_id);
836 req->delay[0].phase = 0;
837 req->delay[0].delay_multiplier = cpu_to_le32(eqd);
839 status = be_mbox_db_ring(ctrl);
841 spin_unlock(&ctrl->mbox_lock);
845 int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id, u16 *vtag_array,
846 u32 num, bool untagged, bool promiscuous)
848 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
849 struct be_cmd_req_vlan_config *req = embedded_payload(wrb);
852 spin_lock(&ctrl->mbox_lock);
853 memset(wrb, 0, sizeof(*wrb));
855 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
857 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
858 OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req));
860 req->interface_id = if_id;
861 req->promiscuous = promiscuous;
862 req->untagged = untagged;
865 memcpy(req->normal_vlan, vtag_array,
866 req->num_vlan * sizeof(vtag_array[0]));
869 status = be_mbox_db_ring(ctrl);
871 spin_unlock(&ctrl->mbox_lock);
875 int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl, u8 port_num, bool en)
877 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
878 struct be_cmd_req_promiscuous_config *req = embedded_payload(wrb);
881 spin_lock(&ctrl->mbox_lock);
882 memset(wrb, 0, sizeof(*wrb));
884 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
886 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
887 OPCODE_ETH_PROMISCUOUS, sizeof(*req));
890 req->port1_promiscuous = en;
892 req->port0_promiscuous = en;
894 status = be_mbox_db_ring(ctrl);
896 spin_unlock(&ctrl->mbox_lock);
900 int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id, u8 *mac_table,
901 u32 num, bool promiscuous)
903 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
904 struct be_cmd_req_mcast_mac_config *req = embedded_payload(wrb);
907 spin_lock(&ctrl->mbox_lock);
908 memset(wrb, 0, sizeof(*wrb));
910 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
912 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
913 OPCODE_COMMON_NTWK_MULTICAST_SET, sizeof(*req));
915 req->interface_id = if_id;
916 req->promiscuous = promiscuous;
918 req->num_mac = cpu_to_le16(num);
920 memcpy(req->mac, mac_table, ETH_ALEN * num);
923 status = be_mbox_db_ring(ctrl);
925 spin_unlock(&ctrl->mbox_lock);
929 int be_cmd_set_flow_control(struct be_ctrl_info *ctrl, u32 tx_fc, u32 rx_fc)
931 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
932 struct be_cmd_req_set_flow_control *req = embedded_payload(wrb);
935 spin_lock(&ctrl->mbox_lock);
937 memset(wrb, 0, sizeof(*wrb));
939 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
941 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
942 OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req));
944 req->tx_flow_control = cpu_to_le16((u16)tx_fc);
945 req->rx_flow_control = cpu_to_le16((u16)rx_fc);
947 status = be_mbox_db_ring(ctrl);
949 spin_unlock(&ctrl->mbox_lock);
953 int be_cmd_get_flow_control(struct be_ctrl_info *ctrl, u32 *tx_fc, u32 *rx_fc)
955 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
956 struct be_cmd_req_get_flow_control *req = embedded_payload(wrb);
959 spin_lock(&ctrl->mbox_lock);
961 memset(wrb, 0, sizeof(*wrb));
963 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
965 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
966 OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req));
968 status = be_mbox_db_ring(ctrl);
970 struct be_cmd_resp_get_flow_control *resp =
971 embedded_payload(wrb);
972 *tx_fc = le16_to_cpu(resp->tx_flow_control);
973 *rx_fc = le16_to_cpu(resp->rx_flow_control);
976 spin_unlock(&ctrl->mbox_lock);
980 int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num)
982 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
983 struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb);
986 spin_lock(&ctrl->mbox_lock);
988 memset(wrb, 0, sizeof(*wrb));
990 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
992 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
993 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
995 status = be_mbox_db_ring(ctrl);
997 struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
998 *port_num = le32_to_cpu(resp->phys_port);
1001 spin_unlock(&ctrl->mbox_lock);